Skip to content

Commit

Permalink
[MVP] Implement new Memo app design: #55
Browse files Browse the repository at this point in the history
  • Loading branch information
tuancoltech committed May 12, 2024
1 parent b7f0034 commit cfdac94
Show file tree
Hide file tree
Showing 106 changed files with 23,714 additions and 187 deletions.
2 changes: 2 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,6 @@ dependencies {
implementation 'ch.acra:acra-http:5.9.6'
implementation 'ch.acra:acra-dialog:5.9.6'
implementation 'com.simplemobiletools:commons:5.29.20'

implementation 'com.airbnb.android:lottie:6.4.0'
}
5 changes: 5 additions & 0 deletions app/src/main/java/dev/arkbuilders/arkmemo/graphics/SVG.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ class SVG {
viewBox = ViewBox(width = width, height = height)
}

fun getViewBox(): ViewBox {
return viewBox
}

fun generate(path: Path) {
if (commands.isNotEmpty()) {
val xmlSerializer = Xml.newSerializer()
Expand Down Expand Up @@ -134,6 +138,7 @@ class SVG {

pathData.split(COMMA).forEach {
val command = it.trim()
if (command.isEmpty()) return@forEach
when (command.first()) {
SVGCommand.MoveTo.CODE -> {
commands.addLast(SVGCommand.MoveTo.fromString(command))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ interface ArkAudioRecorder {
fun maxAmplitude(): Int

fun getRecording(): Path

fun getRecordingSize(): Long
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,11 @@ class ArkAudioRecorderImpl @Inject constructor(
recorder = null
}

override fun maxAmplitude(): Int = recorder?.maxAmplitude!!
override fun maxAmplitude(): Int = recorder?.maxAmplitude ?: 0

override fun getRecording(): Path = tempFile.toPath()

override fun getRecordingSize(): Long {
return tempFile.length()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ data class GraphicNote(
@IgnoredOnParcel
val svg: SVG? = null,
@IgnoredOnParcel
override var resource: Resource? = null
override var resource: Resource? = null,
override var pendingForDelete: Boolean = false
) : Note, Parcelable
1 change: 1 addition & 0 deletions app/src/main/java/dev/arkbuilders/arkmemo/models/Note.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ interface Note {
val title: String
val description: String
var resource: Resource?
var pendingForDelete: Boolean
}
7 changes: 7 additions & 0 deletions app/src/main/java/dev/arkbuilders/arkmemo/models/Tag.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package dev.arkbuilders.arkmemo.models

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class Tag(val value: String) : Parcelable
3 changes: 2 additions & 1 deletion app/src/main/java/dev/arkbuilders/arkmemo/models/TextNote.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ data class TextNote (
override val description: String = "",
val text: String = "",
@IgnoredOnParcel
override var resource: Resource? = null
override var resource: Resource? = null,
override var pendingForDelete: Boolean = false
): Note, Parcelable
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ class VoiceNote(
@IgnoredOnParcel
var path: Path = createTempFile(),
@IgnoredOnParcel
override var resource: Resource? = null
override var resource: Resource? = null,
override var pendingForDelete: Boolean = false
): Note, Parcelable
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,14 @@ class NotesRepoHelper @Inject constructor(
suspend fun deleteNote(note: Note): Unit = withContext(Dispatchers.IO) {
val path = root.resolve("${note.resource?.name}")
path.deleteIfExists()
propertiesStorage.remove(note.resource?.id!!)
note.resource?.id?.let { resourceId ->
propertiesStorage.remove(resourceId)
}

propertiesStorage.persist()
Log.d("repo", "${note.resource?.name!!} has been deleted")
note.resource?.name?.let { name ->
Log.d("repo", "${name} has been deleted")
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,3 @@ fun AppCompatActivity.resumeFragment(fragment: Fragment){
commit()
}
}

fun Context.getTextFromClipBoard(): String?{
val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
return clipboardManager.primaryClip?.getItemAt(0)?.text?.toString()
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,27 @@ import androidx.fragment.app.FragmentManager
import androidx.recyclerview.widget.RecyclerView
import by.kirich1409.viewbindingdelegate.viewBinding
import dev.arkbuilders.arkmemo.R
import dev.arkbuilders.arkmemo.databinding.NoteBinding
import dev.arkbuilders.arkmemo.databinding.AdapterTextNoteBinding
import dev.arkbuilders.arkmemo.models.GraphicNote
import dev.arkbuilders.arkmemo.models.Note
import dev.arkbuilders.arkmemo.models.TextNote
import dev.arkbuilders.arkmemo.models.VoiceNote
import dev.arkbuilders.arkmemo.ui.activities.MainActivity
import dev.arkbuilders.arkmemo.ui.dialogs.NoteDeleteDialog
import dev.arkbuilders.arkmemo.ui.fragments.ArkMediaPlayerFragment
import dev.arkbuilders.arkmemo.ui.fragments.EditGraphicNotesFragment
import dev.arkbuilders.arkmemo.ui.fragments.EditTextNotesFragment
import dev.arkbuilders.arkmemo.ui.viewmodels.ArkMediaPlayerSideEffect
import dev.arkbuilders.arkmemo.ui.viewmodels.ArkMediaPlayerState
import dev.arkbuilders.arkmemo.ui.views.NotesCanvas
import dev.arkbuilders.arkmemo.utils.getAutoTitle
import dev.arkbuilders.arkmemo.utils.gone
import dev.arkbuilders.arkmemo.utils.replaceFragment
import dev.arkbuilders.arkmemo.utils.visible

class NotesListAdapter(
private val notes: List<Note>,
private val onPlayPauseClick: (String) -> Unit
private val onPlayPauseClick: (String) -> Unit,
private val onThumbPrepare : (note: GraphicNote, holder: NotesCanvas) -> Unit
): RecyclerView.Adapter<NotesListAdapter.NoteViewHolder>() {

private lateinit var activity: MainActivity
Expand All @@ -45,22 +48,35 @@ class NotesListAdapter(
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NoteViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.note, parent, false)
return NoteViewHolder(itemView)
val binding = AdapterTextNoteBinding.inflate(LayoutInflater.from(parent.context), parent, false)
binding.root.clipToOutline = true
return NoteViewHolder(binding.root)
}

override fun onBindViewHolder(holder: NoteViewHolder, position: Int) {
val note = notes[position]
holder.title.text = note.getAutoTitle(activity)
holder.date.text = note.resource?.modified?.toString() ?:
activity.getString(R.string.ark_memo_just_now)
holder.btnPlayPause.isVisible = false
// holder.date.text = note.resource?.modified?.toString() ?:
// activity.getString(R.string.ark_memo_just_now)
if (note is TextNote) {
holder.contentPreview.text = note.text
}
holder.layoutAudioView.isVisible = false
if (note is VoiceNote) {
holder.btnPlayPause.isVisible = true
holder.layoutAudioView.isVisible = true
holder.btnPlayPause.setOnClickListener {
onPlayPauseClick(note.path.toString())
handleMediaPlayerSideEffect(observeItemSideEffect(), holder)
}
} else if (note is GraphicNote) {
holder.canvasGraphicThumb.visible()
onThumbPrepare(note, holder.canvasGraphicThumb)
}

if (note.pendingForDelete) {
holder.tvDelete.visible()
} else {
holder.tvDelete.gone()
}
}

Expand Down Expand Up @@ -106,12 +122,15 @@ class NotesListAdapter(

inner class NoteViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
private val binding by viewBinding {
NoteBinding.bind(itemView)
AdapterTextNoteBinding.bind(itemView)
}

val title = binding.noteTitle
val date = binding.noteDate
val btnPlayPause = binding.btnPlayPause
val title = binding.tvTitle
val contentPreview = binding.tvContentPreview
val btnPlayPause = binding.ivPlayAudio
val layoutAudioView = binding.layoutAudioView
val canvasGraphicThumb = binding.canvasGraphicThumb
val tvDelete = binding.tvDelete

private val clickNoteToEditListener = View.OnClickListener {
var tag = EditTextNotesFragment.TAG
Expand All @@ -129,15 +148,8 @@ class NotesListAdapter(
activity.replaceFragment(activity.fragment, tag)
}

private val deleteNoteClickListener = View.OnClickListener {
NoteDeleteDialog()
.setNoteToBeDeleted(notes[bindingAdapterPosition])
.show(fragmentManager, NoteDeleteDialog.TAG)
}

init {
binding.theNote.setOnClickListener(clickNoteToEditListener)
binding.deleteNote.setOnClickListener(deleteNoteClickListener)
binding.root.setOnClickListener(clickNoteToEditListener)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package dev.arkbuilders.arkmemo.ui.adapters

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import by.kirich1409.viewbindingdelegate.viewBinding
import dev.arkbuilders.arkmemo.databinding.AdapterTagBinding
import dev.arkbuilders.arkmemo.models.Tag

class TagAdapter(
private val tags: List<Tag>,
): RecyclerView.Adapter<TagAdapter.TagViewHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TagViewHolder {
val binding = AdapterTagBinding.inflate(LayoutInflater.from(parent.context))
return TagViewHolder(binding.root)
}

override fun onBindViewHolder(holder: TagViewHolder, position: Int) {
val tag = tags[position]
holder.title.text = tag.value
}

override fun getItemCount() = tags.size

inner class TagViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
private val binding by viewBinding {
AdapterTagBinding.bind(itemView)
}
val title = binding.tvTag
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package dev.arkbuilders.arkmemo.ui.dialogs

import android.app.Dialog
import android.os.Bundle
import android.view.WindowManager
import androidx.annotation.StringRes
import androidx.fragment.app.DialogFragment
import dev.arkbuilders.arkmemo.R
import dev.arkbuilders.arkmemo.databinding.DialogCommonActionBinding

class CommonActionDialog(@StringRes private val title: Int,
@StringRes private val message: Int,
@StringRes private val positiveText: Int,
@StringRes private val negativeText: Int,
private val isAlert: Boolean = false,
private val onPositiveClick: (() -> Unit)? = null,
private val onNegativeClicked: (() -> Unit)? = null,
private val onCloseClicked: (() -> Unit)? = null): DialogFragment() {

companion object {
val TAG = CommonActionDialog::class.java.name
}
private lateinit var mBinding: DialogCommonActionBinding
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
mBinding = DialogCommonActionBinding.inflate(layoutInflater)
val dialog = Dialog(requireContext(), R.style.MemoDialog)
dialog.window?.setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT
)
dialog.setContentView(mBinding.root)
if (isAlert) {
mBinding.tvPositive.setTextAppearance(R.style.AlertButton)
mBinding.tvPositive.setBackgroundResource(R.drawable.bg_red_button)
}
initViews()
return dialog
}

private fun initViews() {
mBinding.tvTitle.setText(title)
mBinding.tvMessage.setText(message)
mBinding.tvPositive.setText(positiveText)
mBinding.tvNegative.setText(negativeText)
mBinding.ivClose.setOnClickListener {
onCloseClicked?.invoke()
dismiss()
}

mBinding.tvPositive.setOnClickListener {
onPositiveClick?.invoke()
dismiss()
}

mBinding.tvNegative.setOnClickListener {
onNegativeClicked?.invoke()
dismiss()
}
}

}

This file was deleted.

Loading

0 comments on commit cfdac94

Please sign in to comment.