Refactor code to support AGP 9.0

This commit is contained in:
2025-12-20 20:53:13 +03:00
Unverified
parent 8151e0ca0d
commit b18af36b3e
133 changed files with 255 additions and 125 deletions
@@ -0,0 +1,9 @@
package com.pr0gramm3r101.utils
import androidx.compose.runtime.Composable
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.platform.LocalWindowInfo
@OptIn(ExperimentalComposeUiApi::class)
@Composable
actual inline fun currentWindowSize() = LocalWindowInfo.current.containerSize
@@ -0,0 +1,25 @@
@file:OptIn(ExperimentalNativeApi::class)
@file:Suppress("NOTHING_TO_INLINE")
package com.pr0gramm3r101.utils
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import platform.posix._OSSwapInt16
import platform.posix._OSSwapInt32
import platform.posix._OSSwapInt64
import kotlin.experimental.ExperimentalNativeApi
import kotlin.native.Platform.isLittleEndian
actual fun Modifier.clearFocusOnKeyboardDismiss() = this
@Composable
actual fun ToggleNavScrimEffect(enabled: Boolean) {}
actual val materialYouAvailable get() = false
inline fun htons(short: UShort) = if (isLittleEndian) _OSSwapInt16(short) else short
inline fun htonl(data: UInt) = if (isLittleEndian) _OSSwapInt32(data) else data
inline fun htonll(data: ULong) = if (isLittleEndian) _OSSwapInt64(data) else data
inline fun ntohs(data: UShort) = if (isLittleEndian) _OSSwapInt16(data) else data
inline fun ntohl(data: UInt) = if (isLittleEndian) _OSSwapInt32(data) else data
inline fun ntohll(data: ULong) = if (isLittleEndian) _OSSwapInt64(data) else data
@@ -0,0 +1,5 @@
package com.pr0gramm3r101.utils
actual object UtilsLibrary {
actual fun init(vararg args: Any) {}
}
@@ -0,0 +1,33 @@
package com.pr0gramm3r101.utils.crypto
import kotlinx.cinterop.BetaInteropApi
import kotlinx.cinterop.ByteVar
import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.addressOf
import kotlinx.cinterop.get
import kotlinx.cinterop.reinterpret
import kotlinx.cinterop.usePinned
import platform.Foundation.NSData
import platform.Foundation.base64EncodedStringWithOptions
import platform.Foundation.create
actual object Base64 {
@OptIn(ExperimentalForeignApi::class, BetaInteropApi::class)
actual fun encode(bytes: ByteArray): String {
return bytes.usePinned { pinned ->
val nsData = NSData.create(bytes = pinned.addressOf(0), length = bytes.size.toULong())
nsData.base64EncodedStringWithOptions(0u)
}
}
@OptIn(BetaInteropApi::class, ExperimentalForeignApi::class)
actual fun decode(base64: String): ByteArray {
val nsData = NSData.create(base64EncodedString = base64, options = 0u) ?: return ByteArray(0)
val length = nsData.length.toInt()
val bytesPtr = nsData.bytes ?: return ByteArray(0)
val bytePtr = bytesPtr.reinterpret<ByteVar>()
return ByteArray(length) { index ->
bytePtr[index]
}
}
}
@@ -0,0 +1,33 @@
package com.pr0gramm3r101.utils.crypto
import kotlinx.cinterop.ExperimentalForeignApi
import kotlinx.cinterop.addressOf
import kotlinx.cinterop.usePinned
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import platform.CoreCrypto.CCHmac
import platform.CoreCrypto.kCCHmacAlgSHA256
actual object Hmac {
@OptIn(ExperimentalForeignApi::class)
actual suspend fun hmacSha256(key: ByteArray, data: ByteArray): ByteArray = withContext(Dispatchers.Default) {
val result = ByteArray(32)
key.usePinned { keyPinned ->
data.usePinned { dataPinned ->
result.usePinned { resultPinned ->
CCHmac(
algorithm = kCCHmacAlgSHA256,
key = keyPinned.addressOf(0),
keyLength = key.size.toULong(),
data = dataPinned.addressOf(0),
dataLength = data.size.toULong(),
macOut = resultPinned.addressOf(0)
)
}
}
}
result
}
}
@@ -0,0 +1,99 @@
package com.pr0gramm3r101.utils.settings
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import platform.Foundation.NSBundle
import platform.Foundation.NSUserDefaults
class IosAsyncSettings : AsyncSettings {
private val defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults
override suspend fun putString(key: String, value: String): Unit = withContext(Dispatchers.Default) {
defaults.setObject(value, key)
defaults.synchronize()
}
override suspend fun getString(key: String, default: String): String = withContext(Dispatchers.Default) {
defaults.stringForKey(key) ?: default
}
override suspend fun putInt(key: String, value: Int): Unit = withContext(Dispatchers.Default) {
defaults.setInteger(value.toLong(), key)
defaults.synchronize()
}
override suspend fun getInt(key: String, default: Int): Int = withContext(Dispatchers.Default) {
defaults.integerForKey(key).toInt()
}
override suspend fun putLong(key: String, value: Long): Unit = withContext(Dispatchers.Default) {
defaults.setObject(value, key)
defaults.synchronize()
}
override suspend fun getLong(key: String, default: Long): Long = withContext(Dispatchers.Default) {
(defaults.objectForKey(key) as? platform.Foundation.NSNumber)?.longValue ?: default
}
override suspend fun putFloat(key: String, value: Float): Unit = withContext(Dispatchers.Default) {
defaults.setFloat(value, key)
defaults.synchronize()
}
override suspend fun getFloat(key: String, default: Float): Float = withContext(Dispatchers.Default) {
defaults.floatForKey(key)
}
override suspend fun putBoolean(key: String, value: Boolean): Unit = withContext(Dispatchers.Default) {
defaults.setBool(value, key)
defaults.synchronize()
}
override suspend fun getBoolean(key: String, default: Boolean): Boolean = withContext(Dispatchers.Default) {
if (defaults.objectForKey(key) != null) {
defaults.boolForKey(key)
} else {
default
}
}
override suspend fun putStringSet(key: String, value: Set<String>): Unit = withContext(Dispatchers.Default) {
defaults.setObject(value.toList(), key)
defaults.synchronize()
}
override suspend fun getStringSet(key: String, default: Set<String>): Set<String> = withContext(Dispatchers.Default) {
val list = defaults.objectForKey(key) as? List<*> ?: return@withContext default
list.filterIsInstance<String>().toSet()
}
override suspend fun putStringList(key: String, value: List<String>): Unit = withContext(Dispatchers.Default) {
defaults.setObject(value, key)
defaults.synchronize()
}
override suspend fun getStringList(key: String, default: List<String>): List<String> = withContext(Dispatchers.Default) {
val list = defaults.objectForKey(key) as? List<*> ?: return@withContext default
list.filterIsInstance<String>()
}
override suspend fun remove(key: String): Unit = withContext(Dispatchers.Default) {
defaults.removeObjectForKey(key)
defaults.synchronize()
}
override suspend fun contains(key: String): Boolean = withContext(Dispatchers.Default) {
defaults.objectForKey(key) != null
}
override suspend fun clear(): Unit = withContext(Dispatchers.Default) {
val bundleId = NSBundle.mainBundle.bundleIdentifier ?: ""
val domain = defaults.persistentDomainForName(bundleId)
domain?.keys?.forEach { key ->
defaults.removeObjectForKey(key as String)
}
defaults.synchronize()
}
}
actual val asyncSettings: AsyncSettings = IosAsyncSettings()
@@ -0,0 +1,70 @@
package com.pr0gramm3r101.utils.settings
import platform.Foundation.NSUserDefaults
// TODO fix
class IosSettings : Settings {
private val defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults
override fun putString(key: String, value: String) {
defaults.setObject(value, key)
}
override fun getString(key: String, default: String): String {
return defaults.stringForKey(key) ?: default
}
override fun putInt(key: String, value: Int) {
defaults.setInteger(value.toLong(), key)
}
override fun getInt(key: String, default: Int): Int {
return defaults.integerForKey(key).toInt()
}
override fun putLong(key: String, value: Long) {
defaults.setObject(value, key)
}
override fun getLong(key: String, default: Long): Long {
return defaults.objectForKey(key) as? Long ?: default
}
override fun putFloat(key: String, value: Float) {
defaults.setFloat(value, key)
}
override fun getFloat(key: String, default: Float): Float {
return defaults.floatForKey(key)
}
override fun putBoolean(key: String, value: Boolean) {
defaults.setBool(value, key)
}
override fun getBoolean(key: String, default: Boolean): Boolean {
return defaults.boolForKey(key)
}
override fun putStringSet(key: String, value: Set<String>) {
defaults.setObject(value.toList(), key)
}
override fun getStringSet(key: String, default: Set<String>): Set<String> {
val list = defaults.objectForKey(key) as? List<*> ?: return default
return list.filterIsInstance<String>().toSet()
}
override fun putStringList(key: String, value: List<String>) {
defaults.setObject(value, key)
}
override fun getStringList(key: String, default: List<String>): List<String> {
val list = defaults.objectForKey(key) as? List<*> ?: return default
return list.filterIsInstance<String>()
}
override fun remove(key: String) {
defaults.removeObjectForKey(key)
}
}
@@ -0,0 +1,3 @@
package com.pr0gramm3r101.utils.settings
actual val settings: Settings get() = IosSettings()