diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/repo/NotesRepoHelper.kt b/app/src/main/java/dev/arkbuilders/arkmemo/repo/NotesRepoHelper.kt index a6f07fe..a9ddfe4 100644 --- a/app/src/main/java/dev/arkbuilders/arkmemo/repo/NotesRepoHelper.kt +++ b/app/src/main/java/dev/arkbuilders/arkmemo/repo/NotesRepoHelper.kt @@ -9,6 +9,7 @@ import dev.arkbuilders.arklib.user.properties.PropertiesStorage import dev.arkbuilders.arklib.user.properties.PropertiesStorageRepo import dev.arkbuilders.arkmemo.models.Note import dev.arkbuilders.arkmemo.preferences.MemoPreferences +import dev.arkbuilders.arkmemo.utils.isEqual import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.nio.file.Path @@ -32,11 +33,23 @@ class NotesRepoHelper @Inject constructor( propertiesStorage = propertiesStorageRepo.provide(RootIndex.provide(root)) } - suspend fun persistNoteProperties(resourceId: ResourceId, noteTitle: String) { + suspend fun persistNoteProperties(resourceId: ResourceId, + noteTitle: String, + description: String? = null): Boolean { with(propertiesStorage) { - val properties = Properties(setOf(noteTitle), setOf()) - setProperties(resourceId, properties) - persist() + val properties = Properties( + setOf(noteTitle), + mutableSetOf().apply { + description?.let { this.add(description) } + }) + val currentProperties = getProperties(resourceId) + if (currentProperties.isEqual(properties)) { + return false + } else { + setProperties(resourceId, properties) + persist() + return true + } } } diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/repo/graphics/GraphicNotesRepo.kt b/app/src/main/java/dev/arkbuilders/arkmemo/repo/graphics/GraphicNotesRepo.kt index 109f0f2..b81a955 100644 --- a/app/src/main/java/dev/arkbuilders/arkmemo/repo/graphics/GraphicNotesRepo.kt +++ b/app/src/main/java/dev/arkbuilders/arkmemo/repo/graphics/GraphicNotesRepo.kt @@ -60,15 +60,19 @@ class GraphicNotesRepo @Inject constructor( val size = tempPath.fileSize() val id = computeId(size, tempPath) Log.d(GRAPHICS_REPO, "initial resource name is ${tempPath.name}") - helper.persistNoteProperties(resourceId = id, noteTitle = note.title) + val isPropertiesChanged = helper.persistNoteProperties( + resourceId = id, + noteTitle = note.title, + description = note.description) val resourcePath = root.resolve("${id}.$SVG_EXT") if (resourcePath.exists()) { - Log.d( - GRAPHICS_REPO, - "resource with similar content already exists" - ) - callback(SaveNoteResult.ERROR_EXISTING) + if (isPropertiesChanged) { + callback(SaveNoteResult.SUCCESS) + } else { + Log.d(GRAPHICS_REPO, "resource with similar content already exists") + callback(SaveNoteResult.ERROR_EXISTING) + } return@withContext } diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/repo/text/TextNotesRepo.kt b/app/src/main/java/dev/arkbuilders/arkmemo/repo/text/TextNotesRepo.kt index 744839a..9ab922a 100644 --- a/app/src/main/java/dev/arkbuilders/arkmemo/repo/text/TextNotesRepo.kt +++ b/app/src/main/java/dev/arkbuilders/arkmemo/repo/text/TextNotesRepo.kt @@ -60,15 +60,19 @@ class TextNotesRepo @Inject constructor( val size = tempPath.fileSize() val id = computeId(size, tempPath) Log.d(TEXT_REPO, "initial resource name is ${tempPath.name}") - helper.persistNoteProperties(resourceId = id, noteTitle = note.title) + val isPropertiesChanged = helper.persistNoteProperties( + resourceId = id, + noteTitle = note.title, + description = note.description) val resourcePath = root.resolve("$id.$NOTE_EXT") if (resourcePath.exists()) { - Log.d( - TEXT_REPO, - "resource with similar content already exists" - ) - callback(SaveNoteResult.ERROR_EXISTING) + if (isPropertiesChanged) { + callback(SaveNoteResult.SUCCESS) + } else { + Log.d(TEXT_REPO, "resource with similar content already exists") + callback(SaveNoteResult.ERROR_EXISTING) + } return@withContext } diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/adapters/NotesListAdapter.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/adapters/NotesListAdapter.kt index 1332d00..4b261f7 100644 --- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/adapters/NotesListAdapter.kt +++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/adapters/NotesListAdapter.kt @@ -16,6 +16,7 @@ import dev.arkbuilders.arkmemo.ui.activities.MainActivity import dev.arkbuilders.arkmemo.ui.dialogs.NoteDeleteDialog import dev.arkbuilders.arkmemo.ui.fragments.EditGraphicNotesFragment import dev.arkbuilders.arkmemo.ui.fragments.EditTextNotesFragment +import dev.arkbuilders.arkmemo.utils.getAutoTitle import dev.arkbuilders.arkmemo.utils.replaceFragment class NotesListAdapter(private val notes: List): @@ -38,7 +39,7 @@ class NotesListAdapter(private val notes: List): } override fun onBindViewHolder(holder: NoteViewHolder, position: Int) { - holder.title.text = notes[position].title + holder.title.text = notes[position].getAutoTitle(activity) holder.date.text = notes[position].resource?.modified?.toString() ?: activity.getString(R.string.ark_memo_just_now) } diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/BaseEditNoteFragment.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/BaseEditNoteFragment.kt new file mode 100644 index 0000000..784753b --- /dev/null +++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/BaseEditNoteFragment.kt @@ -0,0 +1,26 @@ +package dev.arkbuilders.arkmemo.ui.fragments + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.Fragment +import by.kirich1409.viewbindingdelegate.viewBinding +import dev.arkbuilders.arkmemo.R +import dev.arkbuilders.arkmemo.databinding.FragmentEditNotesBinding + +open class BaseEditNoteFragment: Fragment(R.layout.fragment_edit_notes) { + + val binding by viewBinding(FragmentEditNotesBinding::bind) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.tvDescription.setOnClickListener { + if (binding.editTextDescription.visibility == View.GONE) { + binding.tvDescription.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_chevron_down, 0) + binding.editTextDescription.visibility = View.VISIBLE + } else { + binding.tvDescription.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_chevron_right, 0) + binding.editTextDescription.visibility = View.GONE + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/EditGraphicNotesFragment.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/EditGraphicNotesFragment.kt index 031a313..9dc0508 100644 --- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/EditGraphicNotesFragment.kt +++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/EditGraphicNotesFragment.kt @@ -6,30 +6,23 @@ import android.text.Editable import android.text.TextWatcher import android.view.View import androidx.core.view.isVisible -import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels -import by.kirich1409.viewbindingdelegate.viewBinding import dagger.hilt.android.AndroidEntryPoint import dev.arkbuilders.arkmemo.R -import dev.arkbuilders.arkmemo.databinding.FragmentEditNotesBinding import dev.arkbuilders.arkmemo.models.GraphicNote import dev.arkbuilders.arkmemo.ui.activities.MainActivity import dev.arkbuilders.arkmemo.ui.viewmodels.GraphicNotesViewModel import dev.arkbuilders.arkmemo.ui.viewmodels.NotesViewModel import dev.arkbuilders.arkmemo.utils.observeSaveResult -import java.time.LocalDate -import java.time.format.DateTimeFormatter @AndroidEntryPoint -class EditGraphicNotesFragment: Fragment(R.layout.fragment_edit_notes) { +class EditGraphicNotesFragment: BaseEditNoteFragment() { private val activity by lazy { requireActivity() as MainActivity } - private val binding by viewBinding(FragmentEditNotesBinding::bind) - private val graphicNotesViewModel: GraphicNotesViewModel by viewModels() private val notesViewModel: NotesViewModel by activityViewModels() @@ -54,10 +47,6 @@ class EditGraphicNotesFragment: Fragment(R.layout.fragment_edit_notes) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val defaultTitle = getString( - R.string.ark_memo_graphic_note, - LocalDate.now().format(DateTimeFormatter.ISO_DATE) - ) var title = note.title val notesCanvas = binding.notesCanvas val saveButton = binding.saveNote @@ -67,6 +56,9 @@ class EditGraphicNotesFragment: Fragment(R.layout.fragment_edit_notes) { override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { title = s?.toString() ?: "" + if (title.isEmpty()) { + binding.noteTitle.hint = getString(R.string.hint_new_graphical_note) + } } override fun afterTextChanged(s: Editable?) {} @@ -77,7 +69,7 @@ class EditGraphicNotesFragment: Fragment(R.layout.fragment_edit_notes) { activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) activity.showSettingsButton(false) - noteTitle.hint = defaultTitle + noteTitle.hint = getString(R.string.hint_new_graphical_note) noteTitle.setText(title) noteTitle.addTextChangedListener(noteTitleChangeListener) notesCanvas.isVisible = true @@ -85,14 +77,17 @@ class EditGraphicNotesFragment: Fragment(R.layout.fragment_edit_notes) { saveButton.setOnClickListener { val svg = graphicNotesViewModel.svg() val note = GraphicNote( - title = title.ifEmpty { defaultTitle }, + title = binding.noteTitle.text.toString(), svg = svg, + description = binding.editTextDescription.text.toString(), resource = note.resource ) notesViewModel.onSaveClick(note) { show -> activity.showProgressBar(show) } } + + binding.editTextDescription.setText(this.note.description) } override fun onResume() { diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/EditTextNotesFragment.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/EditTextNotesFragment.kt index a58ab25..7928f64 100644 --- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/EditTextNotesFragment.kt +++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/EditTextNotesFragment.kt @@ -6,21 +6,16 @@ import android.text.Editable import android.text.TextWatcher import android.view.View import androidx.core.view.isVisible -import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import by.kirich1409.viewbindingdelegate.viewBinding import dagger.hilt.android.AndroidEntryPoint import dev.arkbuilders.arkmemo.R -import dev.arkbuilders.arkmemo.ui.viewmodels.NotesViewModel -import dev.arkbuilders.arkmemo.databinding.FragmentEditNotesBinding import dev.arkbuilders.arkmemo.models.TextNote import dev.arkbuilders.arkmemo.ui.activities.MainActivity +import dev.arkbuilders.arkmemo.ui.viewmodels.NotesViewModel import dev.arkbuilders.arkmemo.utils.observeSaveResult -import java.time.LocalDate -import java.time.format.DateTimeFormatter @AndroidEntryPoint -class EditTextNotesFragment: Fragment(R.layout.fragment_edit_notes) { +class EditTextNotesFragment: BaseEditNoteFragment() { private val activity: MainActivity by lazy{ requireActivity() as MainActivity @@ -28,8 +23,6 @@ class EditTextNotesFragment: Fragment(R.layout.fragment_edit_notes) { private val notesViewModel: NotesViewModel by activityViewModels() - private val binding by viewBinding(FragmentEditNotesBinding::bind) - private var note = TextNote() private var noteStr: String? = null @@ -51,10 +44,6 @@ class EditTextNotesFragment: Fragment(R.layout.fragment_edit_notes) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val defaultTitle = getString( - R.string.ark_memo_text_note, - LocalDate.now().format(DateTimeFormatter.ISO_DATE) - ) var title = this.note.title var data = note.text val editTextListener = object: TextWatcher{ @@ -74,6 +63,9 @@ class EditTextNotesFragment: Fragment(R.layout.fragment_edit_notes) { override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { title = s?.toString() ?: "" + if (title.isEmpty()) { + binding.noteTitle.hint = getString(R.string.hint_new_text_note) + } } override fun afterTextChanged(s: Editable?) {} @@ -83,7 +75,6 @@ class EditTextNotesFragment: Fragment(R.layout.fragment_edit_notes) { activity.supportActionBar?.setDisplayHomeAsUpEnabled(true) activity.showSettingsButton(false) - noteTitle.hint = defaultTitle noteTitle.setText(this.note.title) noteTitle.addTextChangedListener(noteTitleChangeListener) editNote.isVisible = true @@ -96,7 +87,8 @@ class EditTextNotesFragment: Fragment(R.layout.fragment_edit_notes) { saveNoteButton.setOnClickListener { val note = TextNote( - title = title.ifEmpty { defaultTitle }, + title = title, + description = binding.editTextDescription.text.toString(), text = data, resource = note.resource ) @@ -104,6 +96,8 @@ class EditTextNotesFragment: Fragment(R.layout.fragment_edit_notes) { activity.showProgressBar(show) } } + + binding.editTextDescription.setText(this.note.description) } companion object{ diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/NotesFragment.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/NotesFragment.kt index 77ad6cd..3664123 100644 --- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/NotesFragment.kt +++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/NotesFragment.kt @@ -6,16 +6,13 @@ import android.widget.Button import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope -import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import by.kirich1409.viewbindingdelegate.viewBinding import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch import dev.arkbuilders.arkmemo.R import dev.arkbuilders.arkmemo.ui.viewmodels.NotesViewModel import dev.arkbuilders.arkmemo.databinding.FragmentNotesBinding @@ -48,11 +45,13 @@ class NotesFragment: Fragment(R.layout.fragment_notes) { private val newTextNoteClickListener = View.OnClickListener { activity.fragment = EditTextNotesFragment() activity.replaceFragment(activity.fragment, EditTextNotesFragment.TAG) + showFabs = false } private val newGraphicNoteClickListener = View.OnClickListener{ activity.fragment = EditGraphicNotesFragment.newInstance() activity.replaceFragment(activity.fragment, EditGraphicNotesFragment.TAG) + showFabs = false } private val pasteNoteClickListener = View.OnClickListener { diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/utils/NoteExt.kt b/app/src/main/java/dev/arkbuilders/arkmemo/utils/NoteExt.kt new file mode 100644 index 0000000..07950dd --- /dev/null +++ b/app/src/main/java/dev/arkbuilders/arkmemo/utils/NoteExt.kt @@ -0,0 +1,20 @@ +package dev.arkbuilders.arkmemo.utils + +import android.content.Context +import dev.arkbuilders.arkmemo.R +import dev.arkbuilders.arkmemo.models.GraphicNote +import dev.arkbuilders.arkmemo.models.Note +import dev.arkbuilders.arkmemo.models.TextNote + +fun Note.getAutoTitle(context: Context? = null): String { + + return if (this is TextNote) { + this.title.ifEmpty { this.text.take(20) } + } else if (this is GraphicNote && context != null) { + this.title.ifEmpty { + String.format(context.getString(R.string.ark_memo_graphic_note), this.resource?.id) + } + } else { + "" + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/utils/PropertiesExt.kt b/app/src/main/java/dev/arkbuilders/arkmemo/utils/PropertiesExt.kt new file mode 100644 index 0000000..4db882a --- /dev/null +++ b/app/src/main/java/dev/arkbuilders/arkmemo/utils/PropertiesExt.kt @@ -0,0 +1,8 @@ +package dev.arkbuilders.arkmemo.utils + +import dev.arkbuilders.arklib.user.properties.Properties + +fun Properties.isEqual(properties: Properties): Boolean { + return (this.titles == properties.titles) + && (this.descriptions == properties.descriptions) +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_chevron_down.xml b/app/src/main/res/drawable/ic_chevron_down.xml new file mode 100644 index 0000000..9e345b8 --- /dev/null +++ b/app/src/main/res/drawable/ic_chevron_down.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_chevron_right.xml b/app/src/main/res/drawable/ic_chevron_right.xml new file mode 100644 index 0000000..19ec5a5 --- /dev/null +++ b/app/src/main/res/drawable/ic_chevron_right.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/fragment_edit_notes.xml b/app/src/main/res/layout/fragment_edit_notes.xml index 0c6f431..35bd6d8 100644 --- a/app/src/main/res/layout/fragment_edit_notes.xml +++ b/app/src/main/res/layout/fragment_edit_notes.xml @@ -1,56 +1,96 @@ - + android:inputType="text" + android:paddingHorizontal="@dimen/padding_horizontal_common" + android:paddingTop="10dp" + android:textColorHint="@color/gray" + android:textSize="24sp" + android:textStyle="bold" /> + + + + + + + + android:paddingStart="10dp" + android:paddingTop="10dp" + android:paddingEnd="10dp" + android:paddingBottom="80dp" + android:textColorHint="#757575" + android:visibility="gone" + tools:visibility="visible" /> + - + android:paddingBottom="80dp" + android:visibility="gone" + tools:visibility="gone"/> + \ No newline at end of file diff --git a/app/src/main/res/layout/note.xml b/app/src/main/res/layout/note.xml index ce4938c..066a70a 100644 --- a/app/src/main/res/layout/note.xml +++ b/app/src/main/res/layout/note.xml @@ -27,6 +27,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/note" + android:maxLines="1" + android:ellipsize="end" android:textColor="@color/black" android:textSize="16sp" /> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..8d35933 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,4 @@ + + + 10dp + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 440b247..b1e2004 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,8 +30,11 @@ Title Just now Graphic note %1$s - Text note %1$s New note Close + Description + New text note + New graphical note + Put description for this note \ No newline at end of file