Skip to content

Commit

Permalink
Features/android js develop (#438)
Browse files Browse the repository at this point in the history
* [add]:Demo中增加JS入口

* [add]:DevTools悬浮窗 UI

* [add]:DevTools悬浮窗 (尝试获取扫码结果)

* [add]:DevTools悬浮窗 (获取扫码结果final)

* [add]:扫码三合一通信模式

* [add]:扫码三合一通信模式(功能实现)

* [add]:GaiaXJS addEventListener(done)

* [add]:GaiaXJS Debug模式(finished)

* [add]:DevTools 代码整理(todo:断开连接,关闭DevTools)

* [add]:GaiaXJS 代码整理(todo:internal可见性)

* [add]:GaiaXJS完整版
1.新增了BuildIn方法(storageApi、tipsApi、timerApi)
2.Dome新增了自定义module和ApiTest两个Demo

* [add]:修改了模块名

* [add]:GaiaXJS结构调整

* [add]:合并主工程

* [add]:结构化拆分 对外提供GXJSEngineFactory和GXJSComponentDelegate

* [add]:优化JSEngine创建逻辑(一个类型只允许创建一次)

* [add]:引入GaiaXAndroidJSAdapter解决GaiaXJS和GaiaX渲染引擎的初始化

* [add]:注释优化

* [fix]:修复JSTimer中clearInterval失效的问题。JS使用中,当setInterval的箭头函数中直接调用clearInterval失效的case。

* [add]:更新了示例代码,js源码放在/gaiax_js_code路径下 notes:源码不能直接使用,需要通过studio输出产生index.js

* [add]:添加了原生按钮示例为demo发送消息

* [add]:暴露了原生发送JS消息的方法,notes:注意定义的数据协议userData和type必须保持一致

* add reconnect

* add reconnect function

* add reconnect funciton

* add reconnect function

---------

Co-authored-by: shisan.lms <[email protected]>
Co-authored-by: chy <[email protected]>
Co-authored-by: cofbro <[email protected]>
  • Loading branch information
4 people authored Sep 23, 2023
1 parent fad261c commit 5d56bc7
Show file tree
Hide file tree
Showing 242 changed files with 117,655 additions and 121 deletions.
Binary file added .gradle/6.7.1/fileChanges/last-build.bin
Binary file not shown.
Binary file added .gradle/6.7.1/fileHashes/fileHashes.lock
Binary file not shown.
Empty file added .gradle/6.7.1/gc.properties
Empty file.
Binary file added .gradle/checksums/checksums.lock
Binary file not shown.
Empty file.
Empty file added .gradle/vcs-1/gc.properties
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,32 @@ import java.io.UnsupportedEncodingException
import java.net.URLDecoder
import java.util.regex.Pattern

class GXClientToStudio {

/**
* @author: shisan.lms
* @date: 2023-02-02
* Description: Studio扫码三合一通道
*/
class GXClientToStudioMultiType {
interface GXSocketToStudioListener {
fun onAddData(templateId: String, templateData: JSONObject)
fun onUpdate(templateId: String, templateData: JSONObject)
}

interface GXSocketJSReceiveListener {
fun onCallSyncFromStudioWorker(socketId: Int, params: JSONObject)

fun onCallAsyncFromStudioWorker(socketId: Int, params: JSONObject)

fun onCallPromiseFromStudioWorker(socketId: Int, params: JSONObject)

fun onCallGetLibraryFromStudioWorker(socketId: Int, methodName: String)
}

var applicationContext: Context? = null

var gxSocketToStudioListener: GXSocketToStudioListener? = null


private var socketHelper: GXSocket? = null
private var currentAddress: String? = null
private var currentTemplateId: String? = null
Expand All @@ -29,21 +44,26 @@ class GXClientToStudio {
private val gxSocketListener: GXSocket.GXSocketListener = object : GXSocket.GXSocketListener {

override fun onSocketConnected() {
sendInitMsg(currentType)
sendInitMsg()

}

override fun onSocketDisconnected() {
if (isWaitDisconnectMsgThenConnectGaiaStudio) {
//ip改变时的断开重连
isWaitDisconnectMsgThenConnectGaiaStudio = false
toConnectGaiaStudio()
}
socketHelper?.devTools?.changeDevToolsConnectedStateView()
}

override fun onStudioConnected() {

Log.d(TAG, "onStudioConnected() called currentTemplateId = $currentTemplateId")
if (currentTemplateId != null) {
socketHelper?.sendGetTemplateData103(currentTemplateId)
socketHelper?.sendGetTemplateData(currentTemplateId)
}
socketHelper?.devTools?.changeDevToolsConnectedStateView()
}

override fun onStudioAddData(templateId: String, templateData: JSONObject) {
Expand All @@ -67,7 +87,7 @@ class GXClientToStudio {
socketHelper = null
}

fun manualConnect(context: Context, params: JSONObject) {
fun manualConnect1(context: Context, params: JSONObject) {
if (isConnectVpn(context)) {
Log.e(TAG, "manualConnect: 请断开手机VPN后重试")
return
Expand All @@ -90,6 +110,17 @@ class GXClientToStudio {
tryToConnectGaiaStudio(targetUrl, templateId, type)
}

fun manualConnect(context: Context, params: JSONObject) {
if (isConnectVpn(context)) {
Log.e(TAG, "manualConnect: 请断开手机VPN后重试")
return
}
Log.e(TAG, "onlyConnect() called with: params = [$params]")
val targetUrl = params.getString("URL")
val type = params.getString("TYPE")
tryToConnectGaiaStudio(targetUrl, null, type)
}

fun getParams(url: String?): JSONObject? {
if (url == null || TextUtils.isEmpty(url)) {
return null
Expand All @@ -107,12 +138,12 @@ class GXClientToStudio {
if (matcher.find()) {
//局域网下IP
val targetUrl = matcher.group()
val templateId = parseTemplateId(finalUrl)
// val templateId = parseTemplateId(finalUrl)
val type = parseConnectType(finalUrl)
val result = JSONObject()
result["URL"] = targetUrl
result["TYPE"] = type
result["TEMPLATE_ID"] = templateId
// result["TEMPLATE_ID"] = templateId
Log.e(TAG, "getParams() called with: result = [$result]")
return result
} else {
Expand All @@ -121,16 +152,16 @@ class GXClientToStudio {
return null
}

private fun parseConnectType(url: String): String {
try {
return url.split("&".toRegex()).toTypedArray()[2].split("=".toRegex()).toTypedArray()[1]
} catch (e: Exception) {
e.printStackTrace()
}
return ""
}
// private fun parseConnectType(url: String): String {
// try {
// return url.split("&".toRegex()).toTypedArray()[2].split("=".toRegex()).toTypedArray()[1]
// } catch (e: Exception) {
// e.printStackTrace()
// }
// return ""
// }

private fun parseTemplateId(url: String): String {
private fun parseConnectType(url: String): String {
try {
return url.split("&".toRegex()).toTypedArray()[1].split("=".toRegex()).toTypedArray()[1]
} catch (e: Exception) {
Expand All @@ -152,10 +183,7 @@ class GXClientToStudio {
}

private fun tryToConnectGaiaStudio(address: String, templateId: String?, type: String) {
Log.e(
TAG,
"tryToConnectGaiaStudio() called with: address = [$address], templateId = [$templateId], type = [$type]"
)
Log.e(TAG, "tryToConnectGaiaStudio() called with: address = [$address], templateId = [$templateId], type = [$type]")
val tmpAddress = currentAddress
currentType = type
currentAddress = address
Expand All @@ -175,28 +203,74 @@ class GXClientToStudio {
socketHelper?.gxSocketListener = gxSocketListener
socketHelper?.connectToServer(currentAddress)
} else {
sendInitMsg(currentType)
sendInitMsg()
}
}

private fun sendInitMsg(type: String) {
if (socketHelper?.isManualPush(type) == true) {
socketHelper?.sendMsgWithManualPushInit()
} else if (socketHelper?.isFastPreview(type) == true) {
socketHelper?.sendMsgWithFastPreviewInit()
}
private fun sendInitMsg() {
socketHelper?.sendMsgWithMultiTypeInit()
}

fun sendMessage(data: JSONObject) {
socketHelper?.sendMessage(data)
}


fun sendMsgForObtainMode() {
Log.d(GXSocket.TAG, "sendMsgForObtainMode() called ")
val data = JSONObject()
data["jsonrpc"] = "2.0"
data["method"] = "mode/get"
data["id"] = 302
socketHelper?.sendMessage(data)
}

fun sendMsgForDisconnect() {
val data = JSONObject()
data["jsonrpc"] = "2.0"
data["method"] = "close"
socketHelper?.sendMessage(data)
}

fun sendMsgForGetTemplateData(templateId: String?) {
socketHelper?.sendGetTemplateData(templateId)
}

fun sendMsgForJSLog(logLevel: String, logContent: String) {
val data = JSONObject()
data["jsonrpc"] = "2.0"
data["method"] = "js/console"
val params = JSONObject()
params["level"] = logLevel
params["data"] = logContent
data["params"] = params
socketHelper?.sendMessage(data)
}

fun setDevTools(dev: IDevTools) {
socketHelper?.devTools = dev
}

fun setJSReceiverListener(listener: GXSocketJSReceiveListener) {
socketHelper?.gxSocketJSReceiveListener = listener
}

fun isGaiaStudioConnected(): Boolean? {
return socketHelper?.gxSocketIsConnected
}

companion object {
const val TAG = "[GaiaX][GXStudio]"
const val TAG = "[GXStudioMulti]"

const val PREVIEW_AUTO = "auto"
const val PREVIEW_MANUAL = "manual"
const val PREVIEW_NONE = "none"

const val JS_DEFAULT = "default"
const val JS_BREAKPOINT = "breakpoint"

val instance by lazy {
GXClientToStudio()
GXClientToStudioMultiType()
}
}

}
Loading

0 comments on commit 5d56bc7

Please sign in to comment.