From 86714229b4db1820e712d91e4564aa9e61951550 Mon Sep 17 00:00:00 2001 From: Pavol Franek <> Date: Sat, 29 Feb 2020 10:28:54 +0100 Subject: [PATCH 1/4] - wip: app crash when gson can not deserialize note --- .../notes/pro/activities/MainActivity.kt | 22 +++++------ .../pro/activities/WidgetConfigureActivity.kt | 2 +- .../notes/pro/adapters/NotesPagerAdapter.kt | 4 +- .../notes/pro/adapters/WidgetAdapter.kt | 6 +-- .../notes/pro/databases/NotesDatabase.kt | 4 +- .../notes/pro/dialogs/ImportFolderDialog.kt | 9 ++--- .../notes/pro/dialogs/NewNoteDialog.kt | 7 ++-- .../notes/pro/dialogs/OpenFileDialog.kt | 4 +- .../notes/pro/extensions/Fragment.kt | 3 ++ .../notes/pro/fragments/ChecklistFragment.kt | 38 +++++++++++++++---- .../notes/pro/helpers/Config.kt | 2 +- .../notes/pro/helpers/Constants.kt | 3 +- .../notes/pro/helpers/NotesHelper.kt | 2 +- 13 files changed, 65 insertions(+), 41 deletions(-) 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 93d5aed7..b0a82912 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 @@ -99,8 +99,8 @@ class MainActivity : SimpleActivity() { override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu, menu) menu.apply { - findItem(R.id.undo).isVisible = showUndoButton && mCurrentNote.type == TYPE_TEXT - findItem(R.id.redo).isVisible = showRedoButton && mCurrentNote.type == TYPE_TEXT + findItem(R.id.undo).isVisible = showUndoButton && mCurrentNote.type == NoteType.TYPE_TEXT.value + findItem(R.id.redo).isVisible = showRedoButton && mCurrentNote.type == NoteType.TYPE_TEXT.value } updateMenuItemColors(menu) @@ -116,7 +116,7 @@ class MainActivity : SimpleActivity() { findItem(R.id.export_all_notes).isVisible = shouldBeVisible saveNoteButton = findItem(R.id.save_note) - saveNoteButton!!.isVisible = !config.autosaveNotes && showSaveButton && mCurrentNote.type == TYPE_TEXT + saveNoteButton!!.isVisible = !config.autosaveNotes && showSaveButton && mCurrentNote.type == NoteType.TYPE_TEXT.value } pager_title_strip.beVisibleIf(shouldBeVisible) @@ -274,7 +274,7 @@ class MainActivity : SimpleActivity() { } } - if (!config.showKeyboard || mCurrentNote.type == TYPE_CHECKLIST) { + if (!config.showKeyboard || mCurrentNote.type == NoteType.TYPE_CHECKLIST.value) { hideKeyboard() } } @@ -361,7 +361,7 @@ class MainActivity : SimpleActivity() { val fileText = it.readText().trim() val checklistItems = fileText.parseChecklistItems() if (checklistItems != null) { - val note = Note(null, it.absolutePath.getFilenameFromPath().substringBeforeLast('.'), fileText, TYPE_CHECKLIST) + val note = Note(null, it.absolutePath.getFilenameFromPath().substringBeforeLast('.'), fileText, NoteType.TYPE_CHECKLIST.value) addNewNote(note) } else { runOnUiThread { @@ -416,9 +416,9 @@ class MainActivity : SimpleActivity() { val fileText = it.readText().trim() val checklistItems = fileText.parseChecklistItems() val note = if (checklistItems != null) { - Note(null, title.substringBeforeLast('.'), fileText, TYPE_CHECKLIST) + Note(null, title.substringBeforeLast('.'), fileText, NoteType.TYPE_CHECKLIST.value) } else { - Note(null, title, "", TYPE_TEXT, path) + Note(null, title, "", NoteType.TYPE_TEXT.value, path) } if (mNotes.any { it.title.equals(note.title, true) }) { @@ -464,10 +464,10 @@ class MainActivity : SimpleActivity() { private fun exportAsFile() { ExportFileDialog(this, mCurrentNote) { - val textToExport = if (mCurrentNote.type == TYPE_TEXT) getCurrentNoteText() else mCurrentNote.value + val textToExport = if (mCurrentNote.type == NoteType.TYPE_TEXT.value) getCurrentNoteText() else mCurrentNote.value if (textToExport == null || textToExport.isEmpty()) { toast(R.string.unknown_error_occurred) - } else if (mCurrentNote.type == TYPE_TEXT) { + } else if (mCurrentNote.type == NoteType.TYPE_TEXT.value) { showExportFilePickUpdateDialog(it, textToExport) } else { tryExportNoteValueToFile(it, textToExport, true) @@ -626,7 +626,7 @@ class MainActivity : SimpleActivity() { private fun saveCurrentNote(force: Boolean) { getPagerAdapter().saveCurrentNote(view_pager.currentItem, force) - if (mCurrentNote.type == TYPE_CHECKLIST) { + if (mCurrentNote.type == NoteType.TYPE_CHECKLIST.value) { mCurrentNote.value = getPagerAdapter().getNoteChecklistItems(view_pager.currentItem) ?: "" } } @@ -712,7 +712,7 @@ class MainActivity : SimpleActivity() { } private fun shareText() { - val text = if (mCurrentNote.type == TYPE_TEXT) getCurrentNoteText() else mCurrentNote.value + val text = if (mCurrentNote.type == NoteType.TYPE_TEXT.value) getCurrentNoteText() else mCurrentNote.value if (text == null || text.isEmpty()) { toast(R.string.cannot_share_empty_text) return 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 c3d97304..079a4296 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 @@ -122,7 +122,7 @@ class WidgetConfigureActivity : SimpleActivity() { private fun updateCurrentNote(note: Note) { mCurrentNoteId = note.id!! notes_picker_value.text = note.title - if (note.type == TYPE_CHECKLIST) { + if (note.type == NoteType.TYPE_CHECKLIST.value) { val checklistItemType = object : TypeToken>() {}.type val items = Gson().fromJson>(note.value, checklistItemType) ?: ArrayList(1) items.apply { 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 8e5bbe53..e7fe6a36 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 @@ -10,7 +10,7 @@ import com.simplemobiletools.notes.pro.fragments.ChecklistFragment 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.TYPE_TEXT +import com.simplemobiletools.notes.pro.helpers.NoteType import com.simplemobiletools.notes.pro.models.Note class NotesPagerAdapter(fm: FragmentManager, val notes: List, val activity: Activity) : FragmentStatePagerAdapter(fm) { @@ -30,7 +30,7 @@ class NotesPagerAdapter(fm: FragmentManager, val notes: List, val activity return fragments[position]!! } - val fragment = if (note.type == TYPE_TEXT) TextFragment() else ChecklistFragment() + val fragment = if (note.type == NoteType.TYPE_TEXT.value) TextFragment() else ChecklistFragment() fragment.arguments = bundle fragments[position] = fragment return fragment diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/WidgetAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/WidgetAdapter.kt index 05c2278a..d4673236 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/WidgetAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/WidgetAdapter.kt @@ -37,7 +37,7 @@ class WidgetAdapter(val context: Context, val intent: Intent) : RemoteViewsServi } val textSize = context.getTextSize() / context.resources.displayMetrics.density - if (note!!.type == TYPE_CHECKLIST) { + if (note!!.type == NoteType.TYPE_CHECKLIST.value) { remoteView = RemoteViews(context.packageName, R.layout.item_checklist_widget).apply { val checklistItem = checklistItems.getOrNull(position) ?: return@apply setText(checklist_title, checklistItem.title) @@ -91,7 +91,7 @@ class WidgetAdapter(val context: Context, val intent: Intent) : RemoteViewsServi widgetTextColor = intent.getIntExtra(WIDGET_TEXT_COLOR, DEFAULT_WIDGET_TEXT_COLOR) val noteId = intent.getLongExtra(NOTE_ID, 0L) note = context.notesDB.getNoteWithId(noteId) - if (note?.type == TYPE_CHECKLIST) { + if (note?.type == NoteType.TYPE_CHECKLIST.value) { val checklistItemType = object : TypeToken>() {}.type checklistItems = Gson().fromJson>(note!!.value, checklistItemType) ?: ArrayList(1) if (context.config.moveUndoneChecklistItems) { @@ -103,7 +103,7 @@ class WidgetAdapter(val context: Context, val intent: Intent) : RemoteViewsServi override fun hasStableIds() = true override fun getCount(): Int { - return if (note?.type == TYPE_CHECKLIST) { + return if (note?.type == NoteType.TYPE_CHECKLIST.value) { checklistItems.size } else { 1 diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/databases/NotesDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/databases/NotesDatabase.kt index 415691ef..e685c66b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/databases/NotesDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/databases/NotesDatabase.kt @@ -9,7 +9,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase import com.simplemobiletools.commons.helpers.DEFAULT_WIDGET_BG_COLOR import com.simplemobiletools.notes.pro.R import com.simplemobiletools.notes.pro.helpers.DEFAULT_WIDGET_TEXT_COLOR -import com.simplemobiletools.notes.pro.helpers.TYPE_TEXT +import com.simplemobiletools.notes.pro.helpers.NoteType import com.simplemobiletools.notes.pro.interfaces.NotesDao import com.simplemobiletools.notes.pro.interfaces.WidgetsDao import com.simplemobiletools.notes.pro.models.Note @@ -53,7 +53,7 @@ abstract class NotesDatabase : RoomDatabase() { private fun insertFirstNote(context: Context) { Executors.newSingleThreadScheduledExecutor().execute { val generalNote = context.resources.getString(R.string.general_note) - val note = Note(null, generalNote, "", TYPE_TEXT) + val note = Note(null, generalNote, "", NoteType.TYPE_TEXT.value) db!!.NotesDao().insertOrUpdate(note) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/ImportFolderDialog.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/ImportFolderDialog.kt index 44b63c9e..b7e5458d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/ImportFolderDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/ImportFolderDialog.kt @@ -11,9 +11,8 @@ import com.simplemobiletools.notes.pro.R import com.simplemobiletools.notes.pro.activities.SimpleActivity import com.simplemobiletools.notes.pro.extensions.notesDB import com.simplemobiletools.notes.pro.extensions.parseChecklistItems +import com.simplemobiletools.notes.pro.helpers.NoteType import com.simplemobiletools.notes.pro.helpers.NotesHelper -import com.simplemobiletools.notes.pro.helpers.TYPE_CHECKLIST -import com.simplemobiletools.notes.pro.helpers.TYPE_TEXT import com.simplemobiletools.notes.pro.models.Note import kotlinx.android.synthetic.main.dialog_import_folder.view.* import java.io.File @@ -59,14 +58,14 @@ class ImportFolderDialog(val activity: SimpleActivity, val path: String, val cal val fileText = it.readText().trim() val checklistItems = fileText.parseChecklistItems() if (checklistItems != null) { - saveNote(title.substringBeforeLast('.'), fileText, TYPE_CHECKLIST, "") + saveNote(title.substringBeforeLast('.'), fileText, NoteType.TYPE_CHECKLIST.value, "") } else { if (updateFilesOnEdit) { activity.handleSAFDialog(path) { - saveNote(title, value, TYPE_TEXT, storePath) + saveNote(title, value, NoteType.TYPE_TEXT.value, storePath) } } else { - saveNote(title, value, TYPE_TEXT, storePath) + saveNote(title, value, NoteType.TYPE_TEXT.value, storePath) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/NewNoteDialog.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/NewNoteDialog.kt index 8a74fbad..2edd283c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/NewNoteDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/NewNoteDialog.kt @@ -11,15 +11,14 @@ import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.notes.pro.R import com.simplemobiletools.notes.pro.extensions.config import com.simplemobiletools.notes.pro.extensions.notesDB -import com.simplemobiletools.notes.pro.helpers.TYPE_CHECKLIST -import com.simplemobiletools.notes.pro.helpers.TYPE_TEXT +import com.simplemobiletools.notes.pro.helpers.NoteType import com.simplemobiletools.notes.pro.models.Note import kotlinx.android.synthetic.main.dialog_new_note.view.* class NewNoteDialog(val activity: Activity, callback: (note: Note) -> Unit) { init { val view = activity.layoutInflater.inflate(R.layout.dialog_new_note, null).apply { - new_note_type.check(if (activity.config.lastCreatedNoteType == TYPE_TEXT) type_text_note.id else type_checklist.id) + new_note_type.check(if (activity.config.lastCreatedNoteType == NoteType.TYPE_TEXT.value) type_text_note.id else type_checklist.id) } AlertDialog.Builder(activity) @@ -35,7 +34,7 @@ class NewNoteDialog(val activity: Activity, callback: (note: Note) -> Unit) { title.isEmpty() -> activity.toast(R.string.no_title) activity.notesDB.getNoteIdWithTitle(title) != null -> activity.toast(R.string.title_taken) else -> { - val type = if (view.new_note_type.checkedRadioButtonId == view.type_checklist.id) TYPE_CHECKLIST else TYPE_TEXT + val type = if (view.new_note_type.checkedRadioButtonId == view.type_checklist.id) NoteType.TYPE_CHECKLIST.value else NoteType.TYPE_TEXT.value activity.config.lastCreatedNoteType = type val newNote = Note(null, title, "", type) callback(newNote) diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/OpenFileDialog.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/OpenFileDialog.kt index eff35d51..d4b420cc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/OpenFileDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/OpenFileDialog.kt @@ -7,7 +7,7 @@ import com.simplemobiletools.commons.extensions.humanizePath import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.notes.pro.R import com.simplemobiletools.notes.pro.activities.SimpleActivity -import com.simplemobiletools.notes.pro.helpers.TYPE_TEXT +import com.simplemobiletools.notes.pro.helpers.NoteType import com.simplemobiletools.notes.pro.models.Note import kotlinx.android.synthetic.main.dialog_open_file.* import kotlinx.android.synthetic.main.dialog_open_file.view.* @@ -45,7 +45,7 @@ class OpenFileDialog(val activity: SimpleActivity, val path: String, val callbac private fun saveNote(storeContent: String, storePath: String) { val filename = path.getFilenameFromPath() - val note = Note(null, filename, storeContent, TYPE_TEXT, storePath) + val note = Note(null, filename, storeContent, NoteType.TYPE_TEXT.value, storePath) callback(note) dialog.dismiss() } diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt index 4a1bc2ee..3524f4f5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt @@ -1,6 +1,9 @@ package com.simplemobiletools.notes.pro.extensions import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity import com.simplemobiletools.notes.pro.helpers.Config val Fragment.config: Config? get() = if (context != null) Config.newInstance(context!!) else null + +val Fragment.requiredActivity: FragmentActivity get() = this.activity!! 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 383e57dc..62fdff7d 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 @@ -15,8 +15,10 @@ import com.simplemobiletools.notes.pro.adapters.ChecklistAdapter import com.simplemobiletools.notes.pro.dialogs.NewChecklistItemDialog import com.simplemobiletools.notes.pro.extensions.config import com.simplemobiletools.notes.pro.extensions.notesDB +import com.simplemobiletools.notes.pro.extensions.requiredActivity import com.simplemobiletools.notes.pro.extensions.updateWidgets import com.simplemobiletools.notes.pro.helpers.NOTE_ID +import com.simplemobiletools.notes.pro.helpers.NoteType import com.simplemobiletools.notes.pro.helpers.NotesHelper import com.simplemobiletools.notes.pro.interfaces.ChecklistItemsListener import com.simplemobiletools.notes.pro.models.ChecklistItem @@ -39,17 +41,23 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { override fun onResume() { super.onResume() - NotesHelper(activity!!).getNoteWithId(noteId) { + NotesHelper(requiredActivity).getNoteWithId(noteId) { if (it != null && activity?.isDestroyed == false) { note = it - val checklistItemType = object : TypeToken>() {}.type - items = Gson().fromJson>(note!!.value, checklistItemType) ?: ArrayList(1) + try { + val checklistItemType = object : TypeToken>() {}.type + items = Gson().fromJson>(note!!.value, checklistItemType) ?: ArrayList(1) + } catch (e: Exception) { + note?.run { migrateCheckListOnFailure(it) } + e.printStackTrace() + } + if (config!!.moveUndoneChecklistItems) { items.sortBy { it.isDone } } - context!!.updateTextColors(view.checklist_holder) + requiredActivity.updateTextColors(view.checklist_holder) setupFragment() } } @@ -62,19 +70,35 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { } } + private fun migrateCheckListOnFailure(note: Note) { + items.clear() + + val notes = note.value.split("\n").map { it.trim() }.filter { it.isNotBlank() } + + notes.forEachIndexed { index, value -> + items.add(ChecklistItem( + id = index, + title = value, + isDone = false + )) + } + + saveChecklist() + } + private fun setupFragment() { - val plusIcon = resources.getColoredDrawableWithColor(R.drawable.ic_plus_vector, if (context!!.isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) + val plusIcon = resources.getColoredDrawableWithColor(R.drawable.ic_plus_vector, if (requiredActivity.isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) view.apply { checklist_fab.apply { setImageDrawable(plusIcon) - background.applyColorFilter(context!!.getAdjustedPrimaryColor()) + background.applyColorFilter(requiredActivity.getAdjustedPrimaryColor()) setOnClickListener { showNewItemDialog() } } fragment_placeholder_2.apply { - setTextColor(context!!.getAdjustedPrimaryColor()) + setTextColor(requiredActivity.getAdjustedPrimaryColor()) underlineText() setOnClickListener { showNewItemDialog() diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/Config.kt index 808c85b8..d7de7018 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/Config.kt @@ -72,7 +72,7 @@ class Config(context: Context) : BaseConfig(context) { set(useIncognitoMode) = prefs.edit().putBoolean(USE_INCOGNITO_MODE, useIncognitoMode).apply() var lastCreatedNoteType: Int - get() = prefs.getInt(LAST_CREATED_NOTE_TYPE, TYPE_TEXT) + get() = prefs.getInt(LAST_CREATED_NOTE_TYPE, NoteType.TYPE_TEXT.value) set(lastCreatedNoteType) = prefs.edit().putInt(LAST_CREATED_NOTE_TYPE, lastCreatedNoteType).apply() var moveUndoneChecklistItems: Boolean diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/Constants.kt index 148f7873..1eaac57b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/Constants.kt @@ -37,8 +37,7 @@ const val GRAVITY_CENTER = 1 const val GRAVITY_RIGHT = 2 // note types -const val TYPE_TEXT = 0 -const val TYPE_CHECKLIST = 1 +enum class NoteType(val value: Int) { TYPE_TEXT(0), TYPE_CHECKLIST(1) } // mime types const val MIME_TEXT_PLAIN = "text/plain" diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/NotesHelper.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/NotesHelper.kt index 3ba5f56a..aa280bf4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/NotesHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/helpers/NotesHelper.kt @@ -32,7 +32,7 @@ class NotesHelper(val context: Context) { if (notes.isEmpty()) { val generalNote = context.resources.getString(R.string.general_note) - val note = Note(null, generalNote, "", TYPE_TEXT) + val note = Note(null, generalNote, "", NoteType.TYPE_TEXT.value) context.notesDB.insertOrUpdate(note) notes.add(note) } From 7b12650db9bb489520e698e891f1dc2c093fb43a Mon Sep 17 00:00:00 2001 From: Pavol Franek <> Date: Sun, 1 Mar 2020 16:53:09 +0100 Subject: [PATCH 2/4] - fixed app crash when gson can not deserialize note - create checklist notes if user paste note with new line char --- .../notes/pro/adapters/NotesPagerAdapter.kt | 2 +- .../notes/pro/extensions/Fragment.kt | 3 + .../notes/pro/fragments/ChecklistFragment.kt | 126 +++++++++--------- .../res/layout/dialog_new_checklist_item.xml | 12 +- 4 files changed, 75 insertions(+), 68 deletions(-) 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 e7fe6a36..1d183faf 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 @@ -59,7 +59,7 @@ class NotesPagerAdapter(fm: FragmentManager, val notes: List, val activity fun saveAllFragmentTexts() = fragments.values.forEach { (it as? TextFragment)?.saveText(false) } - fun getNoteChecklistItems(position: Int) = (fragments[position] as? ChecklistFragment)?.getChecklistItems() + fun getNoteChecklistItems(position: Int) = (fragments[position] as? ChecklistFragment)?.checklistItems fun undo(position: Int) = (fragments[position] as? TextFragment)?.undo() diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt index 3524f4f5..70732c47 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt @@ -2,8 +2,11 @@ package com.simplemobiletools.notes.pro.extensions import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity +import com.simplemobiletools.notes.pro.BuildConfig import com.simplemobiletools.notes.pro.helpers.Config val Fragment.config: Config? get() = if (context != null) Config.newInstance(context!!) else null val Fragment.requiredActivity: FragmentActivity get() = this.activity!! + +val Fragment.isDebug get(): Boolean = BuildConfig.DEBUG \ No newline at end of file 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 62fdff7d..f4d22532 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 @@ -13,12 +13,8 @@ import com.simplemobiletools.notes.pro.R import com.simplemobiletools.notes.pro.activities.SimpleActivity import com.simplemobiletools.notes.pro.adapters.ChecklistAdapter import com.simplemobiletools.notes.pro.dialogs.NewChecklistItemDialog -import com.simplemobiletools.notes.pro.extensions.config -import com.simplemobiletools.notes.pro.extensions.notesDB -import com.simplemobiletools.notes.pro.extensions.requiredActivity -import com.simplemobiletools.notes.pro.extensions.updateWidgets +import com.simplemobiletools.notes.pro.extensions.* import com.simplemobiletools.notes.pro.helpers.NOTE_ID -import com.simplemobiletools.notes.pro.helpers.NoteType import com.simplemobiletools.notes.pro.helpers.NotesHelper import com.simplemobiletools.notes.pro.interfaces.ChecklistItemsListener import com.simplemobiletools.notes.pro.models.ChecklistItem @@ -26,14 +22,17 @@ import com.simplemobiletools.notes.pro.models.Note import kotlinx.android.synthetic.main.fragment_checklist.view.* class ChecklistFragment : NoteFragment(), ChecklistItemsListener { - private var noteId = 0L + + private var noteId = 0L + private var items = ArrayList() private var note: Note? = null - private var items = ArrayList() lateinit var view: ViewGroup + val checklistItems get(): String = Gson().toJson(items) + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - view = inflater.inflate(R.layout.fragment_checklist, container, false) as ViewGroup + view = inflater.inflate(R.layout.fragment_checklist, container, false) as ViewGroup noteId = arguments!!.getLong(NOTE_ID, 0L) return view } @@ -41,41 +40,39 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { override fun onResume() { super.onResume() - NotesHelper(requiredActivity).getNoteWithId(noteId) { - if (it != null && activity?.isDestroyed == false) { - note = it + loadNoteById(noteId) + } + + override fun setMenuVisibility(menuVisible: Boolean) { + super.setMenuVisibility(menuVisible) + + if (menuVisible) activity?.hideKeyboard() + } + + private fun loadNoteById(noteId: Long) { + NotesHelper(requiredActivity).getNoteWithId(noteId) { storedNote -> + if (storedNote != null && activity?.isDestroyed == false) { + note = storedNote try { - val checklistItemType = object : TypeToken>() {}.type - items = Gson().fromJson>(note!!.value, checklistItemType) ?: ArrayList(1) + val checklistItemType = object: TypeToken>(){}.type + items = Gson().fromJson>(storedNote.value, checklistItemType) ?: ArrayList(1) } catch (e: Exception) { - note?.run { migrateCheckListOnFailure(it) } - e.printStackTrace() - } - - if (config!!.moveUndoneChecklistItems) { - items.sortBy { it.isDone } + migrateCheckListOnFailure(storedNote) + if (isDebug) e.printStackTrace() } + if (config?.moveUndoneChecklistItems == true) items.sortBy { it.isDone } requiredActivity.updateTextColors(view.checklist_holder) setupFragment() } } } - override fun setMenuVisibility(menuVisible: Boolean) { - super.setMenuVisibility(menuVisible) - if (menuVisible) { - activity?.hideKeyboard() - } - } - private fun migrateCheckListOnFailure(note: Note) { items.clear() - val notes = note.value.split("\n").map { it.trim() }.filter { it.isNotBlank() } - - notes.forEachIndexed { index, value -> + note.value.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEachIndexed { index, value -> items.add(ChecklistItem( id = index, title = value, @@ -88,8 +85,9 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { private fun setupFragment() { val plusIcon = resources.getColoredDrawableWithColor(R.drawable.ic_plus_vector, if (requiredActivity.isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) + view.apply { - checklist_fab.apply { + with(checklist_fab) { setImageDrawable(plusIcon) background.applyColorFilter(requiredActivity.getAdjustedPrimaryColor()) setOnClickListener { @@ -97,7 +95,7 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { } } - fragment_placeholder_2.apply { + with(fragment_placeholder_2) { setTextColor(requiredActivity.getAdjustedPrimaryColor()) underlineText() setOnClickListener { @@ -105,36 +103,45 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { } } } + setupAdapter() } private fun showNewItemDialog() { - NewChecklistItemDialog(activity as SimpleActivity) { - var currentMaxId = items.maxBy { it.id }?.id ?: 0 - it.forEach { - val checklistItem = ChecklistItem(currentMaxId + 1, it, false) - items.add(checklistItem) - currentMaxId++ + NewChecklistItemDialog(activity as SimpleActivity) { titles -> + var currentMaxId = items.maxBy { item -> item.id }?.id ?: 0 + + titles.forEach { title -> + title.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEach { row -> + items.add(ChecklistItem(currentMaxId + 1, row, false)) + currentMaxId++ + } } + saveNote() - if (items.size == it.size) { - setupAdapter() - } else { - (view.checklist_list.adapter as? ChecklistAdapter)?.notifyDataSetChanged() - } + setupAdapter() + + (view.checklist_list.adapter as? ChecklistAdapter)?.notifyDataSetChanged() } } private fun setupAdapter() { - view.apply { + with(view) { fragment_placeholder.beVisibleIf(items.isEmpty()) fragment_placeholder_2.beVisibleIf(items.isEmpty()) checklist_list.beVisibleIf(items.isNotEmpty()) } - ChecklistAdapter(activity as SimpleActivity, items, this, view.checklist_list, true) { - val clickedNote = it as ChecklistItem + ChecklistAdapter( + activity = activity as SimpleActivity, + items = items, + listener = this, + recyclerView = view.checklist_list, + showIcons = true + ) { item -> + val clickedNote = item as ChecklistItem clickedNote.isDone = !clickedNote.isDone + saveNote(items.indexOfFirst { it.id == clickedNote.id }) context?.updateWidgets() }.apply { @@ -144,27 +151,22 @@ class ChecklistFragment : NoteFragment(), ChecklistItemsListener { private fun saveNote(refreshIndex: Int = -1) { ensureBackgroundThread { - if (note != null && context != null) { - if (refreshIndex != -1) { - view.checklist_list.post { - view.checklist_list.adapter?.notifyItemChanged(refreshIndex) + context?.let { ctx -> + note?.let { currentNote -> + if (refreshIndex != -1) { + view.checklist_list.post { + view.checklist_list.adapter?.notifyItemChanged(refreshIndex) + } } - } - note!!.value = getChecklistItems() - context?.notesDB?.insertOrUpdate(note!!) - context?.updateWidgets() + currentNote.value = checklistItems + ctx.notesDB.insertOrUpdate(currentNote) + ctx.updateWidgets() + } } } } - fun getChecklistItems() = Gson().toJson(items) - - override fun saveChecklist() { - saveNote() - } - - override fun refreshItems() { - setupAdapter() - } + override fun saveChecklist() { saveNote() } + override fun refreshItems() { setupAdapter() } } diff --git a/app/src/main/res/layout/dialog_new_checklist_item.xml b/app/src/main/res/layout/dialog_new_checklist_item.xml index 2113c7b2..535da69d 100644 --- a/app/src/main/res/layout/dialog_new_checklist_item.xml +++ b/app/src/main/res/layout/dialog_new_checklist_item.xml @@ -1,6 +1,5 @@ - + android:textSize="@dimen/normal_text_size" /> + android:textSize="@dimen/normal_text_size" /> + android:textSize="@dimen/normal_text_size" /> From f66c90e49581841ae261458a3860af9481b6020c Mon Sep 17 00:00:00 2001 From: Pavol Franek <> Date: Mon, 2 Mar 2020 06:51:30 +0100 Subject: [PATCH 3/4] - updated code style format and removed debug extension --- .../notes/pro/extensions/Fragment.kt | 3 - .../notes/pro/fragments/ChecklistFragment.kt | 246 +++++++++--------- 2 files changed, 128 insertions(+), 121 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt index 70732c47..3524f4f5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/extensions/Fragment.kt @@ -2,11 +2,8 @@ package com.simplemobiletools.notes.pro.extensions import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity -import com.simplemobiletools.notes.pro.BuildConfig import com.simplemobiletools.notes.pro.helpers.Config val Fragment.config: Config? get() = if (context != null) Config.newInstance(context!!) else null val Fragment.requiredActivity: FragmentActivity get() = this.activity!! - -val Fragment.isDebug get(): Boolean = BuildConfig.DEBUG \ No newline at end of file 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 f4d22532..2efc106c 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 @@ -23,150 +23,160 @@ import kotlinx.android.synthetic.main.fragment_checklist.view.* class ChecklistFragment : NoteFragment(), ChecklistItemsListener { - private var noteId = 0L - private var items = ArrayList() - private var note: Note? = null + private var noteId = 0L + private var items = ArrayList() + private var note: Note? = null - lateinit var view: ViewGroup + lateinit var view: ViewGroup - val checklistItems get(): String = Gson().toJson(items) + val checklistItems get(): String = Gson().toJson(items) - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - view = inflater.inflate(R.layout.fragment_checklist, container, false) as ViewGroup - noteId = arguments!!.getLong(NOTE_ID, 0L) - return view - } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + view = inflater.inflate(R.layout.fragment_checklist, container, false) as ViewGroup + noteId = arguments!!.getLong(NOTE_ID, 0L) + return view + } - override fun onResume() { - super.onResume() + override fun onResume() { + super.onResume() - loadNoteById(noteId) - } + loadNoteById(noteId) + } - override fun setMenuVisibility(menuVisible: Boolean) { - super.setMenuVisibility(menuVisible) + override fun setMenuVisibility(menuVisible: Boolean) { + super.setMenuVisibility(menuVisible) - if (menuVisible) activity?.hideKeyboard() - } + if (menuVisible) { + activity?.hideKeyboard() + } + } - private fun loadNoteById(noteId: Long) { - NotesHelper(requiredActivity).getNoteWithId(noteId) { storedNote -> - if (storedNote != null && activity?.isDestroyed == false) { - note = storedNote + private fun loadNoteById(noteId: Long) { + NotesHelper(requiredActivity).getNoteWithId(noteId) { storedNote -> + if (storedNote != null && activity?.isDestroyed == false) { + note = storedNote - try { - val checklistItemType = object: TypeToken>(){}.type - items = Gson().fromJson>(storedNote.value, checklistItemType) ?: ArrayList(1) - } catch (e: Exception) { - migrateCheckListOnFailure(storedNote) - if (isDebug) e.printStackTrace() + try { + val checklistItemType = object : TypeToken>() {}.type + items = Gson().fromJson>(storedNote.value, checklistItemType) + ?: ArrayList(1) + } catch (e: Exception) { + migrateCheckListOnFailure(storedNote) + } + + if (config?.moveUndoneChecklistItems == true) { + items.sortBy { it.isDone } } - if (config?.moveUndoneChecklistItems == true) items.sortBy { it.isDone } - requiredActivity.updateTextColors(view.checklist_holder) - setupFragment() - } - } - } + requiredActivity.updateTextColors(view.checklist_holder) + setupFragment() + } + } + } - private fun migrateCheckListOnFailure(note: Note) { - items.clear() + private fun migrateCheckListOnFailure(note: Note) { + items.clear() - note.value.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEachIndexed { index, value -> - items.add(ChecklistItem( - id = index, - title = value, - isDone = false - )) - } + note.value.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEachIndexed { index, value -> + items.add(ChecklistItem( + id = index, + title = value, + isDone = false + )) + } - saveChecklist() - } + saveChecklist() + } - private fun setupFragment() { - val plusIcon = resources.getColoredDrawableWithColor(R.drawable.ic_plus_vector, if (requiredActivity.isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) + private fun setupFragment() { + val plusIcon = resources.getColoredDrawableWithColor(R.drawable.ic_plus_vector, if (requiredActivity.isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) - view.apply { - with(checklist_fab) { - setImageDrawable(plusIcon) - background.applyColorFilter(requiredActivity.getAdjustedPrimaryColor()) - setOnClickListener { - showNewItemDialog() - } - } + view.apply { + with(checklist_fab) { + setImageDrawable(plusIcon) + background.applyColorFilter(requiredActivity.getAdjustedPrimaryColor()) + setOnClickListener { + showNewItemDialog() + } + } - with(fragment_placeholder_2) { - setTextColor(requiredActivity.getAdjustedPrimaryColor()) - underlineText() - setOnClickListener { - showNewItemDialog() - } - } - } + with(fragment_placeholder_2) { + setTextColor(requiredActivity.getAdjustedPrimaryColor()) + underlineText() + setOnClickListener { + showNewItemDialog() + } + } + } - setupAdapter() - } + setupAdapter() + } - private fun showNewItemDialog() { - NewChecklistItemDialog(activity as SimpleActivity) { titles -> - var currentMaxId = items.maxBy { item -> item.id }?.id ?: 0 + private fun showNewItemDialog() { + NewChecklistItemDialog(activity as SimpleActivity) { titles -> + var currentMaxId = items.maxBy { item -> item.id }?.id ?: 0 - titles.forEach { title -> - title.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEach { row -> - items.add(ChecklistItem(currentMaxId + 1, row, false)) - currentMaxId++ - } - } + titles.forEach { title -> + title.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEach { row -> + items.add(ChecklistItem(currentMaxId + 1, row, false)) + currentMaxId++ + } + } - saveNote() - setupAdapter() + saveNote() + setupAdapter() - (view.checklist_list.adapter as? ChecklistAdapter)?.notifyDataSetChanged() - } - } + (view.checklist_list.adapter as? ChecklistAdapter)?.notifyDataSetChanged() + } + } - private fun setupAdapter() { - with(view) { - fragment_placeholder.beVisibleIf(items.isEmpty()) - fragment_placeholder_2.beVisibleIf(items.isEmpty()) - checklist_list.beVisibleIf(items.isNotEmpty()) - } + private fun setupAdapter() { + with(view) { + fragment_placeholder.beVisibleIf(items.isEmpty()) + fragment_placeholder_2.beVisibleIf(items.isEmpty()) + checklist_list.beVisibleIf(items.isNotEmpty()) + } - ChecklistAdapter( - activity = activity as SimpleActivity, - items = items, - listener = this, - recyclerView = view.checklist_list, - showIcons = true - ) { item -> - val clickedNote = item as ChecklistItem - clickedNote.isDone = !clickedNote.isDone + ChecklistAdapter( + activity = activity as SimpleActivity, + items = items, + listener = this, + recyclerView = view.checklist_list, + showIcons = true + ) { item -> + val clickedNote = item as ChecklistItem + clickedNote.isDone = !clickedNote.isDone - saveNote(items.indexOfFirst { it.id == clickedNote.id }) - context?.updateWidgets() - }.apply { - view.checklist_list.adapter = this - } - } + saveNote(items.indexOfFirst { it.id == clickedNote.id }) + context?.updateWidgets() + }.apply { + view.checklist_list.adapter = this + } + } - private fun saveNote(refreshIndex: Int = -1) { - ensureBackgroundThread { - context?.let { ctx -> - note?.let { currentNote -> - if (refreshIndex != -1) { - view.checklist_list.post { - view.checklist_list.adapter?.notifyItemChanged(refreshIndex) - } - } + private fun saveNote(refreshIndex: Int = -1) { + ensureBackgroundThread { + context?.let { ctx -> + note?.let { currentNote -> + if (refreshIndex != -1) { + view.checklist_list.post { + view.checklist_list.adapter?.notifyItemChanged(refreshIndex) + } + } - currentNote.value = checklistItems - ctx.notesDB.insertOrUpdate(currentNote) - ctx.updateWidgets() - } - } - } - } + currentNote.value = checklistItems + ctx.notesDB.insertOrUpdate(currentNote) + ctx.updateWidgets() + } + } + } + } - override fun saveChecklist() { saveNote() } - override fun refreshItems() { setupAdapter() } + override fun saveChecklist() { + saveNote() + } + + override fun refreshItems() { + setupAdapter() + } } From 5c7674744dd04f25d566aa2ae0b2ed194fe61ea8 Mon Sep 17 00:00:00 2001 From: Pavol Franek <> Date: Tue, 3 Mar 2020 09:47:01 +0100 Subject: [PATCH 4/4] - fixed style config and code format --- .editorconfig | 19 ++ .../notes/pro/fragments/ChecklistFragment.kt | 246 +++++++++--------- 2 files changed, 142 insertions(+), 123 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..b762e804 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided this notice is +# preserved. This file is offered as-is, without any warranty. +# Names of contributors must not be used to endorse or promote products +# derived from this file without specific prior written permission. + +# EditorConfig +# http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# LF end-of-line, insert an empty new line and UTF-8 +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 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 2efc106c..bceb11cc 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 @@ -23,160 +23,160 @@ import kotlinx.android.synthetic.main.fragment_checklist.view.* class ChecklistFragment : NoteFragment(), ChecklistItemsListener { - private var noteId = 0L - private var items = ArrayList() - private var note: Note? = null + private var noteId = 0L + private var items = ArrayList() + private var note: Note? = null - lateinit var view: ViewGroup + lateinit var view: ViewGroup - val checklistItems get(): String = Gson().toJson(items) + val checklistItems get(): String = Gson().toJson(items) - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - view = inflater.inflate(R.layout.fragment_checklist, container, false) as ViewGroup - noteId = arguments!!.getLong(NOTE_ID, 0L) - return view - } + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + view = inflater.inflate(R.layout.fragment_checklist, container, false) as ViewGroup + noteId = arguments!!.getLong(NOTE_ID, 0L) + return view + } - override fun onResume() { - super.onResume() + override fun onResume() { + super.onResume() - loadNoteById(noteId) - } + loadNoteById(noteId) + } - override fun setMenuVisibility(menuVisible: Boolean) { - super.setMenuVisibility(menuVisible) + override fun setMenuVisibility(menuVisible: Boolean) { + super.setMenuVisibility(menuVisible) - if (menuVisible) { + if (menuVisible) { activity?.hideKeyboard() } - } + } - private fun loadNoteById(noteId: Long) { - NotesHelper(requiredActivity).getNoteWithId(noteId) { storedNote -> - if (storedNote != null && activity?.isDestroyed == false) { - note = storedNote + private fun loadNoteById(noteId: Long) { + NotesHelper(requiredActivity).getNoteWithId(noteId) { storedNote -> + if (storedNote != null && activity?.isDestroyed == false) { + note = storedNote - try { - val checklistItemType = object : TypeToken>() {}.type - items = Gson().fromJson>(storedNote.value, checklistItemType) - ?: ArrayList(1) - } catch (e: Exception) { - migrateCheckListOnFailure(storedNote) - } + try { + val checklistItemType = object : TypeToken>() {}.type + items = Gson().fromJson>(storedNote.value, checklistItemType) + ?: ArrayList(1) + } catch (e: Exception) { + migrateCheckListOnFailure(storedNote) + } - if (config?.moveUndoneChecklistItems == true) { + if (config?.moveUndoneChecklistItems == true) { items.sortBy { it.isDone } } - requiredActivity.updateTextColors(view.checklist_holder) - setupFragment() - } - } - } + requiredActivity.updateTextColors(view.checklist_holder) + setupFragment() + } + } + } - private fun migrateCheckListOnFailure(note: Note) { - items.clear() + private fun migrateCheckListOnFailure(note: Note) { + items.clear() - note.value.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEachIndexed { index, value -> - items.add(ChecklistItem( - id = index, - title = value, - isDone = false - )) - } + note.value.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEachIndexed { index, value -> + items.add(ChecklistItem( + id = index, + title = value, + isDone = false + )) + } - saveChecklist() - } + saveChecklist() + } - private fun setupFragment() { - val plusIcon = resources.getColoredDrawableWithColor(R.drawable.ic_plus_vector, if (requiredActivity.isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) + private fun setupFragment() { + val plusIcon = resources.getColoredDrawableWithColor(R.drawable.ic_plus_vector, if (requiredActivity.isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) - view.apply { - with(checklist_fab) { - setImageDrawable(plusIcon) - background.applyColorFilter(requiredActivity.getAdjustedPrimaryColor()) - setOnClickListener { - showNewItemDialog() - } - } + view.apply { + with(checklist_fab) { + setImageDrawable(plusIcon) + background.applyColorFilter(requiredActivity.getAdjustedPrimaryColor()) + setOnClickListener { + showNewItemDialog() + } + } - with(fragment_placeholder_2) { - setTextColor(requiredActivity.getAdjustedPrimaryColor()) - underlineText() - setOnClickListener { - showNewItemDialog() - } - } - } + with(fragment_placeholder_2) { + setTextColor(requiredActivity.getAdjustedPrimaryColor()) + underlineText() + setOnClickListener { + showNewItemDialog() + } + } + } - setupAdapter() - } + setupAdapter() + } - private fun showNewItemDialog() { - NewChecklistItemDialog(activity as SimpleActivity) { titles -> - var currentMaxId = items.maxBy { item -> item.id }?.id ?: 0 + private fun showNewItemDialog() { + NewChecklistItemDialog(activity as SimpleActivity) { titles -> + var currentMaxId = items.maxBy { item -> item.id }?.id ?: 0 - titles.forEach { title -> - title.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEach { row -> - items.add(ChecklistItem(currentMaxId + 1, row, false)) - currentMaxId++ - } - } + titles.forEach { title -> + title.split("\n").map { it.trim() }.filter { it.isNotBlank() }.forEach { row -> + items.add(ChecklistItem(currentMaxId + 1, row, false)) + currentMaxId++ + } + } - saveNote() - setupAdapter() + saveNote() + setupAdapter() - (view.checklist_list.adapter as? ChecklistAdapter)?.notifyDataSetChanged() - } - } + (view.checklist_list.adapter as? ChecklistAdapter)?.notifyDataSetChanged() + } + } - private fun setupAdapter() { - with(view) { - fragment_placeholder.beVisibleIf(items.isEmpty()) - fragment_placeholder_2.beVisibleIf(items.isEmpty()) - checklist_list.beVisibleIf(items.isNotEmpty()) - } + private fun setupAdapter() { + with(view) { + fragment_placeholder.beVisibleIf(items.isEmpty()) + fragment_placeholder_2.beVisibleIf(items.isEmpty()) + checklist_list.beVisibleIf(items.isNotEmpty()) + } - ChecklistAdapter( - activity = activity as SimpleActivity, - items = items, - listener = this, - recyclerView = view.checklist_list, - showIcons = true - ) { item -> - val clickedNote = item as ChecklistItem - clickedNote.isDone = !clickedNote.isDone + ChecklistAdapter( + activity = activity as SimpleActivity, + items = items, + listener = this, + recyclerView = view.checklist_list, + showIcons = true + ) { item -> + val clickedNote = item as ChecklistItem + clickedNote.isDone = !clickedNote.isDone - saveNote(items.indexOfFirst { it.id == clickedNote.id }) - context?.updateWidgets() - }.apply { - view.checklist_list.adapter = this - } - } + saveNote(items.indexOfFirst { it.id == clickedNote.id }) + context?.updateWidgets() + }.apply { + view.checklist_list.adapter = this + } + } - private fun saveNote(refreshIndex: Int = -1) { - ensureBackgroundThread { - context?.let { ctx -> - note?.let { currentNote -> - if (refreshIndex != -1) { - view.checklist_list.post { - view.checklist_list.adapter?.notifyItemChanged(refreshIndex) - } - } + private fun saveNote(refreshIndex: Int = -1) { + ensureBackgroundThread { + context?.let { ctx -> + note?.let { currentNote -> + if (refreshIndex != -1) { + view.checklist_list.post { + view.checklist_list.adapter?.notifyItemChanged(refreshIndex) + } + } - currentNote.value = checklistItems - ctx.notesDB.insertOrUpdate(currentNote) - ctx.updateWidgets() - } - } - } - } + currentNote.value = checklistItems + ctx.notesDB.insertOrUpdate(currentNote) + ctx.updateWidgets() + } + } + } + } - override fun saveChecklist() { - saveNote() - } + override fun saveChecklist() { + saveNote() + } - override fun refreshItems() { - setupAdapter() - } + override fun refreshItems() { + setupAdapter() + } }