From 20a1480a195bd56250481afa04ea8dfc365e3ca4 Mon Sep 17 00:00:00 2001 From: oluiscabral Date: Fri, 1 Nov 2024 16:07:25 -0300 Subject: [PATCH 1/5] Add `ark-core` GitHub Packages and `lib` dependency --- sample/build.gradle.kts | 1 + settings.gradle.kts | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 5897047..5b009cf 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -73,6 +73,7 @@ dependencies { implementation(project(":filepicker")) implementation(project(":about")) + implementation("dev.arkbuilders.core:lib:1.0-SNAPSHOT") implementation(libraries.arklib) implementation("androidx.core:core-ktx:1.12.0") implementation(libraries.androidx.appcompat) diff --git a/settings.gradle.kts b/settings.gradle.kts index b7b6b93..d5e9efb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -16,13 +16,21 @@ dependencyResolutionManagement { url = URI("https://jitpack.io") } maven { - name = "GitHubPackages" + name = "arklib-android GitHub Packages" url = URI("https://maven.pkg.github.com/ARK-Builders/arklib-android") credentials { username = "token" password = "\u0037\u0066\u0066\u0036\u0030\u0039\u0033\u0066\u0032\u0037\u0033\u0036\u0033\u0037\u0064\u0036\u0037\u0066\u0038\u0030\u0034\u0039\u0062\u0030\u0039\u0038\u0039\u0038\u0066\u0034\u0066\u0034\u0031\u0064\u0062\u0033\u0064\u0033\u0038\u0065" } } + maven { + name = "ark-core GitHub Packages" + url = URI("https://maven.pkg.github.com/ARK-Builders/ark-core") + credentials { + username = "token" + password = "\u0037\u0066\u0066\u0036\u0030\u0039\u0033\u0066\u0032\u0037\u0033\u0036\u0033\u0037\u0064\u0036\u0037\u0066\u0038\u0030\u0034\u0039\u0062\u0030\u0039\u0038\u0039\u0038\u0066\u0034\u0066\u0034\u0031\u0064\u0062\u0033\u0064\u0033\u0038\u0065" + } + } } versionCatalogs { From abc94264929d92804da938825b43dc2c3697e6e8 Mon Sep 17 00:00:00 2001 From: oluiscabral Date: Fri, 1 Nov 2024 17:14:16 -0300 Subject: [PATCH 2/5] Add `core` to `libraries` --- gradle/libs.versions.toml | 1 + sample/build.gradle.kts | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 19dcc50..b1696b9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -28,6 +28,7 @@ fastadapter = { group = "com.mikepenz", name = "fastadapter", version.ref = "fas fastadapter-extensions-binding = { group = "com.mikepenz", name = "fastadapter-extensions-binding", version.ref = "fastadapter" } fastadapter-extensions-diff = { group = "com.mikepenz", name = "fastadapter-extensions-diff", version.ref = "fastadapter" } arklib = { group = "dev.arkbuilders", name = "arklib", version.ref = "arkLib" } +core = {group = "dev.arkbuilders.core", name = "lib", version = "1.0-SNAPSHOT"} orbit-mvi-viewmodel = { group = "org.orbit-mvi", name = "orbit-viewmodel", version.ref = "orbitMvi" } viewbinding-property-delegate = { group = "com.github.kirich1409", name = "viewbindingpropertydelegate-noreflection", version.ref = "viewbindingPropertyDelegate" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidXCore" } diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 5b009cf..a4fafbb 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -72,8 +72,7 @@ android { dependencies { implementation(project(":filepicker")) implementation(project(":about")) - - implementation("dev.arkbuilders.core:lib:1.0-SNAPSHOT") + implementation(libraries.core) implementation(libraries.arklib) implementation("androidx.core:core-ktx:1.12.0") implementation(libraries.androidx.appcompat) From e477067c50b43638a06b0618d362097460e045e1 Mon Sep 17 00:00:00 2001 From: oluiscabral Date: Fri, 1 Nov 2024 18:04:52 -0300 Subject: [PATCH 3/5] Add JNI libs mapping --- sample/build.gradle.kts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index a4fafbb..cf1a6b4 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -80,4 +80,11 @@ dependencies { testImplementation(libraries.junit) androidTestImplementation(libraries.androidx.test.junit) androidTestImplementation(libraries.androidx.test.espresso) + runtimeOnly( + fileTree( + mapOf( + "dir" to "src/main/jniLibs", + ) + ) + ) } \ No newline at end of file From 99e0f8849843036b9002f41fe96d87b4b4a0634f Mon Sep 17 00:00:00 2001 From: oluiscabral Date: Fri, 1 Nov 2024 18:06:08 -0300 Subject: [PATCH 4/5] Use `FileStorage` from `dev.arkbuilders.core:lib` --- .../sample/storage/StorageDemoFragment.kt | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/sample/src/main/java/dev/arkbuilders/sample/storage/StorageDemoFragment.kt b/sample/src/main/java/dev/arkbuilders/sample/storage/StorageDemoFragment.kt index 40f1e72..caf4331 100644 --- a/sample/src/main/java/dev/arkbuilders/sample/storage/StorageDemoFragment.kt +++ b/sample/src/main/java/dev/arkbuilders/sample/storage/StorageDemoFragment.kt @@ -11,6 +11,7 @@ import android.view.ViewGroup import android.view.inputmethod.EditorInfo import androidx.activity.result.contract.ActivityResultContracts import androidx.fragment.app.DialogFragment +import dev.arkbuilders.core.FileStorage import dev.arkbuilders.sample.R import dev.arkbuilders.sample.databinding.FragmentStorageDemoBinding import dev.arkbuilders.sample.extension.getAbsolutePath @@ -21,8 +22,8 @@ class StorageDemoFragment: DialogFragment() { private val TAG = StorageDemoFragment::class.java.name private lateinit var binding: FragmentStorageDemoBinding - private val map by lazy { mutableMapOf() } private var workingDir: String = "/" + private var storage: FileStorage? = null private val selectDirRequest = registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { uri -> uri?.let { @@ -61,7 +62,10 @@ class StorageDemoFragment: DialogFragment() { binding.edtStoragePath.setOnEditorActionListener { v, actionId, event -> if (actionId == EditorInfo.IME_ACTION_DONE) { - refreshFilesTree() + val relativeStoragePath = v.text + storage = FileStorage(relativeStoragePath.toString(), + "$workingDir/$relativeStoragePath" + ) return@setOnEditorActionListener true } false @@ -69,21 +73,27 @@ class StorageDemoFragment: DialogFragment() { binding.btnNewMapEntry.setOnClickListener { MapEntryDialog(isDelete = false, onDone = { key, value -> - map[key] = value ?: "" - refreshMap() + if (storage != null) { + storage!!.set(key, value) + } + refreshStorage() }).show(parentFragmentManager, MapEntryDialog::class.java.name) } binding.btnDeleteEntry.setOnClickListener { - MapEntryDialog(isDelete = true, onDone = { key, value -> - map.remove(key) - refreshMap() + MapEntryDialog(isDelete = true, onDone = { key, _ -> + if (storage != null) { + storage!!.remove(key) + } + refreshStorage() }).show(parentFragmentManager, MapEntryDialog::class.java.name) } binding.btnClearMap.setOnClickListener { - map.clear() - refreshMap() + if (storage != null) { + storage!!.erase() + } + refreshStorage() } } @@ -105,13 +115,14 @@ class StorageDemoFragment: DialogFragment() { } } - private fun refreshMap() { - if (map.isEmpty()) { + private fun refreshStorage() { + if (storage == null) { binding.tvMapValues.text = getString(R.string.empty_map) return } + storage!!.writeFS() val mapEntries = StringBuilder() - for (entry in map) { + for (entry in storage!!) { mapEntries.append(entry.key).append(" -> ").append(entry.value).append("\n") } binding.tvMapValues.text = mapEntries.toString() From c257b9c78cdcf0ad14b02866fe4a0482afe9de62 Mon Sep 17 00:00:00 2001 From: oluiscabral Date: Fri, 1 Nov 2024 18:38:06 -0300 Subject: [PATCH 5/5] Add a step-by-step on how to make the Storage Demo subpage work --- README.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/README.md b/README.md index 20f0cff..f38e941 100644 --- a/README.md +++ b/README.md @@ -29,3 +29,39 @@ git push --tags - Create an action build file under `.github/workflows/` folder, following any existing build script. - Create a release build file under `.github/workflows/` folder, following any existing release script. +## Making the Storage Demo work + +This section guides you through setting up and running the Storage Demo subpage. + +**1. Download the `fs-storage` JNI Libraries:** + +The demo requires JNI libraries (libs). Download these from the following location: + +* **[ark-core repository](https://github.com/ARK-Builders/ark-core)** + + - If you can't find them in the "Releases" section, check the latest successful build actions for artifacts. + +**2. Place the Libraries:** + +After downloading, move the JNI library files into your project's `sample/src/main/jniLibs` directory. **If the path doesn't exist, create it** + +Your project structure should resemble this: + +``` +... +sample/ + ... + src/ + main/ + ... + jniLibs/ + arm64-v8a/ + armeabi-v7a/ + x86/ + x86_64/ + ... + ... + ... +``` + +With the `fs-storage` JNI libraries in place, you're ready to build, run the project and use the Storage Demo subpage.