diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c05150d..8897717 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -16,81 +16,81 @@ jobs:
environment: Development
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v4
- - name: Set up JDK 17
- uses: actions/setup-java@v4
- with:
- java-version: '17'
- distribution: 'adopt'
- cache: gradle
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'adopt'
+ cache: gradle
- - name: Validate Gradle wrapper
- uses: gradle/actions/wrapper-validation@v3
+ - name: Validate Gradle wrapper
+ uses: gradle/actions/wrapper-validation@v3
- - name: Build debug APK
- run: ./gradlew assembleDebug
+ - name: Build debug APK
+ run: ./gradlew assembleDebug
build:
if: ${{ ! startsWith(github.actor, 'dependabot') }}
environment: Development
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
-
- - name: Set up JDK 17
- uses: actions/setup-java@v4
- with:
- java-version: '17'
- distribution: 'adopt'
- cache: gradle
-
- - name: Validate Gradle wrapper
- uses: gradle/actions/wrapper-validation@v3
-
- - name: Decrypt the keystore for signing
- run: |
- echo "${{ secrets.KEYSTORE_ENCRYPTED }}" > keystore.asc
- gpg -d --passphrase "${{ secrets.KEYSTORE_PASSWORD }}" --batch keystore.asc > keystore.jks
-
- - name: Build release APK
- run: ./gradlew assembleRelease
-
- - name: Upload release Github arm64-v8a APK
- uses: actions/upload-artifact@v4
- with:
- name: release-arm64-v8a-apk-github
- path: ./app/build/outputs/apk/github/release/app-github-arm64-v8a-release.apk
-
- - name: Upload release Github armeabi-v7a APK
- uses: actions/upload-artifact@v4
- with:
- name: release-armeabi-v7a-apk-github
- path: ./app/build/outputs/apk/github/release/app-github-armeabi-v7a-release.apk
-
- - name: Upload release Github universal APK
- uses: actions/upload-artifact@v4
- with:
- name: release-universal-apk-github
- path: ./app/build/outputs/apk/github/release/app-github-universal-release.apk
-
- - name: Upload release GooglePlay arm64-v8a APK
- uses: actions/upload-artifact@v4
- with:
- name: release-arm64-v8a-apk-googleplay
- path: ./app/build/outputs/apk/googleplay/release/app-googleplay-arm64-v8a-release.apk
-
- - name: Upload release GooglePlay armeabi-v7a APK
- uses: actions/upload-artifact@v4
- with:
- name: release-armeabi-v7a-apk-googleplay
- path: ./app/build/outputs/apk/googleplay/release/app-googleplay-armeabi-v7a-release.apk
-
- - name: Upload release GooglePlay universal APK
- uses: actions/upload-artifact@v4
- with:
- name: release-universal-apk-googleplay
- path: ./app/build/outputs/apk/googleplay/release/app-googleplay-universal-release.apk
+ - uses: actions/checkout@v4
+
+ - name: Set up JDK 17
+ uses: actions/setup-java@v4
+ with:
+ java-version: '17'
+ distribution: 'adopt'
+ cache: gradle
+
+ - name: Validate Gradle wrapper
+ uses: gradle/actions/wrapper-validation@v3
+
+ - name: Decrypt the keystore for signing
+ run: |
+ echo "${{ secrets.KEYSTORE_ENCRYPTED }}" > keystore.asc
+ gpg -d --passphrase "${{ secrets.KEYSTORE_PASSWORD }}" --batch keystore.asc > keystore.jks
+
+ - name: Build release APK
+ run: ./gradlew assembleRelease
+
+ - name: Upload release Github arm64-v8a APK
+ uses: actions/upload-artifact@v4
+ with:
+ name: release-arm64-v8a-apk-github
+ path: ./app/build/outputs/apk/github/release/app-github-arm64-v8a-release.apk
+
+ - name: Upload release Github armeabi-v7a APK
+ uses: actions/upload-artifact@v4
+ with:
+ name: release-armeabi-v7a-apk-github
+ path: ./app/build/outputs/apk/github/release/app-github-armeabi-v7a-release.apk
+
+ - name: Upload release Github universal APK
+ uses: actions/upload-artifact@v4
+ with:
+ name: release-universal-apk-github
+ path: ./app/build/outputs/apk/github/release/app-github-universal-release.apk
+
+ - name: Upload release GooglePlay arm64-v8a APK
+ uses: actions/upload-artifact@v4
+ with:
+ name: release-arm64-v8a-apk-googleplay
+ path: ./app/build/outputs/apk/googleplay/release/app-googleplay-arm64-v8a-release.apk
+
+ - name: Upload release GooglePlay armeabi-v7a APK
+ uses: actions/upload-artifact@v4
+ with:
+ name: release-armeabi-v7a-apk-googleplay
+ path: ./app/build/outputs/apk/googleplay/release/app-googleplay-armeabi-v7a-release.apk
+
+ - name: Upload release GooglePlay universal APK
+ uses: actions/upload-artifact@v4
+ with:
+ name: release-universal-apk-googleplay
+ path: ./app/build/outputs/apk/googleplay/release/app-googleplay-universal-release.apk
lint:
needs: build
diff --git a/README.md b/README.md
index e69de29..092a7bc 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,3 @@
+# ARK Memo: Notes App by ARK Builders
+
+_Implementation in progress_
diff --git a/app/build.gradle b/app/build.gradle
index 9f7b6cc..7dda0ba 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -80,7 +80,7 @@ android {
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
- buildFeatures{
+ buildFeatures {
buildConfig true
viewBinding true
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6439a54..a7fe4dd 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -9,8 +9,8 @@
tools:ignore="ScopedStorage" />
-
-
+
+
{
pathCount += 1
- strokeColor = getAttributeValue("", Attributes.Path.STROKE)
+ strokeColor =
+ getAttributeValue("", Attributes.Path.STROKE)
fill = getAttributeValue("", Attributes.Path.FILL)
pathData = getAttributeValue("", Attributes.Path.DATA)
}
@@ -164,6 +166,7 @@ class SVG {
},
)
}
+
SVGCommand.AbsLineTo.CODE -> {
if (commandElements.size > 3) {
strokeColor = commandElements[3]
@@ -178,6 +181,7 @@ class SVG {
},
)
}
+
SVGCommand.AbsQuadTo.CODE -> {
if (commandElements.size > 5) {
strokeColor = commandElements[5]
@@ -192,6 +196,7 @@ class SVG {
},
)
}
+
else -> {}
}
}
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/models/GraphicNote.kt b/app/src/main/java/dev/arkbuilders/arkmemo/models/GraphicNote.kt
index c18173d..07a92cc 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/models/GraphicNote.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/models/GraphicNote.kt
@@ -18,4 +18,5 @@ data class GraphicNote(
override var pendingForDelete: Boolean = false,
var thumb: Bitmap? = null,
override var selected: Boolean = false,
+ override var isForked: Boolean = false,
) : Note, Parcelable
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/models/Note.kt b/app/src/main/java/dev/arkbuilders/arkmemo/models/Note.kt
index 85ecbef..3fbe341 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/models/Note.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/models/Note.kt
@@ -1,11 +1,13 @@
package dev.arkbuilders.arkmemo.models
+import android.os.Parcelable
import dev.arkbuilders.arklib.data.index.Resource
-interface Note {
+interface Note : Parcelable {
val title: String
val description: String
var resource: Resource?
var pendingForDelete: Boolean
var selected: Boolean
+ var isForked: Boolean
}
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/models/TextNote.kt b/app/src/main/java/dev/arkbuilders/arkmemo/models/TextNote.kt
index 6d162c9..a5ece07 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/models/TextNote.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/models/TextNote.kt
@@ -14,4 +14,5 @@ data class TextNote(
override var resource: Resource? = null,
override var pendingForDelete: Boolean = false,
override var selected: Boolean = false,
+ override var isForked: Boolean = false,
) : Note, Parcelable
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/models/VersionsResult.kt b/app/src/main/java/dev/arkbuilders/arkmemo/models/VersionsResult.kt
new file mode 100644
index 0000000..0b5ec6b
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/models/VersionsResult.kt
@@ -0,0 +1,10 @@
+package dev.arkbuilders.arkmemo.models
+
+import dev.arkbuilders.arklib.ResourceId
+import dev.arkbuilders.arkmemo.repo.versions.Version
+
+data class VersionsResult(
+ val versions: List,
+ val parents: Set,
+ val children: List,
+)
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/models/VoiceNote.kt b/app/src/main/java/dev/arkbuilders/arkmemo/models/VoiceNote.kt
index 1e586a4..bea3ad1 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/models/VoiceNote.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/models/VoiceNote.kt
@@ -23,4 +23,5 @@ class VoiceNote(
var currentPlayingPos: Int = 0,
var currentMaxAmplitude: Int = 0,
override var selected: Boolean = false,
+ override var isForked: Boolean = false,
) : Note, Parcelable
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/RootVersionStorage.kt b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/RootVersionStorage.kt
new file mode 100644
index 0000000..ab00cf7
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/RootVersionStorage.kt
@@ -0,0 +1,227 @@
+package dev.arkbuilders.arkmemo.repo.versions
+
+import android.util.Log
+import dev.arkbuilders.arklib.ResourceId
+import dev.arkbuilders.arklib.arkFolder
+import dev.arkbuilders.arkmemo.models.VersionsResult
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
+import space.taran.arkmemo.utils.arkVersions
+import java.nio.file.Files
+import java.nio.file.Path
+import java.nio.file.attribute.FileTime
+import kotlin.io.path.writeLines
+
+class RootVersionStorage(private val root: Path) : VersionStorage {
+ private val storageFile = root.arkFolder().arkVersions()
+ private var lastModified = FileTime.fromMillis(0L)
+ private val versions = mutableListOf()
+ private val parents = mutableSetOf()
+ private val children = mutableListOf()
+
+ suspend fun init() =
+ withContext(Dispatchers.IO) {
+ if (Files.exists(storageFile)) {
+ val result = readStorage()
+ lastModified = Files.getLastModifiedTime(storageFile)
+ Log.d(
+ VERSIONS_STORAGE,
+ "file $storageFile exists," +
+ " last modified at $lastModified",
+ )
+ versions.addAll(result.versions)
+ parents.addAll(result.parents)
+ children.addAll(result.children)
+ } else {
+ Log.d(
+ VERSIONS_STORAGE,
+ "file $storageFile doesn't exists",
+ )
+ }
+ }
+
+ override fun isLatestResourceVersion(id: ResourceId): Boolean = childrenNotParents().contains(id)
+
+ private fun replace(
+ oldVersion: Version,
+ newVersion: Version,
+ ) {
+ val replaceIndex = versions.indexOf(oldVersion)
+ versions[replaceIndex] = newVersion
+ }
+
+ override fun contains(id: ResourceId): Boolean {
+ return parents.contains(id) || children.contains(id)
+ }
+
+ override suspend fun add(version: Version) {
+ versions.add(version)
+ parents.add(version.parent)
+ children.add(version.child)
+ persist()
+ }
+
+ override suspend fun forget(id: ResourceId) {
+ if (!parents.contains(id)) {
+ val myParents = parentsTreeByChild(id)
+ myParents[id]?.forEach { parent ->
+ val version =
+ versions
+ .find { it.parent == parent }
+ versions.remove(version)
+ parents.remove(version?.parent)
+ children.remove(version?.child)
+ }
+ }
+ if (parents.contains(id) && !children.contains(id)) {
+ val version =
+ versions.find {
+ it.parent == id
+ }
+ versions.remove(version)
+ parents.remove(id)
+ }
+ if (parents.contains(id) && children.contains(id)) {
+ val versionIdIsChild =
+ versions.find {
+ it.child == id
+ }
+ val versionIdIsParent =
+ versions.find {
+ it.parent == id
+ }
+ val newVersion =
+ Version(
+ versionIdIsChild?.parent!!,
+ versionIdIsParent?.child!!,
+ )
+ replace(versionIdIsChild, newVersion)
+ versions.remove(versionIdIsParent)
+ parents.remove(id)
+ children.remove(id)
+ }
+ persist()
+ }
+
+ override fun versions() = versions
+
+ override fun parentsTreeByChild(child: ResourceId): Map> {
+ var localChild = child
+ var parent: ResourceId?
+ val parents = mutableListOf()
+ for (version in versions) {
+ parent =
+ versions.find {
+ it.child == localChild
+ }?.parent
+ if (parent != null && children.contains(parent)) {
+ localChild = parent
+ }
+ if (parent != null) parents.add(parent)
+ if (!children.contains(parent)) {
+ break
+ }
+ }
+ return mapOf(child to parents)
+ }
+
+ override fun childrenNotParents(): List {
+ return children.filter {
+ !parents.contains(it)
+ }
+ }
+
+ private suspend fun writeToStorage() =
+ withContext(Dispatchers.IO) {
+ val lines = mutableListOf()
+ lines.add(
+ "$STORAGE_VERSION_PREFIX$STORAGE_VERSION",
+ )
+ lines.addAll(
+ versions.map {
+ "${it.parent}$KEY_VALUE_SEPARATOR${it.child}"
+ },
+ )
+ storageFile.writeLines(lines, Charsets.UTF_8)
+ }
+
+ private suspend fun readStorage(): VersionsResult =
+ withContext(Dispatchers.IO) {
+ val lines = Files.readAllLines(storageFile)
+ val storageVersion = lines.removeAt(0)
+ verifyVersion(storageVersion)
+ val versions =
+ lines.map {
+ val parts = it.split(KEY_VALUE_SEPARATOR)
+ val parent = ResourceId.fromString(parts[0])
+ val child = ResourceId.fromString(parts[1])
+ Log.d(
+ VERSIONS_STORAGE,
+ it,
+ )
+ Version(parent, child)
+ }
+ val parents =
+ versions.map {
+ Log.d(
+ VERSIONS_STORAGE,
+ "parent: ${it.parent}",
+ )
+ it.parent
+ }.toSet()
+ val children =
+ versions.map {
+ Log.d(
+ VERSIONS_STORAGE,
+ "child: ${it.child}",
+ )
+ it.child
+ }
+ return@withContext VersionsResult(
+ versions,
+ parents,
+ children,
+ )
+ }
+
+ override fun getValue(id: ResourceId): Version2 {
+ TODO("Not yet implemented")
+ }
+
+ override suspend fun persist() =
+ withContext(Dispatchers.IO) {
+ writeToStorage()
+ return@withContext
+ }
+
+ override fun remove(id: ResourceId) {
+ TODO("Not yet implemented")
+ }
+
+ override fun setValue(
+ id: ResourceId,
+ value: Version2,
+ ) {
+ TODO("Not yet implemented")
+ }
+
+ companion object {
+ private const val VERSIONS_STORAGE = "versions"
+ private const val STORAGE_VERSION_PREFIX = "version "
+ private const val STORAGE_VERSION = 1
+ private const val KEY_VALUE_SEPARATOR = "->"
+
+ private fun verifyVersion(header: String) {
+ if (!header.startsWith(STORAGE_VERSION_PREFIX)) {
+ throw IllegalStateException("Unknown storage version")
+ }
+ val version = header.removePrefix(STORAGE_VERSION_PREFIX).toInt()
+ if (version > STORAGE_VERSION) {
+ throw IllegalStateException("Storage version is newer than app")
+ }
+ if (version < STORAGE_VERSION) {
+ throw IllegalStateException("Storage version is older than app")
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/RootVersionsStorage.kt b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/RootVersionsStorage.kt
new file mode 100644
index 0000000..9a5f67f
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/RootVersionsStorage.kt
@@ -0,0 +1,22 @@
+package dev.arkbuilders.arkmemo.repo.versions
+
+import dev.arkbuilders.arklib.ResourceId
+import dev.arkbuilders.arklib.arkFolder
+import dev.arkbuilders.arklib.data.storage.FileStorage
+import kotlinx.coroutines.CoroutineScope
+import space.taran.arkmemo.utils.arkVersions
+import java.nio.file.Path
+
+class RootVersionsStorage(
+ private val scope: CoroutineScope,
+ private val root: Path,
+) :
+ FileStorage("versions", scope, root.arkFolder().arkVersions(), VersionsMonoid),
+ VersionsStorage {
+ override fun valueFromString(raw: String): Versions =
+ raw.split(",").filter { it.isNotEmpty() }.map {
+ ResourceId.fromString(it)
+ }.toSet()
+
+ override fun valueToString(value: Versions): String = value.joinToString(",")
+}
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/Version.kt b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/Version.kt
new file mode 100644
index 0000000..9b9f00b
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/Version.kt
@@ -0,0 +1,10 @@
+package dev.arkbuilders.arkmemo.repo.versions
+
+import dev.arkbuilders.arklib.ResourceId
+
+typealias Version2 = ResourceId
+
+data class Version(
+ val parent: ResourceId,
+ val child: ResourceId,
+)
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionStorage.kt b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionStorage.kt
new file mode 100644
index 0000000..e365446
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionStorage.kt
@@ -0,0 +1,20 @@
+package dev.arkbuilders.arkmemo.repo.versions
+
+import dev.arkbuilders.arklib.ResourceId
+import dev.arkbuilders.arklib.data.storage.Storage
+
+interface VersionStorage : Storage {
+ suspend fun add(version: Version)
+
+ suspend fun forget(id: ResourceId)
+
+ fun versions(): List
+
+ fun contains(id: ResourceId): Boolean
+
+ fun parentsTreeByChild(child: ResourceId): Map>
+
+ fun childrenNotParents(): List
+
+ fun isLatestResourceVersion(id: ResourceId): Boolean
+}
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionStorageRepo.kt b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionStorageRepo.kt
new file mode 100644
index 0000000..7e2e711
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionStorageRepo.kt
@@ -0,0 +1,23 @@
+package dev.arkbuilders.arkmemo.repo.versions
+
+import dev.arkbuilders.arkmemo.preferences.MemoPreferences
+import java.nio.file.Path
+import javax.inject.Inject
+
+class VersionStorageRepo
+ @Inject
+ constructor(
+ private val memoPreferences: MemoPreferences,
+ ) {
+ private val storageByRoot = mutableMapOf()
+
+ suspend fun provide(): VersionStorage {
+ val root = memoPreferences.getNotesStorage()
+ if (storageByRoot[root] == null) {
+ val versionStorage = RootVersionStorage(root)
+ versionStorage.init()
+ storageByRoot[root] = versionStorage
+ }
+ return storageByRoot[root]!!
+ }
+ }
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/Versions.kt b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/Versions.kt
new file mode 100644
index 0000000..350efb7
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/Versions.kt
@@ -0,0 +1,22 @@
+package dev.arkbuilders.arkmemo.repo.versions
+
+import android.util.Log
+import dev.arkbuilders.arklib.ResourceId
+import dev.arkbuilders.arklib.data.storage.Monoid
+
+typealias Versions = Set
+
+object VersionsMonoid : Monoid {
+ override val neutral: Versions = setOf()
+
+ override fun combine(
+ a: Versions,
+ b: Versions,
+ ): Versions {
+ val result = a.union(b)
+ Log.d(LOG_PREFIX, "merging $a and $b into $result")
+ return result
+ }
+}
+
+internal val LOG_PREFIX: String = "[versions]"
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionsStorage.kt b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionsStorage.kt
new file mode 100644
index 0000000..c0c3a9d
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionsStorage.kt
@@ -0,0 +1,17 @@
+package dev.arkbuilders.arkmemo.repo.versions
+
+import dev.arkbuilders.arklib.ResourceId
+import dev.arkbuilders.arklib.data.storage.Storage
+
+interface VersionsStorage : Storage {
+ fun setParents(
+ child: ResourceId,
+ parents: Versions,
+ ) = setValue(child, parents)
+
+ fun getParents(child: ResourceId): Versions = getValue(child)
+
+ fun removeParents(child: ResourceId) {
+ remove(child)
+ }
+}
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionsStorageRepo.kt b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionsStorageRepo.kt
new file mode 100644
index 0000000..b561958
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/repo/versions/VersionsStorageRepo.kt
@@ -0,0 +1,3 @@
+package dev.arkbuilders.arkmemo.repo.versions
+
+class VersionsStorageRepo
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/adapters/BrushAdapter.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/adapters/BrushAdapter.kt
index 5bdceab..43efb85 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/adapters/BrushAdapter.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/adapters/BrushAdapter.kt
@@ -77,16 +77,22 @@ class BrushAdapter(
is BrushColorBlack ->
holder.ivBrush.imageTintList = context.getColorStateList(R.color.black)
+
is BrushColorBlue ->
holder.ivBrush.imageTintList = context.getColorStateList(R.color.brush_color_blue)
+
is BrushColorGreen ->
holder.ivBrush.imageTintList = context.getColorStateList(R.color.brush_color_green)
+
is BrushColorGrey ->
holder.ivBrush.imageTintList = context.getColorStateList(R.color.brush_color_grey)
+
is BrushColorOrange ->
holder.ivBrush.imageTintList = context.getColorStateList(R.color.brush_color_orange)
+
is BrushColorPurple ->
holder.ivBrush.imageTintList = context.getColorStateList(R.color.brush_color_purple)
+
is BrushColorRed ->
holder.ivBrush.imageTintList = context.getColorStateList(R.color.brush_color_red)
}
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 9a6036f..200559b 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
@@ -66,7 +66,8 @@ class NotesListAdapter(
parent: ViewGroup,
viewType: Int,
): NoteViewHolder {
- val binding = AdapterTextNoteBinding.inflate(LayoutInflater.from(parent.context), parent, false)
+ val binding =
+ AdapterTextNoteBinding.inflate(LayoutInflater.from(parent.context), parent, false)
binding.root.clipToOutline = true
return NoteViewHolder(binding.root)
}
@@ -178,13 +179,16 @@ class NotesListAdapter(
is ArkMediaPlayerSideEffect.StartPlaying -> {
showPlayingState(holder)
}
+
is ArkMediaPlayerSideEffect.PausePlaying -> {
showPlaybackIdleState(holder, isPaused = true)
}
+
is ArkMediaPlayerSideEffect.StopPlaying -> {
showPlaybackIdleState(holder)
holder.tvPlayingPosition.gone()
}
+
is ArkMediaPlayerSideEffect.ResumePlaying -> {
showPlayingState(holder)
}
@@ -296,7 +300,8 @@ class NotesListAdapter(
private val clickNoteToEditListener =
View.OnClickListener {
- val storageFolderExist = (activity.fragment as? NotesFragment)?.checkForStorageExistence() ?: true
+ val storageFolderExist =
+ (activity.fragment as? NotesFragment)?.checkForStorageExistence() ?: true
if (!storageFolderExist) {
return@OnClickListener
}
@@ -308,11 +313,15 @@ class NotesListAdapter(
}
var tag = EditTextNotesFragment.TAG
when (val selectedNote = notes[bindingAdapterPosition]) {
- is TextNote -> activity.fragment = EditTextNotesFragment.newInstance(selectedNote)
+ is TextNote ->
+ activity.fragment =
+ EditTextNotesFragment.newInstance(selectedNote)
+
is GraphicNote -> {
activity.fragment = EditGraphicNotesFragment.newInstance(selectedNote)
tag = EditGraphicNotesFragment.TAG
}
+
is VoiceNote -> {
activity.fragment = ArkRecorderFragment.newInstance(selectedNote)
tag = ArkRecorderFragment.TAG
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/dialogs/FilePickerDialog.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/dialogs/FilePickerDialog.kt
index 01d0098..7c661df 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/dialogs/FilePickerDialog.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/dialogs/FilePickerDialog.kt
@@ -20,7 +20,8 @@ import javax.inject.Inject
@AndroidEntryPoint
class FilePickerDialog : ArkFilePickerFragment() {
- @Inject lateinit var memoPreferences: MemoPreferences
+ @Inject
+ lateinit var memoPreferences: MemoPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/AboutFragment.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/AboutFragment.kt
index 7fd5ef6..12d7db3 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/AboutFragment.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/AboutFragment.kt
@@ -31,7 +31,8 @@ open class AboutFragment : Fragment(R.layout.fragment_about) {
binding.toolbarCustom.tvRightActionText.gone()
binding.toolbarCustom.ivRightActionIcon.gone()
- binding.tvAppVersion.text = getString(R.string.setting_app_version, BuildConfig.VERSION_NAME)
+ binding.tvAppVersion.text =
+ getString(R.string.setting_app_version, BuildConfig.VERSION_NAME)
initSettingActions()
}
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/ArkMediaPlayerFragment.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/ArkMediaPlayerFragment.kt
index b388f11..ee610bf 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/ArkMediaPlayerFragment.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/ArkMediaPlayerFragment.kt
@@ -105,13 +105,16 @@ class ArkMediaPlayerFragment : BaseEditNoteFragment() {
ArkMediaPlayerSideEffect.StartPlaying -> {
showPauseIcon()
}
+
ArkMediaPlayerSideEffect.StopPlaying -> {
showPlayIcon()
binding.layoutAudioView.animAudioPlaying.resetWave()
}
+
ArkMediaPlayerSideEffect.PausePlaying -> {
showPlayIcon()
}
+
ArkMediaPlayerSideEffect.ResumePlaying -> {
showPauseIcon()
}
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/ArkRecorderFragment.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/ArkRecorderFragment.kt
index 9e0de0f..aa13ce6 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/ArkRecorderFragment.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/ArkRecorderFragment.kt
@@ -155,7 +155,8 @@ class ArkRecorderFragment : BaseEditNoteFragment() {
start: Int,
count: Int,
after: Int,
- ) {}
+ ) {
+ }
override fun onTextChanged(
s: CharSequence?,
@@ -272,6 +273,7 @@ class ArkRecorderFragment : BaseEditNoteFragment() {
binding.layoutAudioView.root.gone()
binding.layoutAudioRecord.tvRecordGuide.gone()
}
+
is RecorderSideEffect.StopRecording -> {
val recordIcon =
ResourcesCompat.getDrawable(
@@ -298,6 +300,7 @@ class ArkRecorderFragment : BaseEditNoteFragment() {
getString(R.string.audio_record_guide_text_replace)
binding.layoutAudioRecord.tvDuration.setText(R.string.ark_memo_duration_default)
}
+
RecorderSideEffect.PauseRecording -> {
val resumeIcon =
ResourcesCompat.getDrawable(
@@ -308,6 +311,7 @@ class ArkRecorderFragment : BaseEditNoteFragment() {
ivPauseResume.setImageDrawable(resumeIcon)
pauseOrResumeRecordingAnimation(false)
}
+
RecorderSideEffect.ResumeRecording -> {
showPauseIcon()
pauseOrResumeRecordingAnimation(true)
@@ -322,6 +326,7 @@ class ArkRecorderFragment : BaseEditNoteFragment() {
binding.layoutAudioView.ivPlayAudio.setImageResource(R.drawable.ic_pause_circle)
binding.layoutAudioView.animAudioPlaying.background = null
}
+
ArkMediaPlayerSideEffect.StopPlaying -> {
binding.layoutAudioView.ivPlayAudio.setImageResource(R.drawable.ic_play_circle)
mediaPlayViewModel.getDurationString { duration ->
@@ -330,11 +335,14 @@ class ArkRecorderFragment : BaseEditNoteFragment() {
binding.layoutAudioView.tvPlayingPosition.gone()
binding.layoutAudioView.animAudioPlaying.resetWave()
binding.layoutAudioView.animAudioPlaying.invalidateWave(0)
- binding.layoutAudioView.animAudioPlaying.background = ContextCompat.getDrawable(activity, R.drawable.audio_wave_thumb)
+ binding.layoutAudioView.animAudioPlaying.background =
+ ContextCompat.getDrawable(activity, R.drawable.audio_wave_thumb)
}
+
ArkMediaPlayerSideEffect.PausePlaying -> {
binding.layoutAudioView.ivPlayAudio.setImageResource(R.drawable.ic_play_circle)
}
+
ArkMediaPlayerSideEffect.ResumePlaying -> {
binding.layoutAudioView.ivPlayAudio.setImageResource(R.drawable.ic_pause_circle)
}
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
index f5842a0..bc8346d 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/BaseEditNoteFragment.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/BaseEditNoteFragment.kt
@@ -105,7 +105,8 @@ abstract class BaseEditNoteFragment : BaseFragment() {
"dd MMM yyyy', 'hh:mm aa",
calendar,
).toString()
- binding.tvLastModified.text = getString(R.string.note_last_modified_time, lastModifiedTime)
+ binding.tvLastModified.text =
+ getString(R.string.note_last_modified_time, lastModifiedTime)
}
}
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 4b5df1f..621d13b 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
@@ -88,7 +88,8 @@ class EditGraphicNotesFragment : BaseEditNoteFragment() {
start: Int,
count: Int,
after: Int,
- ) {}
+ ) {
+ }
override fun onTextChanged(
s: CharSequence?,
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 a014392..60118fa 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
@@ -41,7 +41,12 @@ class EditTextNotesFragment : BaseEditNoteFragment() {
clipBoardText.length + cursorPos
}
try {
- newTextBuilder.append(noteContent.insertStringAtPosition(clipBoardText, cursorPos))
+ newTextBuilder.append(
+ noteContent.insertStringAtPosition(
+ clipBoardText,
+ cursorPos,
+ ),
+ )
} catch (e: IndexOutOfBoundsException) {
ALog.e(TAG, "pasteNoteClickListener exception: ${e.message}")
newTextBuilder.append(noteContent).append(clipBoardText)
@@ -93,7 +98,8 @@ class EditTextNotesFragment : BaseEditNoteFragment() {
start: Int,
count: Int,
after: Int,
- ) {}
+ ) {
+ }
override fun onTextChanged(
s: CharSequence?,
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 ce24676..222627f 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
@@ -368,7 +368,8 @@ class NotesFragment : BaseFragment() {
this.itemAnimator =
object : DefaultItemAnimator() {
override fun canReuseUpdatedViewHolder(viewHolder: RecyclerView.ViewHolder): Boolean {
- val isSwiping = (viewHolder as? NotesListAdapter.NoteViewHolder)?.isSwiping ?: false
+ val isSwiping =
+ (viewHolder as? NotesListAdapter.NoteViewHolder)?.isSwiping ?: false
return !isSwiping
}
}
@@ -440,7 +441,10 @@ class NotesFragment : BaseFragment() {
if (arkMediaPlayerViewModel.isPlaying()) {
playingAudioPath?.let {
arkMediaPlayerViewModel.onPlayOrPauseClick(it)
- (notesAdapter?.getNotes()?.getOrNull(playingAudioPosition) as? VoiceNote)?.isPlaying = false
+ (
+ notesAdapter?.getNotes()
+ ?.getOrNull(playingAudioPosition) as? VoiceNote
+ )?.isPlaying = false
notesAdapter?.notifyItemChanged(playingAudioPosition)
}
}
@@ -587,7 +591,11 @@ class NotesFragment : BaseFragment() {
selectedCountForDelete,
selectedCountForDelete,
),
- message = resources.getQuantityString(R.plurals.delete_batch_note_message, selectedCountForDelete),
+ message =
+ resources.getQuantityString(
+ R.plurals.delete_batch_note_message,
+ selectedCountForDelete,
+ ),
positiveText = R.string.action_delete,
negativeText = R.string.ark_memo_cancel,
isAlert = true,
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/VersionsFragment.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/VersionsFragment.kt
new file mode 100644
index 0000000..4e73680
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/fragments/VersionsFragment.kt
@@ -0,0 +1,122 @@
+package dev.arkbuilders.arkmemo.ui.fragments
+
+import android.os.Build
+import android.os.Build.VERSION.SDK_INT
+import android.os.Bundle
+import android.view.View
+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 dagger.hilt.android.AndroidEntryPoint
+import dev.arkbuilders.arkmemo.R
+import dev.arkbuilders.arkmemo.models.Note
+import dev.arkbuilders.arkmemo.ui.activities.MainActivity
+import dev.arkbuilders.arkmemo.ui.adapters.NotesListAdapter
+import dev.arkbuilders.arkmemo.ui.viewmodels.NotesViewModel
+import dev.arkbuilders.arkmemo.ui.viewmodels.VersionsViewModel
+import kotlinx.coroutines.launch
+
+@AndroidEntryPoint
+class VersionsFragment : BaseFragment() {
+ private val activity by lazy {
+ requireActivity() as MainActivity
+ }
+ private val childFragManager by lazy {
+ childFragmentManager
+ }
+
+ private val versionsViewModel: VersionsViewModel by activityViewModels()
+ private val notesViewModel: NotesViewModel by activityViewModels()
+
+ private lateinit var rvNotes: RecyclerView
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ versionsViewModel.init()
+ notesViewModel.init {}
+ readArguments()
+ }
+
+ override fun onViewCreated(
+ view: View,
+ savedInstanceState: Bundle?,
+ ) {
+ super.onViewCreated(view, savedInstanceState)
+ initUI()
+ observeViewModel()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ activity.fragment = this
+ }
+
+ private fun observeViewModel() {
+ lifecycleScope.launch {
+ repeatOnLifecycle(Lifecycle.State.CREATED) {
+ notesViewModel.readAllNotes {
+ versionsViewModel.getLatestNoteFamilyTree(it) { notes ->
+ val adapter =
+ NotesListAdapter(
+ notes.toMutableList(),
+ /*isLatestNote = { note ->
+ val resourceId = note.resource?.id!!
+ versionsViewModel.isLatestResource(resourceId) ||
+ versionsViewModel.isNotVersioned(resourceId)
+ },*/
+ onPlayPauseClick = { _, _, _ -> },
+ )
+ val layoutManager = LinearLayoutManager(requireContext())
+ adapter.setActivity(activity)
+ // adapter.setFragmentManager(childFragManager)
+ // adapter.showVersionFork(true)
+ rvNotes.apply {
+ this.adapter = adapter
+ this.layoutManager = layoutManager
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private fun initUI() {
+ activity.title = getString(R.string.ark_memo_history)
+ activity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
+ // rvNotes = binding.rvNotesBinding.rvNotes
+ }
+
+ private fun readArguments() {
+ if (arguments != null) {
+ if (SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ requireArguments().getParcelable(NOTE_KEY, Note::class.java)?.let {
+ versionsViewModel.updateLatestResourceId(it.resource?.id!!)
+ }
+ } else {
+ requireArguments().getParcelable(NOTE_KEY)?.let {
+ versionsViewModel.updateLatestResourceId(it.resource?.id!!)
+ }
+ }
+ }
+ }
+
+ override fun onBackPressed() {
+ TODO("Not yet implemented")
+ }
+
+ companion object {
+ const val TAG = "versions-fragment"
+ const val NOTE_KEY = "note key"
+
+ fun newInstance(note: Note) =
+ VersionsFragment().apply {
+ arguments =
+ Bundle().apply {
+ putParcelable(NOTE_KEY, note)
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/viewmodels/GraphicNotesViewModel.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/viewmodels/GraphicNotesViewModel.kt
index 50d3782..5b04f01 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/viewmodels/GraphicNotesViewModel.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/viewmodels/GraphicNotesViewModel.kt
@@ -27,15 +27,16 @@ class GraphicNotesViewModel
private const val TAG = "GraphicNotesViewModel"
}
- val paint get() =
- Paint().also {
- it.color = paintColor
- it.style = Paint.Style.STROKE
- it.strokeWidth = strokeWidth
- it.strokeCap = Paint.Cap.ROUND
- it.strokeJoin = Paint.Join.ROUND
- it.isAntiAlias = true
- }
+ val paint
+ get() =
+ Paint().also {
+ it.color = paintColor
+ it.style = Paint.Style.STROKE
+ it.strokeWidth = strokeWidth
+ it.strokeCap = Paint.Cap.ROUND
+ it.strokeJoin = Paint.Join.ROUND
+ it.isAntiAlias = true
+ }
private val editPaths = ArrayDeque()
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/viewmodels/VersionsViewModel.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/viewmodels/VersionsViewModel.kt
new file mode 100644
index 0000000..2345d57
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/viewmodels/VersionsViewModel.kt
@@ -0,0 +1,94 @@
+package dev.arkbuilders.arkmemo.ui.viewmodels
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import dagger.hilt.android.lifecycle.HiltViewModel
+import dev.arkbuilders.arklib.ResourceId
+import dev.arkbuilders.arkmemo.models.Note
+import dev.arkbuilders.arkmemo.repo.versions.Version
+import dev.arkbuilders.arkmemo.repo.versions.VersionStorage
+import dev.arkbuilders.arkmemo.repo.versions.VersionStorageRepo
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class VersionsViewModel
+ @Inject
+ constructor(
+ private val versionStorageRepo: VersionStorageRepo,
+ ) : ViewModel() {
+ private lateinit var versionStorage: VersionStorage
+ private val latestResourceId = MutableStateFlow(null)
+
+ fun init() {
+ viewModelScope.launch {
+ versionStorage = versionStorageRepo.provide()
+ }
+ }
+
+ fun getLatestNotes(
+ notes: List,
+ emit: (List) -> Unit,
+ ) {
+ viewModelScope.launch {
+ val latestNotes =
+ notes.filter {
+ getChildNotParentIds().contains(it.resource?.id) ||
+ isNotVersioned(it.resource?.id!!)
+ }
+ emit(latestNotes)
+ }
+ }
+
+ fun getLatestNoteFamilyTree(
+ notes: List,
+ emit: (List) -> Unit,
+ ) {
+ viewModelScope.launch {
+ latestResourceId.collectLatest { id ->
+ id?.let {
+ val familyTree =
+ notes.filter {
+ getParentIds(id).contains(it.resource?.id) || it.resource?.id == id
+ }
+ emit(familyTree)
+ }
+ }
+ }
+ }
+
+ fun updateLatestResourceId(newId: ResourceId) {
+ viewModelScope.launch {
+ latestResourceId.emit(newId)
+ }
+ }
+
+ fun getParentIds(id: ResourceId): List = versionStorage.parentsTreeByChild(id)[id]!!
+
+ fun createVersion(
+ oldId: ResourceId,
+ newId: ResourceId,
+ ) {
+ viewModelScope.launch(Dispatchers.IO) {
+ val version = Version(oldId, newId)
+ versionStorage.add(version)
+ }
+ }
+
+ fun getChildNotParentIds(): List = versionStorage.childrenNotParents()
+
+ fun isNotVersioned(id: ResourceId): Boolean = !isVersioned(id)
+
+ fun isVersioned(id: ResourceId): Boolean = versionStorage.contains(id)
+
+ fun onDelete(id: ResourceId) {
+ viewModelScope.launch {
+ versionStorage.forget(id)
+ }
+ }
+
+ fun isLatestResource(id: ResourceId): Boolean = versionStorage.isLatestResourceVersion(id)
+ }
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/views/NotesCanvas.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/views/NotesCanvas.kt
index a14d114..f9a80ac 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/views/NotesCanvas.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/views/NotesCanvas.kt
@@ -57,6 +57,7 @@ class NotesCanvas(context: Context, attrs: AttributeSet) : View(context, attrs)
currentX = x
currentY = y
}
+
MotionEvent.ACTION_MOVE -> {
val x2 = (currentX + x) / 2
val y2 = (currentY + y) / 2
@@ -72,6 +73,7 @@ class NotesCanvas(context: Context, attrs: AttributeSet) : View(context, attrs)
currentX = x
currentY = y
}
+
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
path = Path()
finishDrawing = true
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/ui/views/SettingTextView.kt b/app/src/main/java/dev/arkbuilders/arkmemo/ui/views/SettingTextView.kt
index 77bfc3c..8b69188 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/ui/views/SettingTextView.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/ui/views/SettingTextView.kt
@@ -25,7 +25,8 @@ class SettingTextView
val iconResId = typedArray.getResourceId(R.styleable.SettingTextView_stv_icon, 0)
val enableSwitch =
typedArray.getBoolean(R.styleable.SettingTextView_stv_switch_on, false)
- val switchChecked = typedArray.getBoolean(R.styleable.SettingTextView_stv_switch_checked, false)
+ val switchChecked =
+ typedArray.getBoolean(R.styleable.SettingTextView_stv_switch_checked, false)
textResId?.let {
binding.tvText.text = textResId
}
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/utils/ArkFiles.kt b/app/src/main/java/dev/arkbuilders/arkmemo/utils/ArkFiles.kt
new file mode 100644
index 0000000..239ba81
--- /dev/null
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/utils/ArkFiles.kt
@@ -0,0 +1,5 @@
+package space.taran.arkmemo.utils
+
+import java.nio.file.Path
+
+fun Path.arkVersions(): Path = resolve("versions")
diff --git a/app/src/main/java/dev/arkbuilders/arkmemo/utils/Constants.kt b/app/src/main/java/dev/arkbuilders/arkmemo/utils/Constants.kt
index 2292dcf..760d35c 100644
--- a/app/src/main/java/dev/arkbuilders/arkmemo/utils/Constants.kt
+++ b/app/src/main/java/dev/arkbuilders/arkmemo/utils/Constants.kt
@@ -2,3 +2,7 @@ package dev.arkbuilders.arkmemo.utils
// shared preferences
const val CRASH_REPORT_ENABLE = "crash_report_enable"
+
+const val NOTE_KEY = "note key"
+
+const val NOTE_PASTE_KEY = "note paste key"
diff --git a/app/src/main/res/drawable/audio_wave_thumb.xml b/app/src/main/res/drawable/audio_wave_thumb.xml
index fc0fa4f..77eb273 100644
--- a/app/src/main/res/drawable/audio_wave_thumb.xml
+++ b/app/src/main/res/drawable/audio_wave_thumb.xml
@@ -3,230 +3,229 @@
android:height="32dp"
android:viewportWidth="226"
android:viewportHeight="32">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/bg_audio_view.xml b/app/src/main/res/drawable/bg_audio_view.xml
index 54f8cd0..9384161 100644
--- a/app/src/main/res/drawable/bg_audio_view.xml
+++ b/app/src/main/res/drawable/bg_audio_view.xml
@@ -1,7 +1,7 @@
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_big_radius.xml b/app/src/main/res/drawable/bg_big_radius.xml
index 50ecc27..500ea08 100644
--- a/app/src/main/res/drawable/bg_big_radius.xml
+++ b/app/src/main/res/drawable/bg_big_radius.xml
@@ -1,8 +1,10 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_border_r8.xml b/app/src/main/res/drawable/bg_border_r8.xml
index 393262b..ac7e215 100644
--- a/app/src/main/res/drawable/bg_border_r8.xml
+++ b/app/src/main/res/drawable/bg_border_r8.xml
@@ -1,7 +1,9 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_brush_color_black.xml b/app/src/main/res/drawable/bg_brush_color_black.xml
index 76ea175..cefe3e3 100644
--- a/app/src/main/res/drawable/bg_brush_color_black.xml
+++ b/app/src/main/res/drawable/bg_brush_color_black.xml
@@ -2,6 +2,6 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_brush_option_selected.xml b/app/src/main/res/drawable/bg_brush_option_selected.xml
index dcc2ae3..537a187 100644
--- a/app/src/main/res/drawable/bg_brush_option_selected.xml
+++ b/app/src/main/res/drawable/bg_brush_option_selected.xml
@@ -2,7 +2,9 @@
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_brush_size.xml b/app/src/main/res/drawable/bg_brush_size.xml
index a3386ef..3a080e5 100644
--- a/app/src/main/res/drawable/bg_brush_size.xml
+++ b/app/src/main/res/drawable/bg_brush_size.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_graphic_control_text_selected.xml b/app/src/main/res/drawable/bg_graphic_control_text_selected.xml
index abea4a6..80b627f 100644
--- a/app/src/main/res/drawable/bg_graphic_control_text_selected.xml
+++ b/app/src/main/res/drawable/bg_graphic_control_text_selected.xml
@@ -1,7 +1,9 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_negative_button.xml b/app/src/main/res/drawable/bg_negative_button.xml
index f057d28..a5e8602 100644
--- a/app/src/main/res/drawable/bg_negative_button.xml
+++ b/app/src/main/res/drawable/bg_negative_button.xml
@@ -1,5 +1,7 @@
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_positive_button.xml b/app/src/main/res/drawable/bg_positive_button.xml
index b6e7a75..322a278 100644
--- a/app/src/main/res/drawable/bg_positive_button.xml
+++ b/app/src/main/res/drawable/bg_positive_button.xml
@@ -1,7 +1,7 @@
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_rect_button.xml b/app/src/main/res/drawable/bg_rect_button.xml
index e3af5f6..840912c 100644
--- a/app/src/main/res/drawable/bg_rect_button.xml
+++ b/app/src/main/res/drawable/bg_rect_button.xml
@@ -1,7 +1,7 @@
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_red_button.xml b/app/src/main/res/drawable/bg_red_button.xml
index fc5f8fa..deb79db 100644
--- a/app/src/main/res/drawable/bg_red_button.xml
+++ b/app/src/main/res/drawable/bg_red_button.xml
@@ -1,7 +1,7 @@
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_round_button.xml b/app/src/main/res/drawable/bg_round_button.xml
index eb1a146..f170506 100644
--- a/app/src/main/res/drawable/bg_round_button.xml
+++ b/app/src/main/res/drawable/bg_round_button.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_selected_brush.xml b/app/src/main/res/drawable/bg_selected_brush.xml
index 4db2e2b..09aadb0 100644
--- a/app/src/main/res/drawable/bg_selected_brush.xml
+++ b/app/src/main/res/drawable/bg_selected_brush.xml
@@ -1,5 +1,7 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_tag.xml b/app/src/main/res/drawable/bg_tag.xml
index 2acea47..af519ec 100644
--- a/app/src/main/res/drawable/bg_tag.xml
+++ b/app/src/main/res/drawable/bg_tag.xml
@@ -1,8 +1,10 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml
index e40b9ce..5b7fb66 100644
--- a/app/src/main/res/drawable/ic_add.xml
+++ b/app/src/main/res/drawable/ic_add.xml
@@ -3,11 +3,11 @@
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
-
+
diff --git a/app/src/main/res/drawable/ic_app_logo.xml b/app/src/main/res/drawable/ic_app_logo.xml
index f521309..a473050 100644
--- a/app/src/main/res/drawable/ic_app_logo.xml
+++ b/app/src/main/res/drawable/ic_app_logo.xml
@@ -4,176 +4,211 @@
android:height="90dp"
android:viewportWidth="69"
android:viewportHeight="90">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_attach.xml b/app/src/main/res/drawable/ic_attach.xml
index 81c095d..031597b 100644
--- a/app/src/main/res/drawable/ic_attach.xml
+++ b/app/src/main/res/drawable/ic_attach.xml
@@ -3,11 +3,11 @@
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
-
+
diff --git a/app/src/main/res/drawable/ic_brush.xml b/app/src/main/res/drawable/ic_brush.xml
index 0a0ba49..6cc4edc 100644
--- a/app/src/main/res/drawable/ic_brush.xml
+++ b/app/src/main/res/drawable/ic_brush.xml
@@ -3,11 +3,11 @@
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
-
+
diff --git a/app/src/main/res/drawable/ic_btc.xml b/app/src/main/res/drawable/ic_btc.xml
index 7187b7c..3e3754d 100644
--- a/app/src/main/res/drawable/ic_btc.xml
+++ b/app/src/main/res/drawable/ic_btc.xml
@@ -3,10 +3,10 @@
android:height="20dp"
android:viewportWidth="64"
android:viewportHeight="64">
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_chevron_down.xml b/app/src/main/res/drawable/ic_chevron_down.xml
index 9e345b8..8444075 100644
--- a/app/src/main/res/drawable/ic_chevron_down.xml
+++ b/app/src/main/res/drawable/ic_chevron_down.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_chevron_left.xml b/app/src/main/res/drawable/ic_chevron_left.xml
index 0b95c72..d42ba52 100644
--- a/app/src/main/res/drawable/ic_chevron_left.xml
+++ b/app/src/main/res/drawable/ic_chevron_left.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_chevron_right.xml b/app/src/main/res/drawable/ic_chevron_right.xml
index 19ec5a5..cfd0425 100644
--- a/app/src/main/res/drawable/ic_chevron_right.xml
+++ b/app/src/main/res/drawable/ic_chevron_right.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_clipboard.xml b/app/src/main/res/drawable/ic_clipboard.xml
index 35c2de3..9b52d1f 100644
--- a/app/src/main/res/drawable/ic_clipboard.xml
+++ b/app/src/main/res/drawable/ic_clipboard.xml
@@ -3,11 +3,11 @@
android:height="20dp"
android:viewportWidth="21"
android:viewportHeight="20">
-
+
diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml
index b49044b..0656d56 100644
--- a/app/src/main/res/drawable/ic_close.xml
+++ b/app/src/main/res/drawable/ic_close.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_coffee.xml b/app/src/main/res/drawable/ic_coffee.xml
index b35c55a..0ac8c6d 100644
--- a/app/src/main/res/drawable/ic_coffee.xml
+++ b/app/src/main/res/drawable/ic_coffee.xml
@@ -3,13 +3,13 @@
android:height="20dp"
android:viewportWidth="14"
android:viewportHeight="20">
-
-
-
+
+
+
diff --git a/app/src/main/res/drawable/ic_content_copy.xml b/app/src/main/res/drawable/ic_content_copy.xml
new file mode 100644
index 0000000..3318169
--- /dev/null
+++ b/app/src/main/res/drawable/ic_content_copy.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_copy.xml b/app/src/main/res/drawable/ic_copy.xml
index d4e87aa..e0a1274 100644
--- a/app/src/main/res/drawable/ic_copy.xml
+++ b/app/src/main/res/drawable/ic_copy.xml
@@ -3,11 +3,11 @@
android:height="21dp"
android:viewportWidth="20"
android:viewportHeight="21">
-
+
diff --git a/app/src/main/res/drawable/ic_crash_report.xml b/app/src/main/res/drawable/ic_crash_report.xml
index feab177..84ec076 100644
--- a/app/src/main/res/drawable/ic_crash_report.xml
+++ b/app/src/main/res/drawable/ic_crash_report.xml
@@ -1,5 +1,12 @@
-
-
-
-
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_debug_log.xml b/app/src/main/res/drawable/ic_debug_log.xml
index 1a5ade0..95736ee 100644
--- a/app/src/main/res/drawable/ic_debug_log.xml
+++ b/app/src/main/res/drawable/ic_debug_log.xml
@@ -3,7 +3,7 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_delete_note.xml b/app/src/main/res/drawable/ic_delete_note.xml
index 69fe363..0828605 100644
--- a/app/src/main/res/drawable/ic_delete_note.xml
+++ b/app/src/main/res/drawable/ic_delete_note.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_discord.xml b/app/src/main/res/drawable/ic_discord.xml
index 6a1db0b..7773be0 100644
--- a/app/src/main/res/drawable/ic_discord.xml
+++ b/app/src/main/res/drawable/ic_discord.xml
@@ -3,10 +3,10 @@
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_download.xml b/app/src/main/res/drawable/ic_download.xml
index 1dec4c5..2e09cc3 100644
--- a/app/src/main/res/drawable/ic_download.xml
+++ b/app/src/main/res/drawable/ic_download.xml
@@ -3,11 +3,11 @@
android:height="21dp"
android:viewportWidth="21"
android:viewportHeight="21">
-
+
diff --git a/app/src/main/res/drawable/ic_draw.xml b/app/src/main/res/drawable/ic_draw.xml
index 473602c..1b2899a 100644
--- a/app/src/main/res/drawable/ic_draw.xml
+++ b/app/src/main/res/drawable/ic_draw.xml
@@ -3,11 +3,11 @@
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
-
+
diff --git a/app/src/main/res/drawable/ic_edit.xml b/app/src/main/res/drawable/ic_edit.xml
index f910e6e..f390e5b 100644
--- a/app/src/main/res/drawable/ic_edit.xml
+++ b/app/src/main/res/drawable/ic_edit.xml
@@ -3,15 +3,14 @@
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
-
-
-
-
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_eraser.xml b/app/src/main/res/drawable/ic_eraser.xml
index ab1f850..2efc611 100644
--- a/app/src/main/res/drawable/ic_eraser.xml
+++ b/app/src/main/res/drawable/ic_eraser.xml
@@ -3,11 +3,11 @@
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
-
+
diff --git a/app/src/main/res/drawable/ic_eth.xml b/app/src/main/res/drawable/ic_eth.xml
index bea67e5..a076a76 100644
--- a/app/src/main/res/drawable/ic_eth.xml
+++ b/app/src/main/res/drawable/ic_eth.xml
@@ -3,23 +3,22 @@
android:height="20dp"
android:viewportWidth="13"
android:viewportHeight="20">
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_feedback.xml b/app/src/main/res/drawable/ic_feedback.xml
index 7cfbaed..1fe8c9d 100644
--- a/app/src/main/res/drawable/ic_feedback.xml
+++ b/app/src/main/res/drawable/ic_feedback.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_globe.xml b/app/src/main/res/drawable/ic_globe.xml
index 21cdcc8..5b6a470 100644
--- a/app/src/main/res/drawable/ic_globe.xml
+++ b/app/src/main/res/drawable/ic_globe.xml
@@ -3,21 +3,21 @@
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
-
-
-
+
+
+
diff --git a/app/src/main/res/drawable/ic_history.xml b/app/src/main/res/drawable/ic_history.xml
new file mode 100644
index 0000000..751e6ad
--- /dev/null
+++ b/app/src/main/res/drawable/ic_history.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_loading.xml b/app/src/main/res/drawable/ic_loading.xml
index b7e568d..9b8b69b 100644
--- a/app/src/main/res/drawable/ic_loading.xml
+++ b/app/src/main/res/drawable/ic_loading.xml
@@ -3,11 +3,11 @@
android:height="72dp"
android:viewportWidth="73"
android:viewportHeight="72">
-
+
diff --git a/app/src/main/res/drawable/ic_mic.xml b/app/src/main/res/drawable/ic_mic.xml
index 5eb92eb..9e76733 100644
--- a/app/src/main/res/drawable/ic_mic.xml
+++ b/app/src/main/res/drawable/ic_mic.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_no_notes.xml b/app/src/main/res/drawable/ic_no_notes.xml
index 499be61..d2c8dda 100644
--- a/app/src/main/res/drawable/ic_no_notes.xml
+++ b/app/src/main/res/drawable/ic_no_notes.xml
@@ -3,34 +3,34 @@
android:height="72dp"
android:viewportWidth="73"
android:viewportHeight="72">
-
-
-
-
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_note.xml b/app/src/main/res/drawable/ic_note.xml
new file mode 100644
index 0000000..938624e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_note.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_patreon.xml b/app/src/main/res/drawable/ic_patreon.xml
index e6aa6e2..36b203d 100644
--- a/app/src/main/res/drawable/ic_patreon.xml
+++ b/app/src/main/res/drawable/ic_patreon.xml
@@ -3,7 +3,7 @@
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
-
+
diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml
index 9b16bde..5fd15cc 100644
--- a/app/src/main/res/drawable/ic_pause.xml
+++ b/app/src/main/res/drawable/ic_pause.xml
@@ -1,5 +1,12 @@
-
-
-
-
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_pause_circle.xml b/app/src/main/res/drawable/ic_pause_circle.xml
index 0e99ff7..0ecc0b3 100644
--- a/app/src/main/res/drawable/ic_pause_circle.xml
+++ b/app/src/main/res/drawable/ic_pause_circle.xml
@@ -3,15 +3,15 @@
android:height="32dp"
android:viewportWidth="33"
android:viewportHeight="32">
-
-
-
+
+
+
diff --git a/app/src/main/res/drawable/ic_photo.xml b/app/src/main/res/drawable/ic_photo.xml
index af4acbd..f95fa45 100644
--- a/app/src/main/res/drawable/ic_photo.xml
+++ b/app/src/main/res/drawable/ic_photo.xml
@@ -3,11 +3,11 @@
android:height="18dp"
android:viewportWidth="20"
android:viewportHeight="18">
-
+
diff --git a/app/src/main/res/drawable/ic_pin.xml b/app/src/main/res/drawable/ic_pin.xml
index 5e53f3f..fd36c1b 100644
--- a/app/src/main/res/drawable/ic_pin.xml
+++ b/app/src/main/res/drawable/ic_pin.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_play.xml b/app/src/main/res/drawable/ic_play.xml
index e3fd2e9..c055f09 100644
--- a/app/src/main/res/drawable/ic_play.xml
+++ b/app/src/main/res/drawable/ic_play.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_play_circle.xml b/app/src/main/res/drawable/ic_play_circle.xml
index c9d94e8..d139487 100644
--- a/app/src/main/res/drawable/ic_play_circle.xml
+++ b/app/src/main/res/drawable/ic_play_circle.xml
@@ -3,12 +3,12 @@
android:height="33dp"
android:viewportWidth="32"
android:viewportHeight="33">
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_privacy.xml b/app/src/main/res/drawable/ic_privacy.xml
index a806d77..4554524 100644
--- a/app/src/main/res/drawable/ic_privacy.xml
+++ b/app/src/main/res/drawable/ic_privacy.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_rate.xml b/app/src/main/res/drawable/ic_rate.xml
index a82a6dc..fab0751 100644
--- a/app/src/main/res/drawable/ic_rate.xml
+++ b/app/src/main/res/drawable/ic_rate.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_record.xml b/app/src/main/res/drawable/ic_record.xml
index 57fc55c..4a07582 100644
--- a/app/src/main/res/drawable/ic_record.xml
+++ b/app/src/main/res/drawable/ic_record.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_record_big.xml b/app/src/main/res/drawable/ic_record_big.xml
index 2414e9d..a511123 100644
--- a/app/src/main/res/drawable/ic_record_big.xml
+++ b/app/src/main/res/drawable/ic_record_big.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_record_new.xml b/app/src/main/res/drawable/ic_record_new.xml
index 7bcffce..660e173 100644
--- a/app/src/main/res/drawable/ic_record_new.xml
+++ b/app/src/main/res/drawable/ic_record_new.xml
@@ -3,11 +3,11 @@
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
-
+
diff --git a/app/src/main/res/drawable/ic_record_ongoing.xml b/app/src/main/res/drawable/ic_record_ongoing.xml
index 0e4687b..ba51da5 100644
--- a/app/src/main/res/drawable/ic_record_ongoing.xml
+++ b/app/src/main/res/drawable/ic_record_ongoing.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_record_start_over.xml b/app/src/main/res/drawable/ic_record_start_over.xml
index 1583b14..9ffad8e 100644
--- a/app/src/main/res/drawable/ic_record_start_over.xml
+++ b/app/src/main/res/drawable/ic_record_start_over.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml
index c4f6b40..52ba58c 100644
--- a/app/src/main/res/drawable/ic_search.xml
+++ b/app/src/main/res/drawable/ic_search.xml
@@ -3,11 +3,11 @@
android:height="20dp"
android:viewportWidth="21"
android:viewportHeight="20">
-
+
diff --git a/app/src/main/res/drawable/ic_search_result_empty.xml b/app/src/main/res/drawable/ic_search_result_empty.xml
index 202d743..f896d2c 100644
--- a/app/src/main/res/drawable/ic_search_result_empty.xml
+++ b/app/src/main/res/drawable/ic_search_result_empty.xml
@@ -3,11 +3,11 @@
android:height="72dp"
android:viewportWidth="73"
android:viewportHeight="72">
-
+
diff --git a/app/src/main/res/drawable/ic_selected_brush_type.xml b/app/src/main/res/drawable/ic_selected_brush_type.xml
index 338f567..4715aa5 100644
--- a/app/src/main/res/drawable/ic_selected_brush_type.xml
+++ b/app/src/main/res/drawable/ic_selected_brush_type.xml
@@ -3,13 +3,13 @@
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml
index cbc92c8..c7481fd 100644
--- a/app/src/main/res/drawable/ic_settings.xml
+++ b/app/src/main/res/drawable/ic_settings.xml
@@ -1,5 +1,12 @@
-
-
-
-
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_stop.xml b/app/src/main/res/drawable/ic_stop.xml
index 19bcbee..449a289 100644
--- a/app/src/main/res/drawable/ic_stop.xml
+++ b/app/src/main/res/drawable/ic_stop.xml
@@ -1,5 +1,10 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_stop_record.xml b/app/src/main/res/drawable/ic_stop_record.xml
index 705ad96..bd62f06 100644
--- a/app/src/main/res/drawable/ic_stop_record.xml
+++ b/app/src/main/res/drawable/ic_stop_record.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_telegram.xml b/app/src/main/res/drawable/ic_telegram.xml
index 5b3a706..0cf6d56 100644
--- a/app/src/main/res/drawable/ic_telegram.xml
+++ b/app/src/main/res/drawable/ic_telegram.xml
@@ -3,12 +3,11 @@
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
-
-
-
-
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_terms_of_service.xml b/app/src/main/res/drawable/ic_terms_of_service.xml
index 2eb968c..60aebab 100644
--- a/app/src/main/res/drawable/ic_terms_of_service.xml
+++ b/app/src/main/res/drawable/ic_terms_of_service.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_theme.xml b/app/src/main/res/drawable/ic_theme.xml
index 3b851e1..bd5910c 100644
--- a/app/src/main/res/drawable/ic_theme.xml
+++ b/app/src/main/res/drawable/ic_theme.xml
@@ -3,11 +3,11 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
+
diff --git a/app/src/main/res/drawable/ic_toolbar_about.xml b/app/src/main/res/drawable/ic_toolbar_about.xml
index c9342bc..4c36f90 100644
--- a/app/src/main/res/drawable/ic_toolbar_about.xml
+++ b/app/src/main/res/drawable/ic_toolbar_about.xml
@@ -3,15 +3,14 @@
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
-
-
-
-
+
+
+
+
diff --git a/app/src/main/res/drawable/ripple_border_primary_r8.xml b/app/src/main/res/drawable/ripple_border_primary_r8.xml
index 28e415f..a393425 100644
--- a/app/src/main/res/drawable/ripple_border_primary_r8.xml
+++ b/app/src/main/res/drawable/ripple_border_primary_r8.xml
@@ -1,10 +1,14 @@
-
+
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ripple_donate_copy_text.xml b/app/src/main/res/drawable/ripple_donate_copy_text.xml
index c74a324..e448d79 100644
--- a/app/src/main/res/drawable/ripple_donate_copy_text.xml
+++ b/app/src/main/res/drawable/ripple_donate_copy_text.xml
@@ -1,11 +1,16 @@
-
+
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ripple_note_item.xml b/app/src/main/res/drawable/ripple_note_item.xml
index 4aa0a65..c47c8ee 100644
--- a/app/src/main/res/drawable/ripple_note_item.xml
+++ b/app/src/main/res/drawable/ripple_note_item.xml
@@ -1,9 +1,10 @@
-
+
-
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ripple_support_text.xml b/app/src/main/res/drawable/ripple_support_text.xml
index 28e415f..a393425 100644
--- a/app/src/main/res/drawable/ripple_support_text.xml
+++ b/app/src/main/res/drawable/ripple_support_text.xml
@@ -1,10 +1,14 @@
-
+
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ripple_web_link_text.xml b/app/src/main/res/drawable/ripple_web_link_text.xml
index 23a657f..0a15ec0 100644
--- a/app/src/main/res/drawable/ripple_web_link_text.xml
+++ b/app/src/main/res/drawable/ripple_web_link_text.xml
@@ -1,9 +1,10 @@
-
+
-
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 45cca9f..69d6ef2 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -14,7 +14,7 @@
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
- android:visibility="gone"/>
+ android:visibility="gone" />
+ android:id="@+id/tv_tag" />
diff --git a/app/src/main/res/layout/adapter_text_note.xml b/app/src/main/res/layout/adapter_text_note.xml
index 82ab162..97f7476 100644
--- a/app/src/main/res/layout/adapter_text_note.xml
+++ b/app/src/main/res/layout/adapter_text_note.xml
@@ -20,7 +20,7 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:buttonTint="@color/yellow_700"
- android:visibility="gone"/>
+ android:visibility="gone" />
-
+ tools:text="UX review" />
+ tools:text="How do you create compelling presentations that wow your colleagues and impress your managers?" />
+ tools:visibility="visible" />
+ android:layout_marginTop="12dp" />
+ android:gravity="center" />
diff --git a/app/src/main/res/layout/dialog_common_action.xml b/app/src/main/res/layout/dialog_common_action.xml
index d027b60..3feadd2 100644
--- a/app/src/main/res/layout/dialog_common_action.xml
+++ b/app/src/main/res/layout/dialog_common_action.xml
@@ -17,7 +17,7 @@
android:text="@string/delete_note"
android:layout_marginStart="@dimen/common_padding"
android:layout_marginTop="20dp"
- android:id="@+id/tv_title"/>
+ android:id="@+id/tv_title" />
+ android:id="@+id/iv_close" />
+ android:id="@+id/tv_message" />
+ android:id="@+id/tv_positive" />
+ android:layout_marginBottom="@dimen/common_padding" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_donate_qr.xml b/app/src/main/res/layout/dialog_donate_qr.xml
index efbabd9..a54514a 100644
--- a/app/src/main/res/layout/dialog_donate_qr.xml
+++ b/app/src/main/res/layout/dialog_donate_qr.xml
@@ -17,7 +17,7 @@
android:text="@string/setting_donate_btc"
android:layout_marginStart="@dimen/common_padding"
android:layout_marginTop="20dp"
- android:id="@+id/tv_title"/>
+ android:id="@+id/tv_title" />
-
+ android:id="@+id/tv_message" />
+
+ android:id="@+id/iv_qr" />
+ android:id="@+id/tv_address" />
+ android:drawablePadding="6dp" />
diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml
index a2cd1d7..b975144 100644
--- a/app/src/main/res/layout/fragment_about.xml
+++ b/app/src/main/res/layout/fragment_about.xml
@@ -5,10 +5,11 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
-
+ android:id="@+id/toolbar_custom" />
+ android:id="@+id/iv_app_logo" />
+ android:id="@+id/tv_app_name" />
+ android:id="@+id/tv_app_version" />
+ android:id="@+id/tv_app_author" />
+ android:id="@+id/tv_app_copyright" />
+ app:web_link_icon="@drawable/ic_telegram" />
+ app:web_link_icon="@drawable/ic_globe" />
+ app:web_link_icon="@drawable/ic_discord" />
+ app:stv_icon="@drawable/ic_theme" />
+ app:stv_icon="@drawable/ic_terms_of_service" />
+ app:stv_icon="@drawable/ic_privacy" />
+ app:stv_icon="@drawable/ic_rate" />
+ app:stv_icon="@drawable/ic_feedback" />
+ android:id="@+id/view_divider_line_support" />
+ android:id="@+id/tv_support_us_title" />
+ android:id="@+id/tv_support_us_description" />
+ app:support_icon="@drawable/ic_btc" />
+ app:support_icon="@drawable/ic_eth" />
+ android:layout_marginTop="@dimen/setting_item_margin_top" />
+ android:layout_marginStart="@dimen/setting_item_margin_start" />
+ android:id="@+id/view_divider_line_contribute" />
+ android:id="@+id/tv_contribute_title" />
+ android:layout_marginTop="@dimen/setting_item_margin_top" />
+ app:support_enabled="false" />
diff --git a/app/src/main/res/layout/fragment_edit_notes.xml b/app/src/main/res/layout/fragment_edit_notes.xml
index 1c7f79e..79f74b0 100644
--- a/app/src/main/res/layout/fragment_edit_notes.xml
+++ b/app/src/main/res/layout/fragment_edit_notes.xml
@@ -5,11 +5,12 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
-
-
+ android:id="@+id/toolbar" />
+ app:layout_constraintTop_toBottomOf="@+id/toolbar" />
+ app:layout_goneMarginBottom="0dp" />
+ android:visibility="gone" />
+ android:id="@+id/barrier_description" />
+ tools:visibility="visible" />
+ tools:visibility="gone" />
-
+ tools:visibility="visible" />
-
+ app:layout_constraintBottom_toBottomOf="parent" />
+ android:textStyle="bold" />
+ android:id="@+id/bottom_control_divider" />
+ android:visibility="gone" />
+ app:constraint_referenced_ids="bottom_control_divider" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index efd3dc7..56e2b93 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -17,7 +17,7 @@
app:layout_constraintTop_toTopOf="parent"
android:padding="12dp"
android:layout_marginTop="@dimen/home_padding_top"
- android:id="@+id/iv_about"/>
+ android:id="@+id/iv_about" />
+ android:id="@+id/iv_settings" />
+ android:gravity="center_horizontal" />
+ android:id="@+id/tv_header" />
+ android:src="@drawable/ic_no_notes" />
+ android:visibility="gone" />
+ android:id="@+id/view_bottom_panel" />
+ android:id="@+id/divider_bottom_control" />
+ app:icon="@drawable/add" />
+ app:layout_constraintTop_toBottomOf="@+id/edt_search" />
+ app:layout_constraintBottom_toBottomOf="@+id/tv_selected_note_count" />
+ app:layout_constraintBottom_toBottomOf="@+id/tv_selected_note_count" />
+ tools:visibility="visible" />
+ android:drawablePadding="6dp" />
@@ -286,7 +286,7 @@
app:layout_constraintBottom_toTopOf="@+id/view_bottom_panel"
android:paddingHorizontal="@dimen/home_horizontal_margin"
android:id="@+id/rv_pinned_notes"
- app:layout_constraintTop_toBottomOf="@+id/barrier_top_note_list"/>
+ app:layout_constraintTop_toBottomOf="@+id/barrier_top_note_list" />
+ app:constraint_referenced_ids="view_fab_background,fab_draw,tv_create_drawing,fab_record_voice,tv_record_voice,fab_simple_memo,tv_simple_memo" />
+ app:layout_constraintBottom_toTopOf="@+id/divider_bottom_control" />
+ android:id="@+id/tv_create_drawing" />
+ android:id="@+id/tv_record_voice" />
+ android:id="@+id/tv_simple_memo" />
+ app:constraint_referenced_ids="tv_bottom_panel_paste,fab_new_action,divider_bottom_control" />
+ android:indeterminateDrawable="@drawable/ic_animated_loading" />
+ android:id="@+id/iv_search_result_empty" />
+ android:layout_marginTop="@dimen/common_padding" />
+ android:visibility="gone" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml
index 4565e63..21b0a86 100644
--- a/app/src/main/res/layout/fragment_settings.xml
+++ b/app/src/main/res/layout/fragment_settings.xml
@@ -4,10 +4,11 @@
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
-
+ android:id="@+id/toolbar_custom" />
+ android:layout_marginTop="@dimen/common_padding" />
+ android:layout_marginTop="@dimen/common_padding" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_audio_record.xml b/app/src/main/res/layout/layout_audio_record.xml
index f19c69c..01ceff6 100644
--- a/app/src/main/res/layout/layout_audio_record.xml
+++ b/app/src/main/res/layout/layout_audio_record.xml
@@ -17,7 +17,7 @@
android:src="@drawable/ic_record_big"
android:scaleType="centerInside"
android:id="@+id/iv_record"
- android:layout_marginBottom="20dp"/>
+ android:layout_marginBottom="20dp" />
+ android:layout_marginBottom="24dp" />
+ app:lottie_autoPlay="true" />
+ android:layout_marginBottom="@dimen/common_padding" />
+ app:layout_goneMarginBottom="0dp" />
+ android:textStyle="bold" />
+ android:layout_marginBottom="12dp" />
-
+ android:id="@+id/barrier_timer_bottom" />
+
+ android:id="@+id/iv_pause_resume" />
+ android:src="@drawable/ic_record_start_over" />
+ app:constraint_referenced_ids="tv_duration,iv_record,divider_top_duration" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_brush_color_chooser.xml b/app/src/main/res/layout/layout_brush_color_chooser.xml
index 280b7c7..11d783f 100644
--- a/app/src/main/res/layout/layout_brush_color_chooser.xml
+++ b/app/src/main/res/layout/layout_brush_color_chooser.xml
@@ -12,6 +12,6 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
- android:id="@+id/rv_brush_colors"/>
+ android:id="@+id/rv_brush_colors" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_brush_size_chooser.xml b/app/src/main/res/layout/layout_brush_size_chooser.xml
index f9214d9..1eddf04 100644
--- a/app/src/main/res/layout/layout_brush_size_chooser.xml
+++ b/app/src/main/res/layout/layout_brush_size_chooser.xml
@@ -25,6 +25,6 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
- android:id="@+id/rv_brush_sizes"/>
+ android:id="@+id/rv_brush_sizes" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_graphic_bottom_control.xml b/app/src/main/res/layout/layout_graphic_bottom_control.xml
index 4a68f61..664781c 100644
--- a/app/src/main/res/layout/layout_graphic_bottom_control.xml
+++ b/app/src/main/res/layout/layout_graphic_bottom_control.xml
@@ -14,7 +14,8 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
-
+ android:visibility="gone" />
-
+ android:visibility="gone" />
+ app:constraint_referenced_ids="layout_color_chooser,layout_size_chooser" />
+ app:layout_constraintBottom_toBottomOf="parent" />
+ app:layout_constraintEnd_toEndOf="parent" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_setting_text.xml b/app/src/main/res/layout/layout_setting_text.xml
index a493532..b419354 100644
--- a/app/src/main/res/layout/layout_setting_text.xml
+++ b/app/src/main/res/layout/layout_setting_text.xml
@@ -6,7 +6,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:clickable="true"
android:background="?attr/selectableItemBackground">
-
+
+ tools:src="@drawable/ic_theme" />
+ tools:text="Light Mode" />
+ style="@style/SwitchButton" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_support_text.xml b/app/src/main/res/layout/layout_support_text.xml
index ee23646..091cf36 100644
--- a/app/src/main/res/layout/layout_support_text.xml
+++ b/app/src/main/res/layout/layout_support_text.xml
@@ -6,7 +6,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:background="@drawable/ripple_support_text"
android:padding="8dp">
-
+
+ tools:src="@drawable/ic_globe" />
+ tools:text="@string/setting_website" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_web_link_text.xml b/app/src/main/res/layout/layout_web_link_text.xml
index 94ec930..5c8df90 100644
--- a/app/src/main/res/layout/layout_web_link_text.xml
+++ b/app/src/main/res/layout/layout_web_link_text.xml
@@ -6,7 +6,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:padding="4dp"
android:background="@drawable/ripple_web_link_text">
-
+
+ tools:text="@string/setting_website" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/media_player_view.xml b/app/src/main/res/layout/media_player_view.xml
index 8d84543..50a5c41 100644
--- a/app/src/main/res/layout/media_player_view.xml
+++ b/app/src/main/res/layout/media_player_view.xml
@@ -18,7 +18,7 @@
android:contentDescription="@string/ark_memo_play_pause"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
- app:layout_constraintBottom_toBottomOf="parent"/>
+ app:layout_constraintBottom_toBottomOf="parent" />
+ android:id="@+id/anim_audio_playing" />
-
+ android:layout_marginStart="10dp"
+ android:layout_marginTop="10dp"
+ android:layout_marginEnd="10dp"
+ android:orientation="vertical"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+
+ android:orientation="horizontal">
-
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+
+
+
+
+
+
-
+
+
-
-
-
-
+ android:layout_margin="5dp"
+ android:contentDescription="@string/select"
+ android:id="@+id/cb_delete"
+ tools:visibility="visible"
+ android:visibility="gone" />
-
+
+
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/recyclerview.xml b/app/src/main/res/layout/recyclerview.xml
index 28c8019..6ddd45d 100644
--- a/app/src/main/res/layout/recyclerview.xml
+++ b/app/src/main/res/layout/recyclerview.xml
@@ -5,9 +5,9 @@
android:layout_height="match_parent">
+ android:contentDescription="@string/content_desc_back_button" />
+ android:contentDescription="@string/delete_note" />
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
+
+
\ 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 0e5e660..cd0fc0c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -29,6 +29,10 @@
Cancel
Note already exists
Note saved successfully
+ Track versions
+ History
+ Older version
+ Fork versions
Title
Just now
Graphic note %1$s
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 289f7ec..e33f436 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -5,6 +5,7 @@
- 12sp
- @color/text_secondary
+
-
+