Skip to content

Commit cc4e896

Browse files
committed
Download and include ark-core JNI libs release during build
1 parent 9ab96f3 commit cc4e896

6 files changed

Lines changed: 76 additions & 16 deletions

File tree

.github/workflows/build_sample.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,16 @@ jobs:
3030
- name: Validate Gradle wrapper
3131
uses: gradle/wrapper-validation-action@v1.0.5
3232

33-
3433
- name: Decrypt the keystore for signing
3534
run: |
3635
echo "${{ secrets.KEYSTORE_ENCRYPTED }}" > keystore.asc
3736
gpg -d --passphrase "${{ secrets.KEYSTORE_PASSWORD }}" --batch keystore.asc > keystore.jks
3837
38+
- name: Download and extract `ark-core` JNI libs
39+
run: |
40+
wget https://github.com/ARK-Builders/ark-core/releases/download/v1.0.0/jniLibs.zip
41+
unzip -d sample/src/main jniLibs.zip
42+
3943
- name: Build release sample APK
4044
run: ./gradlew sample:assembleRelease
4145

README.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,39 @@ git push --tags
2929
- Create an action build file under `.github/workflows/` folder, following any existing build script.
3030
- Create a release build file under `.github/workflows/` folder, following any existing release script.
3131

32+
## Making the Storage Demo work
33+
34+
This section guides you through setting up and running the Storage Demo subpage.
35+
36+
**1. Download the `fs-storage` JNI Libraries:**
37+
38+
The demo requires JNI libraries (libs). Download these from the following location:
39+
40+
* **[ark-core repository](https://github.com/ARK-Builders/ark-core)**
41+
42+
- If you can't find them in the "Releases" section, check the latest successful build actions for artifacts.
43+
44+
**2. Place the Libraries:**
45+
46+
After downloading, move the JNI library files into your project's `sample/src/main/jniLibs` directory. **If the path doesn't exist, create it**
47+
48+
Your project structure should resemble this:
49+
50+
```
51+
...
52+
sample/
53+
...
54+
src/
55+
main/
56+
...
57+
jniLibs/
58+
arm64-v8a/
59+
armeabi-v7a/
60+
x86/
61+
x86_64/
62+
...
63+
...
64+
...
65+
```
66+
67+
With the `fs-storage` JNI libraries in place, you're ready to build, run the project and use the Storage Demo subpage.

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ fastadapter = { group = "com.mikepenz", name = "fastadapter", version.ref = "fas
2828
fastadapter-extensions-binding = { group = "com.mikepenz", name = "fastadapter-extensions-binding", version.ref = "fastadapter" }
2929
fastadapter-extensions-diff = { group = "com.mikepenz", name = "fastadapter-extensions-diff", version.ref = "fastadapter" }
3030
arklib = { group = "dev.arkbuilders", name = "arklib", version.ref = "arkLib" }
31+
core = {group = "dev.arkbuilders.core", name = "lib", version = "1.0-SNAPSHOT"}
3132
orbit-mvi-viewmodel = { group = "org.orbit-mvi", name = "orbit-viewmodel", version.ref = "orbitMvi" }
3233
viewbinding-property-delegate = { group = "com.github.kirich1409", name = "viewbindingpropertydelegate-noreflection", version.ref = "viewbindingPropertyDelegate" }
3334
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "androidXCore" }

sample/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,12 @@ android {
7272
dependencies {
7373
implementation(project(":filepicker"))
7474
implementation(project(":about"))
75-
75+
implementation(libraries.core)
7676
implementation(libraries.arklib)
7777
implementation("androidx.core:core-ktx:1.12.0")
7878
implementation(libraries.androidx.appcompat)
7979
implementation(libraries.android.material)
8080
testImplementation(libraries.junit)
8181
androidTestImplementation(libraries.androidx.test.junit)
8282
androidTestImplementation(libraries.androidx.test.espresso)
83-
}
83+
}

sample/src/main/java/dev/arkbuilders/sample/storage/StorageDemoFragment.kt

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.view.ViewGroup
1111
import android.view.inputmethod.EditorInfo
1212
import androidx.activity.result.contract.ActivityResultContracts
1313
import androidx.fragment.app.DialogFragment
14+
import dev.arkbuilders.core.FileStorage
1415
import dev.arkbuilders.sample.R
1516
import dev.arkbuilders.sample.databinding.FragmentStorageDemoBinding
1617
import dev.arkbuilders.sample.extension.getAbsolutePath
@@ -21,8 +22,8 @@ class StorageDemoFragment: DialogFragment() {
2122
private val TAG = StorageDemoFragment::class.java.name
2223

2324
private lateinit var binding: FragmentStorageDemoBinding
24-
private val map by lazy { mutableMapOf<String, String>() }
2525
private var workingDir: String = "/"
26+
private var storage: FileStorage? = null
2627

2728
private val selectDirRequest = registerForActivityResult(ActivityResultContracts.OpenDocumentTree()) { uri ->
2829
uri?.let {
@@ -61,29 +62,38 @@ class StorageDemoFragment: DialogFragment() {
6162

6263
binding.edtStoragePath.setOnEditorActionListener { v, actionId, event ->
6364
if (actionId == EditorInfo.IME_ACTION_DONE) {
64-
refreshFilesTree()
65+
val relativeStoragePath = v.text
66+
storage = FileStorage(relativeStoragePath.toString(),
67+
"$workingDir/$relativeStoragePath"
68+
)
6569
return@setOnEditorActionListener true
6670
}
6771
false
6872
}
6973

7074
binding.btnNewMapEntry.setOnClickListener {
7175
MapEntryDialog(isDelete = false, onDone = { key, value ->
72-
map[key] = value ?: ""
73-
refreshMap()
76+
if (storage != null) {
77+
storage!!.set(key, value)
78+
}
79+
refreshStorage()
7480
}).show(parentFragmentManager, MapEntryDialog::class.java.name)
7581
}
7682

7783
binding.btnDeleteEntry.setOnClickListener {
78-
MapEntryDialog(isDelete = true, onDone = { key, value ->
79-
map.remove(key)
80-
refreshMap()
84+
MapEntryDialog(isDelete = true, onDone = { key, _ ->
85+
if (storage != null) {
86+
storage!!.remove(key)
87+
}
88+
refreshStorage()
8189
}).show(parentFragmentManager, MapEntryDialog::class.java.name)
8290
}
8391

8492
binding.btnClearMap.setOnClickListener {
85-
map.clear()
86-
refreshMap()
93+
if (storage != null) {
94+
storage!!.erase()
95+
}
96+
refreshStorage()
8797
}
8898
}
8999

@@ -105,13 +115,14 @@ class StorageDemoFragment: DialogFragment() {
105115
}
106116
}
107117

108-
private fun refreshMap() {
109-
if (map.isEmpty()) {
118+
private fun refreshStorage() {
119+
if (storage == null) {
110120
binding.tvMapValues.text = getString(R.string.empty_map)
111121
return
112122
}
123+
storage!!.writeFS()
113124
val mapEntries = StringBuilder()
114-
for (entry in map) {
125+
for (entry in storage!!) {
115126
mapEntries.append(entry.key).append(" -> ").append(entry.value).append("\n")
116127
}
117128
binding.tvMapValues.text = mapEntries.toString()

settings.gradle.kts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,21 @@ dependencyResolutionManagement {
1616
url = URI("https://jitpack.io")
1717
}
1818
maven {
19-
name = "GitHubPackages"
19+
name = "arklib-android GitHub Packages"
2020
url = URI("https://maven.pkg.github.com/ARK-Builders/arklib-android")
2121
credentials {
2222
username = "token"
2323
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"
2424
}
2525
}
26+
maven {
27+
name = "ark-core GitHub Packages"
28+
url = URI("https://maven.pkg.github.com/ARK-Builders/ark-core")
29+
credentials {
30+
username = "token"
31+
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"
32+
}
33+
}
2634
}
2735

2836
versionCatalogs {

0 commit comments

Comments
 (0)