提交 0b1bb280 编写于 作者: 囧jt's avatar 囧jt

modify:

[Android]: auto-service bug fixed
上级 5a56ceee
......@@ -5,6 +5,7 @@ import com.didichuxing.doraemonkit.constant.WSMode
import com.didichuxing.doraemonkit.extension.doKitGlobalScope
import com.didichuxing.doraemonkit.extension.sortedByKey
import com.didichuxing.doraemonkit.extension.toMap
import com.didichuxing.doraemonkit.kit.mc.all.McConstant
import com.didichuxing.doraemonkit.kit.network.NetworkManager
import com.didichuxing.doraemonkit.kit.network.okhttp.InterceptorUtil
import com.didichuxing.doraemonkit.kit.network.okhttp.interceptor.AbsDoKitInterceptor
......@@ -69,7 +70,7 @@ class DokitMcInterceptor : AbsDoKitInterceptor() {
doKitGlobalScope.launch {
val httInfo = HttpInfo(
DoKitConstant.PRODUCT_ID,
"caseId",
McConstant.MC_CASE_ID,
key,
method,
path,
......@@ -80,7 +81,10 @@ class DokitMcInterceptor : AbsDoKitInterceptor() {
strResponseBody
)
val resulit = McHttpManager.uploadHttpInfo<Any>(httInfo)
val result = McHttpManager.uploadHttpInfo<Any>(httInfo)
if (result.code != McHttpManager.RESPONSE_OK) {
LogHelper.e(TAG, "e===>${result.msg}")
}
}
......
......@@ -3,16 +3,14 @@ package com.didichuxing.doraemonkit.kit.mc.ability
import com.android.volley.Request
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import com.didichuxing.doraemonkit.constant.DoKitConstant
import com.didichuxing.doraemonkit.kit.mc.all.ui.McCaseInfoDialogProvider
import com.didichuxing.doraemonkit.kit.mc.all.ui.McResInfo
import com.didichuxing.doraemonkit.kit.mc.all.ui.data.McCaseInfo
import com.didichuxing.doraemonkit.kit.mc.all.ui.data.McResInfo
import com.didichuxing.doraemonkit.util.GsonUtils
import com.didichuxing.doraemonkit.util.ToastUtils
import com.didichuxing.doraemonkit.volley.VolleyManager
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.request.*
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import org.json.JSONObject
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
......@@ -55,7 +53,7 @@ object McHttpManager {
@Throws(Exception::class)
suspend fun <T> getMcConfig(): McResInfo<T> = suspendCoroutine {
suspend inline fun <reified T> getMcConfig(): McResInfo<T> = suspendCoroutine {
val jsonObject = JSONObject()
jsonObject.put("pId", DoKitConstant.PRODUCT_ID)
val request = JsonObjectRequest(
......@@ -71,12 +69,12 @@ object McHttpManager {
@Throws(Exception::class)
suspend fun <T> mockStart(): McResInfo<T> = suspendCoroutine {
suspend inline fun <reified T> mockStart(): McResInfo<T> = suspendCoroutine {
val request = JsonObjectRequest(
"$host/app/multiControl/startRecord",
JSONObject(GsonUtils.toJson(AppInfo())),
{ response ->
it.resume(convert2McResInfo(response))
it.resume(convert2McResInfo<T>(response))
}, { error ->
it.resumeWithException(error)
})
......@@ -85,20 +83,21 @@ object McHttpManager {
@Throws(Exception::class)
suspend fun <T> uploadHttpInfo(httpInfo: HttpInfo): McResInfo<T> = suspendCoroutine {
val request = JsonObjectRequest(
"$host/app/multiControl/uploadApiInfo",
JSONObject(GsonUtils.toJson(httpInfo)),
{ response ->
it.resume(convert2McResInfo(response))
}, { error ->
it.resumeWithException(error)
})
VolleyManager.add(request)
}
suspend inline fun <reified T> uploadHttpInfo(httpInfo: HttpInfo): McResInfo<T> =
suspendCoroutine {
val request = JsonObjectRequest(
"$host/app/multiControl/uploadApiInfo",
JSONObject(GsonUtils.toJson(httpInfo)),
{ response ->
it.resume(convert2McResInfo(response))
}, { error ->
it.resumeWithException(error)
})
VolleyManager.add(request)
}
@Throws(Exception::class)
suspend fun <T> mockStop(caseInfo: McCaseInfoDialogProvider.CaseInfo): McResInfo<T> =
suspend inline fun <reified T> mockStop(caseInfo: McCaseInfoDialogProvider.CaseInfo): McResInfo<T> =
suspendCoroutine {
val request = JsonObjectRequest(
"$host/app/multiControl/endRecord",
......@@ -113,10 +112,10 @@ object McHttpManager {
@Throws(Exception::class)
suspend fun <T> mockCaseList(): McResInfo<T> = suspendCoroutine {
suspend inline fun <reified T> caseList(): McResInfo<T> = suspendCoroutine {
val request = StringRequest(
Request.Method.GET,
"$host/app/multiControl/caseList",
"$host/app/multiControl/caseList?pId=${DoKitConstant.PRODUCT_ID}",
{ response ->
it.resume(convert2McResInfo(JSONObject(response)))
}, { error ->
......@@ -127,7 +126,7 @@ object McHttpManager {
@Throws(Exception::class)
suspend fun <T> httpMatch(requestKey: String): McResInfo<T> = suspendCoroutine {
suspend inline fun <reified T> httpMatch(requestKey: String): McResInfo<T> = suspendCoroutine {
val jsonObject = JSONObject()
jsonObject.put("key", requestKey)
jsonObject.put("caseId", "caseId")
......@@ -142,8 +141,19 @@ object McHttpManager {
VolleyManager.add(request)
}
private fun <T> convert2McResInfo(response: JSONObject): McResInfo<T> {
return GsonUtils.fromJson(response.toString(), McResInfo::class.java) as McResInfo<T>
inline fun <reified T> convert2McResInfo(json: JSONObject): McResInfo<T> {
val mcInfo = McResInfo<T>(
json.getInt("code"),
json.getString("msg")
)
val dataInfo: T? = try {
val dataJson = json.getJSONObject("data").toString()
GsonUtils.fromJson(dataJson, T::class.java)
} catch (e: Exception) {
null
}
mcInfo.data = dataInfo
return mcInfo
}
}
\ No newline at end of file
......@@ -2,13 +2,15 @@ package com.didichuxing.doraemonkit.kit.mc.all.ui
import android.os.Bundle
import android.view.View
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.didichuxing.doraemonkit.kit.core.BaseFragment
import com.didichuxing.doraemonkit.kit.mc.ability.McHttpManager
import com.didichuxing.doraemonkit.mc.R
import com.didichuxing.doraemonkit.util.TimeUtils
import com.didichuxing.doraemonkit.util.ToastUtils
import com.didichuxing.doraemonkit.widget.recyclerview.DividerItemDecoration
import kotlinx.coroutines.launch
/**
* ================================================
......@@ -35,7 +37,7 @@ class DoKitMcDatasFragment : BaseFragment() {
val decoration = DividerItemDecoration(DividerItemDecoration.VERTICAL)
decoration.setDrawable(resources.getDrawable(R.drawable.dk_divider))
mRv.addItemDecoration(decoration)
mAdapter = McCaseListAdapter(createCaseList())
mAdapter = McCaseListAdapter(mutableListOf<McCaseInfo>())
mAdapter.setOnItemClickListener { adapter, _, pos ->
for (i in adapter.data) {
(i as McCaseInfo).isChecked = false
......@@ -46,20 +48,12 @@ class DoKitMcDatasFragment : BaseFragment() {
ToastUtils.showShort("用例${item.caseName}已被选中")
}
mRv.adapter = mAdapter
}
private fun createCaseList(): MutableList<McCaseInfo> {
val list: MutableList<McCaseInfo> = mutableListOf()
for (index in 0..100) {
if (index == 0) {
list.add(McCaseInfo("item $index", "jintai", TimeUtils.getNowString(), true))
} else {
list.add(McCaseInfo("item $index", "jintai", TimeUtils.getNowString(), false))
}
lifecycleScope.launch {
val data = McHttpManager.caseList<MutableList<McCaseInfo>>().data
mAdapter.setList(data)
}
return list
}
}
\ No newline at end of file
......@@ -14,6 +14,7 @@ import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.lifecycleScope
import com.didichuxing.doraemonkit.constant.DoKitConstant
import com.didichuxing.doraemonkit.constant.WSMode
import com.didichuxing.doraemonkit.extension.isTrueWithCor
import com.didichuxing.doraemonkit.util.GsonUtils
import com.didichuxing.doraemonkit.util.ToastUtils
import com.didichuxing.doraemonkit.kit.core.BaseFragment
......@@ -22,6 +23,7 @@ import com.didichuxing.doraemonkit.kit.mc.ability.McHttpManager
import com.didichuxing.doraemonkit.kit.mc.ability.McHttpManager.RESPONSE_OK
import com.didichuxing.doraemonkit.kit.mc.all.DoKitWindowManager
import com.didichuxing.doraemonkit.kit.mc.all.McConstant
import com.didichuxing.doraemonkit.kit.mc.all.ui.data.McCaseInfo
import com.didichuxing.doraemonkit.kit.mc.client.DoKitWsClient
import com.didichuxing.doraemonkit.kit.mc.server.HostInfo
import com.didichuxing.doraemonkit.kit.mc.server.RecordingDokitView
......@@ -34,8 +36,6 @@ import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.json.JSONObject
import org.xml.sax.ErrorHandler
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
......@@ -99,32 +99,34 @@ class DoKitMcMainFragment : BaseFragment() {
return@setOnClickListener
}
if (DoKitConstant.WS_MODE == WSMode.RECORDING) {
ToastUtils.showShort("当前已处于录制状态")
return@setOnClickListener
}
//请求一个CaseId
lifecycleScope.launch(exceptionHandler) {
if (interceptDialogResult()) {
interceptDialogResult().isTrueWithCor(isFalse = {
ToastUtils.showShort("取消用例采集")
}) {
try {
val resInfo = McHttpManager.mockStart<Any>()
val resInfo = McHttpManager.mockStart<McCaseInfo>()
if (resInfo.code == RESPONSE_OK) {
val configInfo = resInfo.data
McConstant.MC_CASE_ID = configInfo?.caseId ?: ""
SimpleDokitStarter.startFloating(RecordingDokitView::class.java)
LogHelper.i(TAG, "result===>$resInfo")
DoKitConstant.WS_MODE = WSMode.RECORDING
ToastUtils.showShort("用例开始采集")
ToastUtils.showShort("开始用例采集")
}
} catch (e: Exception) {
LogHelper.e(TAG, "e===>${e.message}")
DoKitConstant.WS_MODE = WSMode.UNKNOW
ToastUtils.showShort("用例采集启动失败")
LogHelper.i(
TAG, "e===>${e.message} thread===>${Thread.currentThread().name}"
)
}
} else {
ToastUtils.showShort("取消用例采集")
}
}
}
......@@ -153,9 +155,9 @@ class DoKitMcMainFragment : BaseFragment() {
//加载exclude key
if (DoKitConstant.PRODUCT_ID.isNotEmpty()) {
lifecycleScope.launch(exceptionHandler) {
val config = McHttpManager.getMcConfig<Boolean>()
val config = McHttpManager.getMcConfig<Any>()
if (config.code == RESPONSE_OK) {
LogHelper.i(TAG, "config===>$config")
//LogHelper.i(TAG, "config===>$config")
} else {
ToastUtils.showShort(config.msg)
}
......@@ -292,7 +294,12 @@ class DoKitMcMainFragment : BaseFragment() {
return false
}
it.resume(McCaseInfoDialogProvider.CaseInfo(caseName, personName))
it.resume(
McCaseInfoDialogProvider.CaseInfo(
caseName = caseName,
personName = personName
)
)
return true
}
......
package com.didichuxing.doraemonkit.kit.mc.all.ui
import android.text.TextUtils
import android.view.View
import android.widget.EditText
import android.widget.TextView
import com.didichuxing.doraemonkit.constant.DoKitConstant
import com.didichuxing.doraemonkit.kit.mc.all.McConstant
import com.didichuxing.doraemonkit.mc.R
import com.didichuxing.doraemonkit.widget.dialog.DialogListener
import com.didichuxing.doraemonkit.widget.dialog.DialogProvider
......@@ -18,7 +19,7 @@ class McCaseInfoDialogProvider internal constructor(data: Any?, listener: Dialog
private lateinit var mPositive: TextView
private lateinit var mNegative: TextView
private lateinit var mCaseName: EditText
private lateinit var mUserName: EditText
private lateinit var mPersonName: EditText
override fun getLayoutId(): Int {
return R.layout.dk_dialog_mc_case_info
}
......@@ -27,7 +28,7 @@ class McCaseInfoDialogProvider internal constructor(data: Any?, listener: Dialog
mPositive = view.findViewById(R.id.positive)
mNegative = view.findViewById(R.id.negative)
mCaseName = view.findViewById(R.id.edit_case_name)
mUserName = view.findViewById(R.id.edit_user_name)
mPersonName = view.findViewById(R.id.edit_user_name)
}
......@@ -44,12 +45,20 @@ class McCaseInfoDialogProvider internal constructor(data: Any?, listener: Dialog
}
fun getCaseInfo(): CaseInfo {
return CaseInfo(mCaseName.text.toString(), mUserName.text.toString())
return CaseInfo(
caseName = mCaseName.text.toString(),
personName = mPersonName.text.toString()
)
}
override fun isCancellable(): Boolean {
return false
}
data class CaseInfo(val caseName: String, val personName: String)
data class CaseInfo(
val pId: String = DoKitConstant.PRODUCT_ID,
val caseId: String = McConstant.MC_CASE_ID,
val caseName: String,
val personName: String
)
}
\ No newline at end of file
package com.didichuxing.doraemonkit.kit.mc.all.ui.data
import com.google.gson.annotations.Expose
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2021/7/1-20:39
* 描 述:
* 修订历史:
* ================================================
*/
data class McCaseInfo(
@Expose
val caseId: String,
@Expose
val time: String
)
package com.didichuxing.doraemonkit.kit.mc.all.ui
package com.didichuxing.doraemonkit.kit.mc.all.ui.data
/**
* ================================================
......@@ -9,4 +9,4 @@ package com.didichuxing.doraemonkit.kit.mc.all.ui
* 修订历史:
* ================================================
*/
data class McResInfo<T>(val code: Int = 0, val data: T? = null, val msg: String = "")
data class McResInfo<T>(val code: Int = 0, val msg: String = "", var data: T? = null)
package com.didichuxing.doraemonkit
import com.didichuxing.doraemonkit.kit.mc.all.ui.data.McCaseInfo
import com.didichuxing.doraemonkit.kit.mc.all.ui.data.McResInfo
import com.google.gson.Gson
import org.json.JSONObject
import org.junit.Test
/**
......@@ -17,12 +21,63 @@ class ExampleUnitTest {
//
// System.out.println(wsEvent.getFrom());
val list = listOf<Int>(1, 2, 3, 4, 5, 6, 7)
list.forEach {
if (it == 3) {
return@forEach
}
println(it)
}
// val list = listOf<Int>(1, 2, 3, 4, 5, 6, 7)
// list.forEach {
// if (it == 3) {
// return@forEach
// }
// println(it)
// }
val json = "{\n" +
" \"code\":200,\n" +
" \"data\":{\n" +
" \"pId\":\"749a0600b5e48dd77cf8ee680be7b1b7\",\n" +
" \"appName\":\"DoKitDemo\",\n" +
" \"appVersion\":\"1.0.0\",\n" +
" \"dokitVersion\":\"3.4.0-alpha04\",\n" +
" \"phoneMode\":\"Pixel\",\n" +
" \"systemVersion\":\"9\",\n" +
" \"time\":\"2021-07-01 20:58:49\",\n" +
" \"caseId\":\"9f753c00ee37b5bbd259b52131d8d101\",\n" +
" \"createTime\":\"2021-07-01 20:58:46\",\n" +
" \"curStatus\":{\n" +
" \"status\":\"new\",\n" +
" \"id\":\"new\",\n" +
" \"date\":1625144326244\n" +
" },\n" +
" \"statusList\":[\n" +
" {\n" +
" \"status\":\"new\",\n" +
" \"id\":\"new\",\n" +
" \"date\":1625144326244\n" +
" }\n" +
" ],\n" +
" \"createDate\":1625144326244,\n" +
" \"_id\":\"60ddbc06cd1bac0128fbb736\"\n" +
" },\n" +
" \"msg\":\"\"\n" +
"}"
val info = convert2McResInfo<McCaseInfo>(JSONObject(json))
println("info===>${info.data}")
}
private inline fun <reified T> convert2McResInfo(json: JSONObject): McResInfo<T> {
val mcInfo = McResInfo<T>(
json.getInt("code"),
json.getString("msg"),
T::class.java.newInstance()
)
val dataInfo = Gson().fromJson(json.getJSONObject("data").toString(), T::class.java)
mcInfo.data = dataInfo
return mcInfo
}
}
\ No newline at end of file
......@@ -30,6 +30,7 @@ val doKitGlobalScope = MainScope() + CoroutineName("DoKit")
*/
fun Boolean?.isTrue(
error: (String) -> Unit = { LogHelper.e("DoKit", it) },
isFalse: () -> Unit = {},
action: () -> Unit
) {
if (this == null) {
......@@ -37,6 +38,23 @@ fun Boolean?.isTrue(
}
if (this == true) {
action()
} else {
isFalse()
}
}
suspend fun Boolean?.isTrueWithCor(
error: suspend (String) -> Unit = { LogHelper.e("DoKit", it) },
isFalse: suspend () -> Unit = {},
action: suspend () -> Unit
) {
if (this == null) {
error("Boolean is null")
}
if (this == true) {
action()
} else {
isFalse()
}
}
......@@ -46,6 +64,7 @@ fun Boolean?.isTrue(
*/
fun Boolean?.isFalse(
error: (String) -> Unit = { LogHelper.e("DoKit", it) },
isTrue: () -> Unit = {},
action: () -> Unit
) {
if (this == null) {
......@@ -53,6 +72,26 @@ fun Boolean?.isFalse(
}
if (this == false) {
action()
} else {
isTrue()
}
}
/**
* Boolean 扩展函数
*/
suspend fun Boolean?.isFalseWithCor(
error: suspend (String) -> Unit = { LogHelper.e("DoKit", it) },
isTrue: suspend () -> Unit = {},
action: suspend () -> Unit
) {
if (this == null) {
error("Boolean is null")
}
if (this == false) {
action()
} else {
isTrue()
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册