diff --git a/apps/android/app/src/main/java/bot/molt/android/NodeGatewaySync.kt b/apps/android/app/src/main/java/bot/molt/android/NodeGatewaySync.kt index f4ddfc0b1..03441d1ea 100644 --- a/apps/android/app/src/main/java/bot/molt/android/NodeGatewaySync.kt +++ b/apps/android/app/src/main/java/bot/molt/android/NodeGatewaySync.kt @@ -258,71 +258,3 @@ internal fun NodeRuntime.parseLocationParams(paramsJson: String?): Triple { - try { - return !!globalThis.clawdbotA2UI && typeof globalThis.clawdbotA2UI.applyMessages === 'function'; - } catch (_) { - return false; - } -})() -""" - -internal const val A2UI_RESET_JS: String = """ -(() => { - try { - if (!globalThis.clawdbotA2UI) return { ok: false, error: "missing clawdbotA2UI" }; - return globalThis.clawdbotA2UI.reset(); - } catch (e) { - return { ok: false, error: String(e?.message ?? e) }; - } -})() -""" - -internal fun a2uiApplyMessagesJS(messagesJson: String): String { - return """ - (() => { - try { - if (!globalThis.clawdbotA2UI) return { ok: false, error: "missing clawdbotA2UI" }; - const messages = $messagesJson; - return globalThis.clawdbotA2UI.applyMessages(messages); - } catch (e) { - return { ok: false, error: String(e?.message ?? e) }; - } - })() - """.trimIndent() -} - -internal const val DEFAULT_SEAM_COLOR_ARGB: Long = 0xFF4F7A9A - -internal fun parseHexColorArgb(raw: String?): Long? { - val trimmed = raw?.trim().orEmpty() - if (trimmed.isEmpty()) return null - val hex = if (trimmed.startsWith("#")) trimmed.drop(1) else trimmed - if (hex.length != 6) return null - val rgb = hex.toLongOrNull(16) ?: return null - return 0xFF000000L or rgb -} - -// MARK: - JSON Helpers - -internal fun kotlinx.serialization.json.JsonElement?.asObjectOrNull(): JsonObject? = this as? JsonObject - -internal fun kotlinx.serialization.json.JsonElement?.asStringOrNull(): String? = - when (this) { - is kotlinx.serialization.json.JsonNull -> null - is JsonPrimitive -> content - else -> null - } - -private fun String.toJsonStringInternal(): String { - val escaped = this - .replace("\\", "\\\\") - .replace("\"", "\\\"") - .replace("\n", "\\n") - .replace("\r", "\\r") - return "\"$escaped\"" -} diff --git a/apps/android/app/src/main/java/bot/molt/android/NodeRuntime.kt b/apps/android/app/src/main/java/bot/molt/android/NodeRuntime.kt index 5fd429e9e..de081ffa1 100644 --- a/apps/android/app/src/main/java/bot/molt/android/NodeRuntime.kt +++ b/apps/android/app/src/main/java/bot/molt/android/NodeRuntime.kt @@ -1201,9 +1201,9 @@ class NodeRuntime(context: Context) { private data class Quad(val first: A, val second: B, val third: C, val fourth: D) -private const val DEFAULT_SEAM_COLOR_ARGB: Long = 0xFF4F7A9A +internal const val DEFAULT_SEAM_COLOR_ARGB: Long = 0xFF4F7A9A -private const val a2uiReadyCheckJS: String = +internal const val A2UI_READY_CHECK_JS: String = """ (() => { try { @@ -1214,7 +1214,7 @@ private const val a2uiReadyCheckJS: String = })() """ -private const val a2uiResetJS: String = +internal const val A2UI_RESET_JS: String = """ (() => { try { @@ -1226,7 +1226,7 @@ private const val a2uiResetJS: String = })() """ -private fun a2uiApplyMessagesJS(messagesJson: String): String { +internal fun a2uiApplyMessagesJS(messagesJson: String): String { return """ (() => { try { @@ -1249,16 +1249,16 @@ private fun String.toJsonString(): String { return "\"$escaped\"" } -private fun JsonElement?.asObjectOrNull(): JsonObject? = this as? JsonObject +internal fun JsonElement?.asObjectOrNull(): JsonObject? = this as? JsonObject -private fun JsonElement?.asStringOrNull(): String? = +internal fun JsonElement?.asStringOrNull(): String? = when (this) { is JsonNull -> null is JsonPrimitive -> content else -> null } -private fun parseHexColorArgb(raw: String?): Long? { +internal fun parseHexColorArgb(raw: String?): Long? { val trimmed = raw?.trim().orEmpty() if (trimmed.isEmpty()) return null val hex = if (trimmed.startsWith("#")) trimmed.drop(1) else trimmed diff --git a/apps/android/app/src/main/java/bot/molt/android/push/MoltbotMessagingService.kt b/apps/android/app/src/main/java/bot/molt/android/push/MoltbotMessagingService.kt index fc4820418..9be73b8f3 100644 --- a/apps/android/app/src/main/java/bot/molt/android/push/MoltbotMessagingService.kt +++ b/apps/android/app/src/main/java/bot/molt/android/push/MoltbotMessagingService.kt @@ -146,12 +146,13 @@ object PushTokenStore { private fun getSecurePrefs(context: Context): android.content.SharedPreferences { return try { + val masterKey = androidx.security.crypto.MasterKey.Builder(context) + .setKeyScheme(androidx.security.crypto.MasterKey.KeyScheme.AES256_GCM) + .build() androidx.security.crypto.EncryptedSharedPreferences.create( context, PREFS_NAME, - androidx.security.crypto.MasterKeys.getOrCreate( - androidx.security.crypto.MasterKeys.AES256_GCM_SPEC - ), + masterKey, androidx.security.crypto.EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, androidx.security.crypto.EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) diff --git a/apps/android/app/src/main/java/bot/molt/android/ui/RootScreen.kt b/apps/android/app/src/main/java/bot/molt/android/ui/RootScreen.kt index 720e2e70a..fdb9220f3 100644 --- a/apps/android/app/src/main/java/bot/molt/android/ui/RootScreen.kt +++ b/apps/android/app/src/main/java/bot/molt/android/ui/RootScreen.kt @@ -56,7 +56,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import com.clawdbot.android.DeepLinkSheet +import bot.molt.android.DeepLinkSheet import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color as ComposeColor diff --git a/apps/android/app/src/main/java/bot/molt/android/ui/SettingsSheet.kt b/apps/android/app/src/main/java/bot/molt/android/ui/SettingsSheet.kt index fb806a949..1d77c16d5 100644 --- a/apps/android/app/src/main/java/bot/molt/android/ui/SettingsSheet.kt +++ b/apps/android/app/src/main/java/bot/molt/android/ui/SettingsSheet.kt @@ -23,7 +23,9 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items