Skip to content

Commit 4f8ab48

Browse files
committed
android implementation
1 parent e64af39 commit 4f8ab48

File tree

10 files changed

+152
-38
lines changed

10 files changed

+152
-38
lines changed

packages/async-storage/android/build.gradle

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,24 @@ android {
8181
}
8282
}
8383

84+
project.afterEvaluate {
85+
rootProject.allprojects {
86+
println "projectname: ${it.name}"
87+
repositories {
88+
def proj = project(":react-native-async-storage_async-storage")
89+
maven {
90+
url = uri("${proj.projectDir}/local_repo")
91+
}
92+
}
93+
}
94+
}
95+
8496
repositories {
8597
mavenCentral()
8698
google()
8799
}
88100

89101
dependencies {
90102
implementation "com.facebook.react:react-android"
103+
implementation "org.asyncstorage.shared_storage:storage-android:1.0.0"
91104
}

packages/async-storage/android/src/main/kotlin/org/asyncstorage/AsyncStoragePackage.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@ import com.facebook.react.bridge.ReactApplicationContext
66
import com.facebook.react.module.model.ReactModuleInfo
77
import com.facebook.react.module.model.ReactModuleInfoProvider
88

9-
internal const val AsyncStorageModuleName = "RNAsyncStorage"
10-
119
class AsyncStoragePackage : BaseReactPackage() {
1210
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
13-
return if (name == AsyncStorageModuleName) {
11+
return if (name == AsyncStorageModule.NAME) {
1412
AsyncStorageModule(reactContext)
1513
} else {
1614
null
@@ -20,9 +18,9 @@ class AsyncStoragePackage : BaseReactPackage() {
2018
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
2119
return ReactModuleInfoProvider {
2220
val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
23-
moduleInfos[AsyncStorageModuleName] =
21+
moduleInfos[AsyncStorageModule.NAME] =
2422
ReactModuleInfo(
25-
AsyncStorageModuleName,
23+
AsyncStorageModule.NAME,
2624
AsyncStorageModule::class.java.name,
2725
false, // canOverrideExistingModule
2826
false, // needsEagerInit
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.asyncstorage.storage
2+
3+
import com.facebook.react.bridge.Arguments
4+
import com.facebook.react.bridge.ReadableArray
5+
import com.facebook.react.bridge.ReadableMap
6+
import org.asyncstorage.shared_storage.Entry
7+
8+
/**
9+
* From Shared Entry to RN Entry.
10+
*
11+
* js expects: { key: string; value: string | null }
12+
*/
13+
internal fun Entry.toRNResult(): ReadableMap =
14+
Arguments.createMap().apply {
15+
putString("key", key)
16+
putString("value", value)
17+
}
18+
19+
/**
20+
* From Shared Entry list to RN Entry list.
21+
*
22+
* js expects: { key: string; value: string | null }
23+
*/
24+
internal fun List<Entry>.toRNResults(): ReadableArray {
25+
val list = Arguments.createArray()
26+
for (entry in this) {
27+
list.pushMap(entry.toRNResult())
28+
}
29+
return list
30+
}
31+
32+
private fun ReadableMap.toEntry(): Entry {
33+
val key = getString("key") ?: error("Missing key in map from RN")
34+
val value = getString("value")
35+
return Entry(key, value)
36+
}
37+
38+
internal fun ReadableArray.toEntryList(): List<Entry> {
39+
val list = mutableListOf<Entry>()
40+
41+
for (i in 0..<size()) {
42+
val rnEntry = getMap(i)
43+
requireNotNull(rnEntry)
44+
list.add(rnEntry.toEntry())
45+
}
46+
47+
return list
48+
}
49+
50+
internal fun ReadableArray.toKeyList(): List<String> = toArrayList().map { it.toString() }
51+
52+
internal fun List<String>.toRNKeys(): ReadableArray {
53+
val list = Arguments.createArray()
54+
for (key in this) {
55+
list.pushString(key)
56+
}
57+
return list
58+
}
Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,66 @@
11
package org.asyncstorage.storage
22

3+
import android.content.Context
34
import com.facebook.react.bridge.Promise
45
import com.facebook.react.bridge.ReadableArray
6+
import kotlin.coroutines.CoroutineContext
7+
import kotlin.coroutines.EmptyCoroutineContext
8+
import kotlinx.coroutines.CoroutineName
9+
import kotlinx.coroutines.CoroutineScope
10+
import kotlinx.coroutines.SupervisorJob
11+
import kotlinx.coroutines.launch
12+
import kotlinx.coroutines.plus
13+
import org.asyncstorage.shared_storage.SharedStorage
14+
import org.asyncstorage.shared_storage.create
515

6-
class PersistentStorage {
7-
fun get(db: String, rnKeys: ReadableArray, promise: Promise) {
8-
// rnKeys.toArrayList().map { it.toString() }
9-
promise.reject("ERR_01", "get not implemented")
16+
private val StorageScope = { name: String -> CoroutineScope(SupervisorJob() + CoroutineName(name)) }
17+
18+
/**
19+
* todo:
20+
* - handle exceptions via coroutine exception handler or via try catch
21+
*/
22+
class PersistentStorage(
23+
ctx: Context,
24+
dbName: String,
25+
coroutineContext: CoroutineContext = EmptyCoroutineContext,
26+
) {
27+
private val scope = StorageScope(dbName) + coroutineContext
28+
private val db = SharedStorage.create(ctx, dbName)
29+
30+
fun get(rnKeys: ReadableArray, promise: Promise) {
31+
scope.launch {
32+
val keys = rnKeys.toKeyList()
33+
val result = db.getValues(keys).toRNResults()
34+
promise.resolve(result)
35+
}
1036
}
1137

12-
fun set(db: String, values: ReadableArray, promise: Promise) {
13-
promise.reject("ERR_01", "set not implemented")
38+
fun set(values: ReadableArray, promise: Promise) {
39+
scope.launch {
40+
val entries = values.toEntryList()
41+
val result = db.setValues(entries).toRNResults()
42+
promise.resolve(result)
43+
}
1444
}
1545

16-
fun remove(db: String, keys: ReadableArray, promise: Promise) {
17-
promise.reject("ERR_01", "remove not implemented")
46+
fun remove(keys: ReadableArray, promise: Promise) {
47+
scope.launch {
48+
db.removeValues(keys.toKeyList())
49+
promise.resolve(null)
50+
}
1851
}
1952

20-
fun allKeys(db: String, promise: Promise) {
21-
promise.reject("ERR_01", "allKeys not implemented")
53+
fun allKeys(promise: Promise) {
54+
scope.launch {
55+
val result = db.getKeys().toRNKeys()
56+
promise.resolve(result)
57+
}
2258
}
2359

24-
fun clear(db: String, promise: Promise) {
25-
promise.reject("ERR_01", "clear not implemented")
60+
fun clear(promise: Promise) {
61+
scope.launch {
62+
db.clear()
63+
promise.resolve(null)
64+
}
2665
}
2766
}
Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package org.asyncstorage.storage
22

3-
typealias Storage = String
3+
import android.content.Context
44

55
object StorageRegistry {
66

7-
private val storages = mutableMapOf<String, Storage>()
7+
private val storages = mutableMapOf<String, PersistentStorage>()
88

9-
fun getOrCreate(name: String): Storage =
10-
storages.getOrPut(name) {
11-
// todo: create Storage
12-
name
13-
}
9+
fun getOrCreate(ctx: Context, name: String): PersistentStorage =
10+
storages.getOrPut(name) { PersistentStorage(ctx, name) }
1411
}

packages/async-storage/android/src/newarch/org/asyncstorage/AsyncStorageModule.kt

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,35 @@ import com.facebook.react.bridge.Promise
44
import com.facebook.react.bridge.ReactApplicationContext
55
import com.facebook.react.bridge.ReadableArray
66
import com.facebook.react.module.annotations.ReactModule
7-
import org.asyncstorage.storage.PersistentStorage
7+
import org.asyncstorage.storage.StorageRegistry
88

9-
@ReactModule(name = AsyncStorageModuleName)
10-
class AsyncStorageModule(reactContext: ReactApplicationContext) :
9+
@ReactModule(name = AsyncStorageModule.NAME)
10+
class AsyncStorageModule(private val reactContext: ReactApplicationContext) :
1111
NativeAsyncStorageSpec(reactContext) {
1212

13-
private val storage = PersistentStorage()
14-
15-
override fun getName() = AsyncStorageModuleName
13+
override fun getName() = NAME
1614

1715
override fun getValues(db: String, keys: ReadableArray, promise: Promise) {
18-
storage.get(db, keys, promise)
16+
StorageRegistry.getOrCreate(reactContext, db).run { get(keys, promise) }
1917
}
2018

2119
override fun setValues(db: String, values: ReadableArray, promise: Promise) {
22-
storage.set(db, values, promise)
20+
StorageRegistry.getOrCreate(reactContext, db).run { set(values, promise) }
2321
}
2422

2523
override fun removeValues(db: String, keys: ReadableArray, promise: Promise) {
26-
storage.remove(db, keys, promise)
24+
StorageRegistry.getOrCreate(reactContext, db).run { remove(keys, promise) }
2725
}
2826

2927
override fun getKeys(db: String, promise: Promise) {
30-
storage.allKeys(db, promise)
28+
StorageRegistry.getOrCreate(reactContext, db).run { allKeys(promise) }
3129
}
3230

3331
override fun clearStorage(db: String, promise: Promise) {
34-
storage.clear(db, promise)
32+
StorageRegistry.getOrCreate(reactContext, db).run { clear(promise) }
33+
}
34+
35+
companion object {
36+
const val NAME = "RNAsyncStorage"
3537
}
3638
}

packages/async-storage/android/src/oldarch/asyncstorage/AsyncStorageModule.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,8 @@ class AsyncStorageModule(reactContext: ReactApplicationContext) :
4040
fun clearStorage(db: String, promise: Promise) {
4141
storage.clear(db, promise)
4242
}
43+
44+
companion object {
45+
const val NAME = "RNAsyncStorage"
46+
}
4347
}

packages/async-storage/src/native-module/NativeAsyncStorage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export interface Spec extends TurboModule {
99

1010
setValues: (
1111
db: string,
12-
values: { key: string; value: string }[]
12+
values: { key: string; value: string | null }[]
1313
) => Promise<{ key: string; value: string | null }[]>;
1414

1515
removeValues: (db: string, keys: string[]) => Promise<void>;

scripts/build-native-lib.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ build_android() {
2525
echo "Publishing binaries to local repo"
2626
./gradlew :$MODULE_NAME:$ANDROID_PUBLISH_TASK
2727

28+
echo "Remove old local repo"
29+
rm -rf $ANDROID_RN_OUTPUT_DIR/$ANDROID_OUTPUT_NAME
30+
2831
echo "Moving local repo to RN target"
2932
mv $ANDROID_OUTPUT_DIR/$ANDROID_OUTPUT_NAME $ANDROID_RN_OUTPUT_DIR/$ANDROID_OUTPUT_NAME
3033
echo "all done"

shared-storage/gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
GROUP=org.asyncstorage
2-
POM_ARTIFACT_ID=shared-storage
1+
GROUP=org.asyncstorage.shared_storage
2+
POM_ARTIFACT_ID=storage
33
VERSION_NAME=1.0.0

0 commit comments

Comments
 (0)