diff --git a/apps/android/.idea/deploymentTargetDropDown.xml b/apps/android/.idea/deploymentTargetDropDown.xml index b2a5949802..230c77f89f 100644 --- a/apps/android/.idea/deploymentTargetDropDown.xml +++ b/apps/android/.idea/deploymentTargetDropDown.xml @@ -6,12 +6,12 @@ - - + + - - + + \ No newline at end of file diff --git a/apps/android/app/src/main/cpp/simplex-api.c b/apps/android/app/src/main/cpp/simplex-api.c index f2dadcb131..e9178df5c4 100644 --- a/apps/android/app/src/main/cpp/simplex-api.c +++ b/apps/android/app/src/main/cpp/simplex-api.c @@ -22,42 +22,20 @@ Java_chat_simplex_app_SimplexAppKt_initHS(__unused JNIEnv *env, __unused jclass } // from simplex-chat -typedef void* chat_store; -typedef void* controller; +typedef void* chat_ctrl; -extern chat_store chat_init_store(const char * path); -extern char *chat_get_user(chat_store store); -extern char *chat_create_user(chat_store store, const char *data); -extern controller chat_start(chat_store store); -extern char *chat_send_cmd(controller ctl, const char *cmd); -extern char *chat_recv_msg(controller ctl); +extern chat_ctrl chat_init(const char * path); +extern char *chat_send_cmd(chat_ctrl ctrl, const char *cmd); +extern char *chat_recv_msg(chat_ctrl ctrl); JNIEXPORT jlong JNICALL Java_chat_simplex_app_SimplexAppKt_chatInit(JNIEnv *env, __unused jclass clazz, jstring datadir) { const char *_data = (*env)->GetStringUTFChars(env, datadir, JNI_FALSE); - jlong res = (jlong)chat_init_store(_data); + jlong res = (jlong)chat_init(_data); (*env)->ReleaseStringUTFChars(env, datadir, _data); return res; } -JNIEXPORT jstring JNICALL -Java_chat_simplex_app_SimplexAppKt_chatGetUser(JNIEnv *env, __unused jclass clazz, jlong controller) { - return (*env)->NewStringUTF(env, chat_get_user((void*)controller)); -} - -JNIEXPORT jstring JNICALL -Java_chat_simplex_app_SimplexAppKt_chatCreateUser(JNIEnv *env, __unused jclass clazz, jlong controller, jstring data) { - const char *_data = (*env)->GetStringUTFChars(env, data, JNI_FALSE); - jstring res = (*env)->NewStringUTF(env, chat_create_user((void*)controller, _data)); - (*env)->ReleaseStringUTFChars(env, data, _data); - return res; -} - -JNIEXPORT jlong JNICALL -Java_chat_simplex_app_SimplexAppKt_chatStart(JNIEnv *env, jclass clazz, jlong controller) { - return (jlong)chat_start((void*)controller); -} - JNIEXPORT jstring JNICALL Java_chat_simplex_app_SimplexAppKt_chatSendCmd(JNIEnv *env, __unused jclass clazz, jlong controller, jstring msg) { const char *_msg = (*env)->GetStringUTFChars(env, msg, JNI_FALSE); diff --git a/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt b/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt index b08096a37e..2d940c067c 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/SimplexApp.kt @@ -3,8 +3,7 @@ package chat.simplex.app import android.app.Application import android.net.LocalServerSocket import android.util.Log -import chat.simplex.app.model.ChatController -import chat.simplex.app.model.ChatModel +import chat.simplex.app.model.* import java.io.BufferedReader import java.io.InputStreamReader import java.lang.ref.WeakReference @@ -18,29 +17,29 @@ external fun initHS() external fun pipeStdOutToSocket(socketName: String) : Int // SimpleX API -typealias Controller = Long -typealias Store = Long -external fun chatInit(filesDir: String): Store -external fun chatGetUser(controller: Store) : String -external fun chatCreateUser(controller: Store, data: String) : String -external fun chatStart(controller: Store) : Controller -external fun chatSendCmd(controller: Controller, msg: String) : String -external fun chatRecvMsg(controller: Controller) : String +typealias ChatCtrl = Long +external fun chatInit(path: String): ChatCtrl +external fun chatSendCmd(ctrl: ChatCtrl, msg: String) : String +external fun chatRecvMsg(ctrl: ChatCtrl) : String class SimplexApp: Application() { private lateinit var controller: ChatController override fun onCreate() { super.onCreate() - val store: Store = chatInit(applicationContext.filesDir.toString()) - // create user if needed - if (chatGetUser(store) == "{}") { - chatCreateUser(store, """ - {"displayName": "test", "fullName": "android test"} - """.trimIndent()) + controller = ChatController(chatInit(applicationContext.filesDir.toString())) + var user = controller.apiGetActiveUser() + if (user == null) { +// user = controller.apiCreateActiveUser(Profile("android", "Android test")) + } + Log.d("SIMPLEX (user)", user.toString()) + try { + controller.apiStartChat() + Log.d("SIMPLEX", "started chat") + } catch(e: Error) { + Log.d("SIMPLEX", "failed starting chat $e") +// throw e } - Log.d("SIMPLEX (user)", chatGetUser(store)) - controller = ChatController(chatStart(store)) } val chatModel by lazy { diff --git a/apps/android/app/src/main/java/chat/simplex/app/model/SImpleXAPI.kt b/apps/android/app/src/main/java/chat/simplex/app/model/SImpleXAPI.kt index c6bc16871a..1dec8dabb6 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/model/SImpleXAPI.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/model/SImpleXAPI.kt @@ -14,7 +14,7 @@ import kotlin.concurrent.thread typealias Controller = Long open class ChatController(val ctrl: Controller) { - private lateinit var chatModel: ChatModel + private var chatModel: ChatModel? = null fun setModel(m: ChatModel) { chatModel = m @@ -26,16 +26,35 @@ open class ChatController(val ctrl: Controller) { while(true) { val json = chatRecvMsg(ctrl) Log.d("SIMPLEX chatRecvMsg: ", json) - chatModel.terminalItems.add(TerminalItem.Resp(APIResponse.decodeStr(json))) + chatModel?.terminalItems?.add(TerminalItem.Resp(APIResponse.decodeStr(json))) } } } - fun sendCmd(cmd: String) { - val json = chatSendCmd(ctrl, cmd) - Log.d("SIMPLEX chatSendCmd: ", cmd) - Log.d("SIMPLEX chatSendCmd response: ", json) - chatModel.terminalItems.add(TerminalItem.Resp(APIResponse.decodeStr(json))) + fun sendCmd(cmd: CC): CR { + val c = cmd.cmdString + val json = chatSendCmd(ctrl, c) + Log.d("SIMPLEX", "sendCmd: $c") + Log.d("SIMPLEX", "sendCmd response $json") + chatModel?.terminalItems?.add(TerminalItem.Resp(APIResponse.decodeStr(json))) + return APIResponse.decodeStr(json) + } + + fun apiGetActiveUser(): User? { + val r = sendCmd(CC.ShowActiveUser()) + return if (r is CR.ActiveUser) r.user else null + } + + fun apiCreateActiveUser(p: Profile): User { + val r = sendCmd(CC.CreateActiveUser(p)) + if (r is CR.ActiveUser) return r.user + throw Error("failed creating user: ${r.toString()}") + } + + fun apiStartChat() { + val r = sendCmd(CC.StartChat()) + if (r is CR.ChatStarted) return + throw Error("failed starting chat: ${r.toString()}") } class Mock: ChatController(0) {} @@ -112,6 +131,13 @@ sealed class CR { override val details get() = user.toString() } + @Serializable + @SerialName("chatStarted") + class ChatStarted: CR() { + override val responseType get() = "chatStarted" + override val details get() = CR.noDetails(this) + } + @Serializable @SerialName("contactSubscribed") class ContactSubscribed(val contact: Contact): CR() { @@ -121,7 +147,7 @@ sealed class CR { @Serializable class Response(val type: String, val json: String): CR() { - override val responseType get() = "* ${type}" + override val responseType get() = "* $type" override val details get() = json } @@ -131,10 +157,9 @@ sealed class CR { override val details get() = str } - // {"resp": {"activeUser": {"user": {}}}} - // {"resp": {"anythingElse": }} -> Unknown(type = "anythingElse", json = "") - - // {"type": "activeUser", "user": } + companion object { + fun noDetails(r: CR): String ="${r.responseType}: no details" + } } abstract class TerminalItem { diff --git a/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt b/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt index c85f9124e1..05f990dcf7 100644 --- a/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt +++ b/apps/android/app/src/main/java/chat/simplex/app/views/TerminalView.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview +import chat.simplex.app.model.CC import chat.simplex.app.model.ChatModel import chat.simplex.app.model.TerminalItem import chat.simplex.app.ui.theme.SimpleXTheme @@ -16,7 +17,9 @@ import chat.simplex.app.views.chat.SendMsgView fun TerminalView(chatModel: ChatModel) { Column { TerminalLog(chatModel.terminalItems) - SendMsgView(chatModel.controller::sendCmd) + SendMsgView(sendMessage = { cmd -> + chatModel.controller.sendCmd(CC.Console(cmd)) + }) } }