Коммит 2f371f1b создал по автору Зарубин Виталий Викторович's avatar Зарубин Виталий Викторович
Просмотр файлов

feat: add ak-shared-preferences

владелец 184250a2
......@@ -15,6 +15,8 @@ to interact with the Aurora OS via [Aurora Cinterop](https://os-git.omprussia.ru
- [Path Info](ak-path-info/README.md).
- [Sensors Info](ak-sensors-info/README.md).
- [Share Data](ak-share-data/README.md).
- [Shared Preferences](ak-shared-preferences/README.md).
- [Shared Preferences Secure](ak-shared-preferences-secure/README.md).
- [Theme Info](ak-theme-info/README.md).
- [Uri Launcher](ak-uri-launcher/README.md).
- [Vibration](ak-vibration/README.md).
......
# Shared Preferences Secure
The library allows keep preferences in the form of key-value pairs with data encryption.
### Features:
- Set/Get Boolean.
- Set/Get Int.
- Set/Get Long.
- Set/Get Float.
- Set/Get Double.
- Set/Get String.
- Set/Get List<String>.
- Check is value exist.
- Save data.
- Clear data.
plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.vanniktech.mavenPublish)
}
group = "ru.auroraos.kmp"
version = "0.0.1"
kotlin {
listOf(
linuxX64("x86_64"),
linuxArm64("aarch64"),
).forEach { target ->
target.compilations.getByName("main") {
cinterops.create("libac") {
defFile("src/nativeInterop/cinterop/libac.def")
extraOpts("-libraryPath", "$projectDir/../libs/ac_shared_preferences_secure/${target.name}")
extraOpts("-compiler-options", "-I$projectDir/../libs/ac_shared_preferences_secure/include/full")
}
}
}
}
publishing {
repositories {
mavenLocal()
}
}
package ru.auroraos.kmp.sharedPreferencesSecure
import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.memScoped
import ru.auroraos.kmp.sharedPreferencesSecure.utils.listStringToC
import ru.auroraos.kmp.sharedPreferencesSecure.utils.stringToSaferC
import ru.auroraos.kmp.sharedPreferencesSecure.utils.toKListString
import ru.auroraos.kmp.sharedPreferencesSecure.utils.toKString
@OptIn(ExperimentalForeignApi::class)
object SharedPreferencesSecure {
/**
* Set value type `Boolean`.
*/
fun putBool(key: String, value: Boolean): Boolean {
return memScoped {
libac.ac_shared_preferences_secure_set_bool(stringToSaferC(key), value)
}
}
/**
* Get value type `Boolean`.
*/
fun getBool(key: String, default: Boolean): Boolean {
return memScoped {
libac.ac_shared_preferences_secure_get_bool(stringToSaferC(key), default)
}
}
/**
* Set value type `Int`.
*/
fun putInt(key: String, value: Int): Boolean {
return memScoped {
libac.ac_shared_preferences_secure_set_int(stringToSaferC(key), value)
}
}
/**
* Get value type `Int`.
*/
fun getInt(key: String, default: Int): Int {
return memScoped {
libac.ac_shared_preferences_secure_get_int(stringToSaferC(key), default)
}
}
/**
* Set value type `Long`.
*/
fun putLong(key: String, value: Long): Boolean {
return memScoped {
libac.ac_shared_preferences_secure_set_long(stringToSaferC(key), value)
}
}
/**
* Get value type `Long`.
*/
fun getLong(key: String, default: Long): Long {
return memScoped {
libac.ac_shared_preferences_secure_get_long(stringToSaferC(key), default)
}
}
/**
* Set value type `Float`.
*/
fun putFloat(key: String, value: Float): Boolean {
return memScoped {
libac.ac_shared_preferences_secure_set_float(stringToSaferC(key), value)
}
}
/**
* Get value type `Float`.
*/
fun getFloat(key: String, default: Float): Float {
return memScoped {
libac.ac_shared_preferences_secure_get_float(stringToSaferC(key), default)
}
}
/**
* Set value type `Double`.
*/
fun putDouble(key: String, value: Double): Boolean {
return memScoped {
libac.ac_shared_preferences_secure_set_double(stringToSaferC(key), value)
}
}
/**
* Get value type `Double`.
*/
fun getDouble(key: String, default: Double): Double {
return memScoped {
libac.ac_shared_preferences_secure_get_double(stringToSaferC(key), default)
}
}
/**
* Set value type `String`.
*/
fun putString(key: String, value: String): Boolean {
return memScoped {
libac.ac_shared_preferences_secure_set_string(stringToSaferC(key), stringToSaferC(value))
}
}
/**
* Get value type `String`.
*/
fun getString(key: String, default: String): String {
return memScoped {
libac.ac_shared_preferences_secure_get_string(
stringToSaferC(key), stringToSaferC(default)
).toKString()
}
}
/**
* Set value type `List<String>`.
*/
fun putListString(key: String, value: List<String>): Boolean {
return memScoped {
libac.ac_shared_preferences_secure_set_vec_string(stringToSaferC(key), listStringToC(value))
}
}
/**
* Get value type `List<String>`.
*/
fun getListString(key: String, default: List<String>): List<String> {
return memScoped {
libac.ac_shared_preferences_secure_get_vec_string(
stringToSaferC(key), listStringToC(default)
).toKListString()
}
}
/**
* Check if value is set.
*/
fun isHas(key: String): Boolean {
return memScoped {
libac.ac_shared_preferences_secure_has(stringToSaferC(key))
}
}
/**
* Delete value by key
*/
fun remove(key: String): Boolean {
return memScoped {
libac.ac_shared_preferences_secure_remove(stringToSaferC(key))
}
}
/**
* Save changes to disk.
*/
fun save() {
libac.ac_shared_preferences_secure_save()
}
/**
* Clear all data.
*/
fun drop() {
libac.ac_shared_preferences_secure_drop()
}
}
package ru.auroraos.kmp.sharedPreferencesSecure.utils
import kotlinx.cinterop.*
import platform.posix.memcpy
@OptIn(ExperimentalForeignApi::class)
internal fun CValue<libac.Vec_uint8>?.toKString(): String {
if (this == null) {
return ""
}
val len = this.useContents { len }
val bytes = this.useContents { ptr }?.readBytes(len.toInt())!!
return bytes.toKString()
}
@OptIn(ExperimentalForeignApi::class)
internal fun libac.Vec_uint8?.toKString(): String {
if (this == null) {
return ""
}
val bytes = ptr?.readBytes(len.toInt())!!
return bytes.toKString()
}
@OptIn(ExperimentalForeignApi::class)
internal fun CValue<libac.Vec_Vec_uint8>?.toKListString(): List<String> {
if (this == null) return emptyList()
val len = this.useContents { len }
val ptr = this.useContents { ptr }
val list = mutableListOf<String>()
(0UL..<len).forEach { index ->
val value = ptr?.get(index.toInt())!!
list.add(value.toKString())
}
libac.ac_shared_preferences_secure_drop_vec_string_free(this)
return list
}
@OptIn(ExperimentalForeignApi::class)
internal fun MemScope.stringToSaferC(value: String): CPointer<libac.Vec_uint8> {
val cStruct = alloc<libac.Vec_uint8>()
val cValues = value.encodeToByteArray().toUByteArray().toCValues()
cStruct.len = cValues.size.toULong()
cStruct.cap = cValues.align.toULong()
cStruct.ptr = cValues.ptr
return interpretCPointer(cStruct.rawPtr)!!
}
@OptIn(ExperimentalForeignApi::class)
internal fun MemScope.listStringToC(value: List<String>): CPointer<libac.Vec_Vec_uint8> {
val values = mutableListOf<libac.Vec_uint8>()
for (item in value) {
val cStruct = alloc<libac.Vec_uint8>()
val cValues = item.encodeToByteArray().toUByteArray().toCValues()
cStruct.len = cValues.size.toULong()
cStruct.cap = cValues.align.toULong()
cStruct.ptr = cValues.ptr
values.add(cStruct)
}
val cStruct = alloc<libac.Vec_Vec_uint8>()
val cValues = toCArray(values)
cStruct.len = value.size.toULong()
cStruct.cap = value.sumOf { it.encodeToByteArray().size }.toULong()
cStruct.ptr = cValues.reinterpret()
return interpretCPointer(cStruct.rawPtr)!!
}
@OptIn(ExperimentalForeignApi::class)
internal inline fun <reified T : CVariable> MemScope.toCArray(collection: Collection<T>): CArrayPointer<T> {
val typeSize = sizeOf<T>()
val array = allocArray<T>(collection.size)
collection.forEachIndexed { index, item ->
memcpy(
interpretPointed<T>(array.rawValue + index * typeSize).ptr, item.ptr, typeSize.toULong()
)
}
return array
}
headers = ac_shared_preferences_secure.h
staticLibraries = libac_shared_preferences_secure.a
# Shared Preferences
The library allows keep preferences in the form of key-value pairs.
### Features:
- Set/Get Boolean.
- Set/Get Int.
- Set/Get Long.
- Set/Get Float.
- Set/Get Double.
- Set/Get String.
- Set/Get List<String>.
- Check is value exist.
- Save data.
- Clear data.
plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.vanniktech.mavenPublish)
}
group = "ru.auroraos.kmp"
version = "0.0.1"
kotlin {
listOf(
linuxX64("x86_64"),
linuxArm64("aarch64"),
).forEach { target ->
target.compilations.getByName("main") {
cinterops.create("libac") {
defFile("src/nativeInterop/cinterop/libac.def")
extraOpts("-libraryPath", "$projectDir/../libs/ac_shared_preferences/${target.name}")
extraOpts("-compiler-options", "-I$projectDir/../libs/ac_shared_preferences/include/full")
}
}
}
}
publishing {
repositories {
mavenLocal()
}
}
package ru.auroraos.kmp.sharedPreferences
import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.memScoped
import ru.auroraos.kmp.sharedPreferences.utils.listStringToC
import ru.auroraos.kmp.sharedPreferences.utils.stringToSaferC
import ru.auroraos.kmp.sharedPreferences.utils.toKListString
import ru.auroraos.kmp.sharedPreferences.utils.toKString
@OptIn(ExperimentalForeignApi::class)
object SharedPreferences {
/**
* Set value type `Boolean`.
*/
fun putBool(key: String, value: Boolean): Boolean {
return memScoped {
libac.ac_shared_preferences_set_bool(stringToSaferC(key), value)
}
}
/**
* Get value type `Boolean`.
*/
fun getBool(key: String, default: Boolean): Boolean {
return memScoped {
libac.ac_shared_preferences_get_bool(stringToSaferC(key), default)
}
}
/**
* Set value type `Int`.
*/
fun putInt(key: String, value: Int): Boolean {
return memScoped {
libac.ac_shared_preferences_set_int(stringToSaferC(key), value)
}
}
/**
* Get value type `Int`.
*/
fun getInt(key: String, default: Int): Int {
return memScoped {
libac.ac_shared_preferences_get_int(stringToSaferC(key), default)
}
}
/**
* Set value type `Long`.
*/
fun putLong(key: String, value: Long): Boolean {
return memScoped {
libac.ac_shared_preferences_set_long(stringToSaferC(key), value)
}
}
/**
* Get value type `Long`.
*/
fun getLong(key: String, default: Long): Long {
return memScoped {
libac.ac_shared_preferences_get_long(stringToSaferC(key), default)
}
}
/**
* Set value type `Float`.
*/
fun putFloat(key: String, value: Float): Boolean {
return memScoped {
libac.ac_shared_preferences_set_float(stringToSaferC(key), value)
}
}
/**
* Get value type `Float`.
*/
fun getFloat(key: String, default: Float): Float {
return memScoped {
libac.ac_shared_preferences_get_float(stringToSaferC(key), default)
}
}
/**
* Set value type `Double`.
*/
fun putDouble(key: String, value: Double): Boolean {
return memScoped {
libac.ac_shared_preferences_set_double(stringToSaferC(key), value)
}
}
/**
* Get value type `Double`.
*/
fun getDouble(key: String, default: Double): Double {
return memScoped {
libac.ac_shared_preferences_get_double(stringToSaferC(key), default)
}
}
/**
* Set value type `String`.
*/
fun putString(key: String, value: String): Boolean {
return memScoped {
libac.ac_shared_preferences_set_string(stringToSaferC(key), stringToSaferC(value))
}
}
/**
* Get value type `String`.
*/
fun getString(key: String, default: String): String {
return memScoped {
libac.ac_shared_preferences_get_string(
stringToSaferC(key), stringToSaferC(default)
).toKString()
}
}
/**
* Set value type `List<String>`.
*/
fun putListString(key: String, value: List<String>): Boolean {
return memScoped {
libac.ac_shared_preferences_set_vec_string(stringToSaferC(key), listStringToC(value))
}
}
/**
* Get value type `List<String>`.
*/
fun getListString(key: String, default: List<String>): List<String> {
return memScoped {
libac.ac_shared_preferences_get_vec_string(
stringToSaferC(key), listStringToC(default)
).toKListString()
}
}
/**
* Check if value is set.
*/
fun isHas(key: String): Boolean {
return memScoped {
libac.ac_shared_preferences_has(stringToSaferC(key))
}
}
/**
* Delete value by key
*/
fun remove(key: String): Boolean {
return memScoped {
libac.ac_shared_preferences_remove(stringToSaferC(key))
}
}
/**
* Save changes to disk.
*/
fun save() {
libac.ac_shared_preferences_save()
}
/**
* Clear all data.
*/
fun drop() {
libac.ac_shared_preferences_drop()
}
}
package ru.auroraos.kmp.sharedPreferences.utils
import kotlinx.cinterop.*
import platform.posix.memcpy
@OptIn(ExperimentalForeignApi::class)
internal fun CValue<libac.Vec_uint8>?.toKString(): String {
if (this == null) {
return ""
}
val len = this.useContents { len }
val bytes = this.useContents { ptr }?.readBytes(len.toInt())!!
return bytes.toKString()
}
@OptIn(ExperimentalForeignApi::class)
internal fun libac.Vec_uint8?.toKString(): String {
if (this == null) {
return ""
}
val bytes = ptr?.readBytes(len.toInt())!!
return bytes.toKString()
}
@OptIn(ExperimentalForeignApi::class)
internal fun CValue<libac.Vec_Vec_uint8>?.toKListString(): List<String> {
if (this == null) return emptyList()
val len = this.useContents { len }
val ptr = this.useContents { ptr }
val list = mutableListOf<String>()
(0UL..<len).forEach { index ->
val value = ptr?.get(index.toInt())!!
list.add(value.toKString())
}
libac.ac_shared_preferences_drop_vec_string_free(this)
return list
}
@OptIn(ExperimentalForeignApi::class)
internal fun MemScope.stringToSaferC(value: String): CPointer<libac.Vec_uint8> {
val cStruct = alloc<libac.Vec_uint8>()
val cValues = value.encodeToByteArray().toUByteArray().toCValues()
cStruct.len = cValues.size.toULong()
cStruct.cap = cValues.align.toULong()
cStruct.ptr = cValues.ptr
return interpretCPointer(cStruct.rawPtr)!!
}
@OptIn(ExperimentalForeignApi::class)
internal fun MemScope.listStringToC(value: List<String>): CPointer<libac.Vec_Vec_uint8> {
val values = mutableListOf<libac.Vec_uint8>()
for (item in value) {
val cStruct = alloc<libac.Vec_uint8>()
val cValues = item.encodeToByteArray().toUByteArray().toCValues()
cStruct.len = cValues.size.toULong()
cStruct.cap = cValues.align.toULong()
cStruct.ptr = cValues.ptr
values.add(cStruct)
}
val cStruct = alloc<libac.Vec_Vec_uint8>()
val cValues = toCArray(values)
cStruct.len = value.size.toULong()
cStruct.cap = value.sumOf { it.encodeToByteArray().size }.toULong()
cStruct.ptr = cValues.reinterpret()
return interpretCPointer(cStruct.rawPtr)!!
}
@OptIn(ExperimentalForeignApi::class)
internal inline fun <reified T : CVariable> MemScope.toCArray(collection: Collection<T>): CArrayPointer<T> {
val typeSize = sizeOf<T>()
val array = allocArray<T>(collection.size)
collection.forEachIndexed { index, item ->
memcpy(
interpretPointed<T>(array.rawValue + index * typeSize).ptr, item.ptr, typeSize.toULong()
)
}
return array
}
headers = ac_shared_preferences.h
staticLibraries = libac_shared_preferences.a
Этот отличия не может быть отображен по хранится в LFS. Вместо этого вы можете использовать просмотреть бинарные данные
Этот отличия не может быть отображен по хранится в LFS. Вместо этого вы можете использовать просмотреть бинарные данные
Этот отличия не может быть отображен по хранится в LFS. Вместо этого вы можете использовать просмотреть бинарные данные
Этот отличия не может быть отображен по хранится в LFS. Вместо этого вы можете использовать просмотреть бинарные данные
......@@ -25,6 +25,8 @@ include(":ak-package-info")
include(":ak-path-info")
include(":ak-sensors-info")
include(":ak-share-data")
include(":ak-shared-preferences")
include(":ak-shared-preferences-secure")
include(":ak-theme-info")
include(":ak-uri-launcher")
include(":ak-vibration")
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать