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 + - +