diff --git a/app/build.gradle b/app/build.gradle index d92a446c..3e56ed10 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,7 +66,7 @@ android { } dependencies { - implementation 'com.github.SimpleMobileTools:Simple-Commons:91763fe00f' + implementation 'com.github.SimpleMobileTools:Simple-Commons:2a2c17151e' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.documentfile:documentfile:1.0.1' diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/OpenNoteAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/OpenNoteAdapter.kt new file mode 100644 index 00000000..0e0be36e --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/adapters/OpenNoteAdapter.kt @@ -0,0 +1,140 @@ +package com.simplemobiletools.notes.pro.adapters + +import android.content.Context +import android.graphics.Color +import android.text.SpannableString +import android.text.style.StrikethroughSpan +import android.view.Menu +import android.view.View +import android.view.ViewGroup +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter +import com.simplemobiletools.commons.extensions.beGoneIf +import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor +import com.simplemobiletools.commons.extensions.isBlackAndWhiteTheme +import com.simplemobiletools.commons.helpers.LOWER_ALPHA_INT +import com.simplemobiletools.commons.helpers.SORT_BY_CUSTOM +import com.simplemobiletools.commons.views.MyRecyclerView +import com.simplemobiletools.notes.pro.R +import com.simplemobiletools.notes.pro.extensions.config +import com.simplemobiletools.notes.pro.models.ChecklistItem +import com.simplemobiletools.notes.pro.models.Note +import com.simplemobiletools.notes.pro.models.NoteType +import kotlinx.android.synthetic.main.open_note_item.view.open_note_item_holder +import kotlinx.android.synthetic.main.open_note_item.view.open_note_item_text +import kotlinx.android.synthetic.main.open_note_item.view.open_note_item_title + +class OpenNoteAdapter( + activity: BaseSimpleActivity, var items: List, + recyclerView: MyRecyclerView, itemClick: (Any) -> Unit +) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) { + override fun getActionMenuId() = 0 + + override fun actionItemPressed(id: Int) {} + + override fun getSelectableItemCount() = itemCount + + override fun getIsItemSelectable(position: Int) = false + + override fun getItemSelectionKey(position: Int) = items.getOrNull(position)?.id?.toInt() + + override fun getItemKeyPosition(key: Int) = items.indexOfFirst { it.id?.toInt() == key } + + override fun onActionModeCreated() {} + + override fun onActionModeDestroyed() {} + + override fun prepareActionMode(menu: Menu) {} + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return createViewHolder(R.layout.open_note_item, parent) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val item = items[position] + holder.bindView(item, true, false) { itemView, layoutPosition -> + setupView(itemView, item) + } + bindViewHolder(holder) + } + + override fun getItemCount() = items.size + + private fun setupView(view: View, note: Note) { + view.apply { + setupCard(open_note_item_holder) + open_note_item_title.apply { + text = note.title + setTextColor(properPrimaryColor) + } + val formattedText = note.getFormattedValue(context) + open_note_item_text.beGoneIf(formattedText.isNullOrBlank()) + open_note_item_text.apply { + text = formattedText + setTextColor(textColor) + } + } + } + + private fun View.setupCard(holder: View) { + if (context.isBlackAndWhiteTheme()) { + holder.setBackgroundResource(R.drawable.black_dialog_background) + } else { + val cardBackgroundColor = if (backgroundColor == Color.BLACK) { + Color.WHITE + } else { + Color.BLACK + } + val cardBackground = if (context.config.isUsingSystemTheme) { + R.drawable.dialog_you_background + } else { + R.drawable.dialog_bg + } + holder.background = + activity.resources.getColoredDrawableWithColor(cardBackground, cardBackgroundColor, LOWER_ALPHA_INT) + } + } + + private fun Note.getFormattedValue(context: Context): CharSequence? { + return when (type) { + NoteType.TYPE_TEXT -> getNoteStoredValue(context) + NoteType.TYPE_CHECKLIST -> { + val checklistItemType = object : TypeToken>() {}.type + var items = Gson().fromJson>(getNoteStoredValue(context), checklistItemType) ?: listOf() + items = items.filter { it.title != null }.let { + val sorting = context.config.sorting + ChecklistItem.sorting = sorting + if (ChecklistItem.sorting and SORT_BY_CUSTOM == 0) { + it.sorted().let { + if (context.config.moveDoneChecklistItems) { + it.sortedBy { it.isDone } + } else { + it + } + } + } else { + it + } + } + val linePrefix = "• " + val stringifiedItems = items.joinToString(separator = System.lineSeparator()) { + "${linePrefix}${it.title}" + } + + val formattedText = SpannableString(stringifiedItems) + var currentPos = 0 + items.forEach { item -> + currentPos += linePrefix.length + if (item.isDone) { + formattedText.setSpan(StrikethroughSpan(), currentPos, currentPos + item.title.length, 0) + } + currentPos += item.title.length + currentPos += System.lineSeparator().length + } + formattedText + } + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/OpenNoteDialog.kt b/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/OpenNoteDialog.kt index b465a41c..b32e069a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/OpenNoteDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/notes/pro/dialogs/OpenNoteDialog.kt @@ -1,66 +1,53 @@ package com.simplemobiletools.notes.pro.dialogs -import android.app.Activity import android.view.View -import android.view.ViewGroup -import android.widget.RadioGroup import androidx.appcompat.app.AlertDialog -import com.simplemobiletools.commons.extensions.* +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.getAlertDialogBuilder +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.views.AutoStaggeredGridLayoutManager import com.simplemobiletools.notes.pro.R -import com.simplemobiletools.notes.pro.extensions.config +import com.simplemobiletools.notes.pro.adapters.OpenNoteAdapter import com.simplemobiletools.notes.pro.helpers.NotesHelper import com.simplemobiletools.notes.pro.models.Note -import kotlinx.android.synthetic.main.dialog_open_note.view.* -import kotlinx.android.synthetic.main.open_note_item.view.* +import kotlinx.android.synthetic.main.dialog_open_note.view.dialog_open_note_list +import kotlinx.android.synthetic.main.dialog_open_note.view.new_note_fab -class OpenNoteDialog(val activity: Activity, val callback: (checkedId: Long, newNote: Note?) -> Unit) { +class OpenNoteDialog(val activity: BaseSimpleActivity, val callback: (checkedId: Long, newNote: Note?) -> Unit) { private var dialog: AlertDialog? = null init { val view = activity.layoutInflater.inflate(R.layout.dialog_open_note, null) + + val noteItemWidth = activity.resources.getDimensionPixelSize(R.dimen.grid_note_item_width) + view.dialog_open_note_list.layoutManager = AutoStaggeredGridLayoutManager(noteItemWidth, StaggeredGridLayoutManager.VERTICAL) + NotesHelper(activity).getNotes { initDialog(it, view) } + } - view.dialog_open_note_new_radio.setOnClickListener { - view.dialog_open_note_new_radio.isChecked = false + private fun initDialog(notes: List, view: View) { + view.dialog_open_note_list.adapter = OpenNoteAdapter(activity, notes, view.dialog_open_note_list) { + it as Note + callback(it.id!!, null) + dialog?.dismiss() + } + + view.new_note_fab.setOnClickListener { NewNoteDialog(activity, setChecklistAsDefault = false) { callback(0, it) dialog?.dismiss() } } - } - private fun initDialog(notes: List, view: View) { - val textColor = activity.getProperTextColor() - notes.forEach { - activity.layoutInflater.inflate(R.layout.open_note_item, null).apply { - val note = it - open_note_item_radio_button.apply { - text = note.title - isChecked = note.id == activity.config.currentNoteId - id = note.id!!.toInt() - - setOnClickListener { - callback(note.id!!, null) - dialog?.dismiss() - } + activity.getAlertDialogBuilder() + .setNegativeButton(R.string.cancel, null) + .apply { + activity.setupDialogStuff(view, this, R.string.open_note) { alertDialog -> + dialog = alertDialog } - open_note_item_icon.apply { - beVisibleIf(note.path.isNotEmpty()) - applyColorFilter(textColor) - setOnClickListener { - activity.toast(note.path) - } - } - view.dialog_open_note_linear.addView(this, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) } - } - - activity.getAlertDialogBuilder().apply { - activity.setupDialogStuff(view, this, R.string.open_note) { alertDialog -> - dialog = alertDialog - } - } } } diff --git a/app/src/main/res/layout/dialog_open_note.xml b/app/src/main/res/layout/dialog_open_note.xml index 0e015af1..6abdb101 100644 --- a/app/src/main/res/layout/dialog_open_note.xml +++ b/app/src/main/res/layout/dialog_open_note.xml @@ -1,45 +1,36 @@ - - + android:layout_height="match_parent" + android:layout_marginStart="@dimen/small_margin" + android:layout_marginTop="@dimen/medium_margin" + android:layout_marginEnd="@dimen/small_margin" + android:minHeight="@dimen/min_open_note_popup_height" + app:layout_constraintHeight_max="@dimen/max_open_note_popup_height"> - + android:layout_height="match_parent" + tools:itemCount="10" + android:paddingBottom="@dimen/open_note_popup_bottom_extra_padding" + tools:listitem="@layout/open_note_item" /> - + - + - - - - - + diff --git a/app/src/main/res/layout/open_new_note_item.xml b/app/src/main/res/layout/open_new_note_item.xml new file mode 100644 index 00000000..c00b510f --- /dev/null +++ b/app/src/main/res/layout/open_new_note_item.xml @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/app/src/main/res/layout/open_note_item.xml b/app/src/main/res/layout/open_note_item.xml index b4364e4d..f317a23f 100644 --- a/app/src/main/res/layout/open_note_item.xml +++ b/app/src/main/res/layout/open_note_item.xml @@ -1,24 +1,31 @@ - + android:layout_height="wrap_content" + android:layout_margin="@dimen/medium_margin" + android:background="@drawable/widget_round_background" + android:orientation="vertical" + android:padding="@dimen/normal_margin"> - - - + android:ellipsize="end" + android:lines="1" + android:textSize="@dimen/big_text_size" + android:textStyle="bold" + tools:text="Title" /> - + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 1a0e9740..1ee7e9c2 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,3 +1,8 @@ 56dp + 150dp + 300dp + 500dp + 200dp + 76dp