mirror of
https://github.com/fromchat-messenger/app.git
synced 2026-09-22 19:15:05 +03:00
Refactor code to support AGP 9.0
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
package com.pr0gramm3r101.utils.settings
|
||||
|
||||
actual val settings: Settings get() = IosSettings()
|
||||
Reference in New Issue
Block a user