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

modify:

[Android]: 新增主机断开通知
上级 e3a88810
......@@ -31,7 +31,7 @@ class DemoDokitView : AbsDokitView() {
override fun onViewCreated(rootView: FrameLayout) {
val tvClose = findViewById<TextView>(R.id.tv_close)
tvClose?.setOnClickListener { DokitViewManager.getInstance().detach(this@DemoDokitView) }
tvClose?.setOnClickListener { DokitViewManager.instance.detach(this@DemoDokitView) }
}
......
package com.didichuxing.doraemonkit.kit.mc.ability
import com.didichuxing.doraemonkit.constant.DoKitConstant
import com.didichuxing.doraemonkit.constant.WSMode
import com.didichuxing.doraemonkit.kit.core.DokitAbility
import com.didichuxing.doraemonkit.kit.core.DokitIntent
import com.didichuxing.doraemonkit.kit.core.DokitViewManager
import com.didichuxing.doraemonkit.kit.health.CountDownDokitView
import com.didichuxing.doraemonkit.kit.core.SimpleDokitStarter
import com.didichuxing.doraemonkit.kit.mc.all.McConstant
import com.didichuxing.doraemonkit.kit.mc.client.ClientDokitView
import com.didichuxing.doraemonkit.kit.mc.server.HostDokitView
import com.google.auto.service.AutoService
import com.didichuxing.doraemonkit.kit.mc.server.RecordingDokitView
import com.didichuxing.doraemonkit.util.LogHelper
import com.didichuxing.doraemonkit.util.SPUtils
/**
* ================================================
......@@ -19,6 +24,7 @@ import com.google.auto.service.AutoService
*/
class DokitMcModuleProcessor : DokitAbility.DokitModuleProcessor {
override fun values(): Map<String, Any> {
return mapOf(
"okhttp_interceptor" to DokitMcInterceptor(),
......@@ -32,12 +38,22 @@ class DokitMcModuleProcessor : DokitAbility.DokitModuleProcessor {
"launch_host_view" -> {
val dokitIntent = DokitIntent(HostDokitView::class.java)
dokitIntent.mode = DokitIntent.MODE_ONCE
DokitViewManager.getInstance().attach(dokitIntent)
DokitViewManager.instance.attach(dokitIntent)
}
"launch_client_view" -> {
val dokitIntent = DokitIntent(ClientDokitView::class.java)
dokitIntent.mode = DokitIntent.MODE_ONCE
DokitViewManager.getInstance().attach(dokitIntent)
DokitViewManager.instance.attach(dokitIntent)
}
"launch_recoding_view" -> {
SimpleDokitStarter.startFloating(RecordingDokitView::class.java)
DoKitConstant.IS_MC_RECODING = true
McConstant.MC_CASE_ID =
SPUtils.getInstance().getString(DoKitConstant.MC_CASE_ID_KEY)
DoKitConstant.WS_MODE = WSMode.RECORDING
//添加录制中的悬浮窗
LogHelper.i(TAG, "====launch_recoding_view===")
}
else -> {
......
......@@ -6,6 +6,7 @@ import android.widget.TextView
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.didichuxing.doraemonkit.constant.DoKitConstant
import com.didichuxing.doraemonkit.kit.core.BaseFragment
import com.didichuxing.doraemonkit.kit.mc.ability.McHttpManager
import com.didichuxing.doraemonkit.kit.mc.all.McConstant
......@@ -75,12 +76,12 @@ class DoKitMcDatasFragment : BaseFragment() {
private fun saveCaseId(caseId: String) {
McConstant.MC_CASE_ID = caseId
SPUtils.getInstance().put("mc_case_id", caseId)
SPUtils.getInstance().put(DoKitConstant.MC_CASE_ID_KEY, caseId)
}
private fun loadCaseId(): String {
return if (McConstant.MC_CASE_ID.isEmpty()) {
val caseId = SPUtils.getInstance().getString("mc_case_id", "")
val caseId = SPUtils.getInstance().getString(DoKitConstant.MC_CASE_ID_KEY, "")
McConstant.MC_CASE_ID = caseId
McConstant.MC_CASE_ID
} else {
......
......@@ -13,6 +13,8 @@ import android.widget.Button
import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.lifecycleScope
import com.didichuxing.doraemonkit.constant.DoKitConstant
import com.didichuxing.doraemonkit.constant.DoKitConstant.MC_CASE_ID_KEY
import com.didichuxing.doraemonkit.constant.DoKitConstant.MC_CASE_RECODING_KEY
import com.didichuxing.doraemonkit.constant.WSMode
import com.didichuxing.doraemonkit.extension.isTrueWithCor
import com.didichuxing.doraemonkit.util.GsonUtils
......@@ -30,6 +32,7 @@ import com.didichuxing.doraemonkit.kit.mc.server.HostInfo
import com.didichuxing.doraemonkit.kit.mc.server.RecordingDokitView
import com.didichuxing.doraemonkit.mc.R
import com.didichuxing.doraemonkit.util.LogHelper
import com.didichuxing.doraemonkit.util.SPUtils
import com.didichuxing.doraemonkit.widget.dialog.DialogListener
import com.didichuxing.doraemonkit.widget.dialog.DialogProvider
import com.didichuxing.doraemonkit.zxing.activity.CaptureActivity
......@@ -50,6 +53,7 @@ import kotlin.coroutines.suspendCoroutine
* ================================================
*/
class DoKitMcMainFragment : BaseFragment() {
private val REQUEST_CODE_CAMERA = 0x100
private val REQUEST_CODE_SCAN = 0x101
private val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
......@@ -132,13 +136,9 @@ class DoKitMcMainFragment : BaseFragment() {
ToastUtils.showShort("取消用例采集")
}) {
try {
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)
DoKitConstant.WS_MODE = WSMode.RECORDING
ToastUtils.showShort("开始用例采集")
val caseInfo = McHttpManager.mockStart<McCaseInfo>()
if (caseInfo.code == RESPONSE_OK) {
saveRecodingStatus(caseInfo.data)
}
} catch (e: Exception) {
LogHelper.e(TAG, "e===>${e.message}")
......@@ -167,8 +167,8 @@ class DoKitMcMainFragment : BaseFragment() {
val result = McHttpManager.mockStop<Any>(mcCaseInfoDialog())
if (result.code == RESPONSE_OK) {
DoKitConstant.WS_MODE = WSMode.UNKNOW
SimpleDokitStarter.removeFloating(RecordingDokitView::class.java)
SPUtils.getInstance().put(MC_CASE_RECODING_KEY, false)
ToastUtils.showShort("用例上传成功")
} else {
LogHelper.e(TAG, "error msg===>${result.msg}")
......@@ -204,6 +204,21 @@ class DoKitMcMainFragment : BaseFragment() {
}
/**
* 持久化录制状态 方便重启继续录制
*/
private fun saveRecodingStatus(configInfo: McCaseInfo?) {
configInfo?.let {
McConstant.MC_CASE_ID = it.caseId
SimpleDokitStarter.startFloating(RecordingDokitView::class.java)
DoKitConstant.WS_MODE = WSMode.RECORDING
SPUtils.getInstance().put(MC_CASE_ID_KEY, McConstant.MC_CASE_ID)
SPUtils.getInstance().put(MC_CASE_RECODING_KEY, true)
ToastUtils.showShort("开始用例采集")
}
}
/**
* 执行扫描
......
package com.didichuxing.doraemonkit
import com.didichuxing.doraemonkit.kit.network.room_db.DokitDbManager
import com.didichuxing.doraemonkit.util.EncodeUtils
import didihttp.RequestBody
import okio.Buffer
import java.util.*
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2021/2/8-10:42
* 描 述:
* 修订历史:
* ================================================
*/
/**
* a=aa&b=bb&c=cc
* query键值对字符串转成Map
*/
fun String.toMap(): MutableMap<String, String> {
val map = mutableMapOf<String, String>()
if (this.isBlank()) {
return map
}
val params = this.split("&")
params.forEach { kv ->
val kvs = kv.split("=")
if (kvs.size == 2) {
map[kvs[0]] = kvs[1]
}
}
return map
}
/**
* queryBody转成Map
*/
fun RequestBody?.toMap(): MutableMap<String, String> {
val map = mutableMapOf<String, String>()
if (this == null || this.contentType() == null) {
return map
}
val buffer = Buffer()
this.writeTo(buffer)
val strBody = EncodeUtils.urlDecode(buffer.readUtf8())
strBody?.let {
val contentType = this.contentType().toString().toLowerCase(Locale.ROOT)
when {
contentType.contains(DokitDbManager.MEDIA_TYPE_FORM) -> {
return strBody.toMap()
}
contentType.contains(DokitDbManager.MEDIA_TYPE_JSON) -> {
map["json"] = strBody
return map
}
contentType.contains(DokitDbManager.MEDIA_TYPE_PLAIN) -> {
map["plain"] = strBody
return map
}
else -> {
map["other"] = strBody
return map
}
}
}
return map
}
/**
* 对map 针对key进行排序
*/
fun MutableMap<String, String>.sortedByKey(): Map<String, String> {
return this.toList().sortedBy { (key, _) -> key }.toMap()
}
......@@ -84,8 +84,6 @@ class RpcMcInterceptor : AbsDoKitRpcInterceptor() {
when (DoKitConstant.WS_MODE) {
WSMode.RECORDING -> {
//数据采集
// val responseBody4Base64 = String(EncodeUtils.base64Encode(strResponseBody))
//todo: 实时发送网络请求
doKitGlobalScope.launch {
val httInfo = HttpUploadInfo(
DoKitConstant.PRODUCT_ID,
......
......@@ -46,7 +46,7 @@ class DoKitOrientationEventListener(context: Activity) : OrientationEventListene
if (lastOrientation != innerOrientation) {
//针对dokitView的根布局进行旋转操作
//LogHelper.i(TAG, "innerOrientation===>$innerOrientation")
val dokitView = DokitViewManager.getInstance()
val dokitView = DokitViewManager.instance
.getDokitView(mActivity, MainIconDokitView::class.java.simpleName)
......
......@@ -71,12 +71,8 @@ object DoKitReal {
}
//跨模块通信
val doKitAbilities =
ServiceLoader.load(DokitAbility::class.java, javaClass.classLoader).toList()
doKitAbilities.forEach {
it.init()
DoKitConstant.DOKIT_MODULE_ABILITIES[it.moduleName()] = it.getModuleProcessor()
}
DoKitConstant.loadDoKitModuleAbilities()
//解锁系统隐藏api限制权限以及hook Instrumentation
HandlerHooker.doHook(app)
......@@ -151,7 +147,7 @@ object DoKitReal {
//addSystemKitForTest(app)
//初始化悬浮窗管理类
DokitViewManager.getInstance().init(app)
DokitViewManager.instance.init(app)
//上传app基本信息便于统计
if (DoKitConstant.ENABLE_UPLOAD) {
try {
......@@ -426,7 +422,7 @@ object DoKitReal {
if (!DoKitConstant.AWAYS_SHOW_MAIN_ICON) {
return
}
DokitViewManager.getInstance().attachMainIcon()
DokitViewManager.instance.attachMainIcon()
DoKitConstant.MAIN_ICON_HAS_SHOW = true
}
......@@ -441,17 +437,17 @@ object DoKitReal {
* 直接显示工具面板页面
*/
fun showToolPanel() {
DokitViewManager.getInstance().attachToolPanel()
DokitViewManager.instance.attachToolPanel()
}
fun hideToolPanel() {
DokitViewManager.getInstance().detachToolPanel()
DokitViewManager.instance.detachToolPanel()
}
fun hide() {
DoKitConstant.MAIN_ICON_HAS_SHOW = false
DoKitConstant.AWAYS_SHOW_MAIN_ICON = false
DokitViewManager.getInstance().detachMainIcon()
DokitViewManager.instance.detachMainIcon()
}
/**
......
package com.didichuxing.doraemonkit.constant
import com.didichuxing.doraemonkit.util.NetworkUtils
import com.didichuxing.doraemonkit.util.PathUtils
import com.didichuxing.doraemonkit.BuildConfig
import com.didichuxing.doraemonkit.DoKitCallBack
import com.didichuxing.doraemonkit.config.GlobalConfig
......@@ -12,7 +10,11 @@ import com.didichuxing.doraemonkit.kit.network.room_db.DokitDbManager
import com.didichuxing.doraemonkit.kit.toolpanel.KitWrapItem
import com.didichuxing.doraemonkit.model.ActivityLifecycleInfo
import com.didichuxing.doraemonkit.util.LogHelper
import com.didichuxing.doraemonkit.util.NetworkUtils
import com.didichuxing.doraemonkit.util.PathUtils
import java.io.File
import java.util.*
import kotlin.collections.LinkedHashMap
/**
* ================================================
......@@ -24,6 +26,8 @@ import java.io.File
* ================================================
*/
object DoKitConstant {
const val MC_CASE_ID_KEY = "MC_CASE_ID"
const val MC_CASE_RECODING_KEY = "MC_CASE_RECODING"
const val TAG = "DoKitConstant"
const val GROUP_ID_PLATFORM = "dk_category_platform"
const val GROUP_ID_COMM = "dk_category_comms"
......@@ -36,7 +40,8 @@ object DoKitConstant {
/**
* DoKit 模块能力
*/
val DOKIT_MODULE_ABILITIES = mutableMapOf<DoKitModule, DokitAbility.DokitModuleProcessor>()
private val DOKIT_MODULE_ABILITIES =
mutableMapOf<DoKitModule, DokitAbility.DokitModuleProcessor>()
/**
......@@ -49,6 +54,21 @@ object DoKitConstant {
return DOKIT_MODULE_ABILITIES[module]
}
/**
* 加载跨模块通信能力
*/
fun loadDoKitModuleAbilities() {
val doKitAbilities =
ServiceLoader.load(DokitAbility::class.java, javaClass.classLoader).toList()
doKitAbilities.forEach {
it.init()
DOKIT_MODULE_ABILITIES[it.moduleName()] = it.getModuleProcessor()
}
//添加录制中的悬浮窗
LogHelper.i(TAG, "====loadDoKitModuleAbilities===")
}
val SYSTEM_KITS_BAK_PATH: String by lazy {
"${PathUtils.getInternalAppFilesPath()}${File.separator}system_kit_bak_${BuildConfig.DOKIT_VERSION}.json"
......@@ -160,6 +180,11 @@ object DoKitConstant {
//@JvmField
var WS_MODE: WSMode = WSMode.UNKNOW
/**
* 是否处于录制状态
*/
var IS_MC_RECODING = false
/**
* Wifi IP 地址
*/
......
......@@ -53,7 +53,7 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
var mTouchProxy = TouchProxy(this)
@JvmField
protected var mWindowManager = DokitViewManager.getInstance().windowManager
protected var mWindowManager = DokitViewManager.instance.windowManager
/**
* 创建FrameLayout#LayoutParams 内置悬浮窗调用
......@@ -98,7 +98,16 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
/**
* 上一次DoKitview的位置信息
*/
private lateinit var mLastDokitViewPosInfo: LastDokitViewPosInfo
private val mLastDokitViewPosInfo: LastDokitViewPosInfo by lazy {
if (DokitViewManager.instance.getLastDokitViewPosInfo(tag) == null) {
val posInfo = LastDokitViewPosInfo()
DokitViewManager.instance.saveLastDokitViewPosInfo(tag, posInfo)
posInfo
} else {
DokitViewManager.instance.getLastDokitViewPosInfo(tag)!!
}
}
/**
* 根布局的实际宽
......@@ -138,7 +147,7 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
//调用onCreate方法
onCreate(context)
if (!isNormalMode) {
DokitViewManager.getInstance().addDokitViewAttachedListener(this)
DokitViewManager.instance.addDokitViewAttachedListener(this)
}
mDoKitView = if (isNormalMode) {
DokitFrameLayout(context, DokitFrameLayout.DoKitFrameLayoutFlag_CHILD)
......@@ -270,7 +279,7 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
params.width = mDokitViewLayoutParams.width
params.height = mDokitViewLayoutParams.height
params.gravity = mDokitViewLayoutParams.gravity
val doKitViewInfo = DokitViewManager.getInstance().getDokitViewPos(tag)
val doKitViewInfo = DokitViewManager.instance.getDoKitViewPos(tag)
if (doKitViewInfo != null) {
//竖向
if (doKitViewInfo.orientation == Configuration.ORIENTATION_PORTRAIT) {
......@@ -291,7 +300,7 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
* 用于普通模式下的横竖屏切换
*/
private fun portraitOrLandscape(params: FrameLayout.LayoutParams) {
val doKitViewInfo = DokitViewManager.getInstance().getDokitViewPos(tag)
val doKitViewInfo = DokitViewManager.instance.getDoKitViewPos(tag)
if (doKitViewInfo != null) {
//横竖屏切换兼容
if (ScreenUtils.isPortrait()) {
......@@ -356,7 +365,7 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
}
}
DokitViewManager.getInstance().saveDokitViewPos(tag, params.leftMargin, params.topMargin)
DokitViewManager.instance.saveDokitViewPos(tag, params.leftMargin, params.topMargin)
}
@Deprecated("")
......@@ -368,8 +377,8 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
return
}
normalLayoutParams?.apply {
val (_, portraitPoint, landscapePoint) = DokitViewManager.getInstance()
.getDokitViewPos(tag) ?: return
val (_, portraitPoint, landscapePoint) = DokitViewManager.instance
.getDoKitViewPos(tag) ?: return
if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) {
if (landscapePoint == null) {
this.leftMargin = 0
......@@ -387,7 +396,7 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
this.topMargin = portraitPoint.x
}
}
DokitViewManager.getInstance()
DokitViewManager.instance
.saveDokitViewPos(tag, this.leftMargin, this.topMargin)
mDoKitView?.layoutParams = this
}
......@@ -407,7 +416,7 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
params.gravity = mDokitViewLayoutParams.gravity
params.width = mDokitViewLayoutParams.width
params.height = mDokitViewLayoutParams.height
val doKitViewInfo = DokitViewManager.getInstance().getDokitViewPos(
val doKitViewInfo = DokitViewManager.instance.getDoKitViewPos(
tag
)
if (doKitViewInfo != null) {
......@@ -422,14 +431,14 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
params.x = mDokitViewLayoutParams.x
params.y = mDokitViewLayoutParams.y
}
DokitViewManager.getInstance().saveDokitViewPos(tag, params.x, params.y)
DokitViewManager.instance.saveDokitViewPos(tag, params.x, params.y)
}
override fun onDestroy() {
if (!isNormalMode) {
DokitViewManager.getInstance().removeDokitViewAttachedListener(this)
DokitViewManager.instance.removeDokitViewAttachedListener(this)
}
DokitViewManager.getInstance().removeLastDokitViewPosInfo(tag)
DokitViewManager.instance.removeLastDokitViewPosInfo(tag)
mAttachActivity = null
doKitViewScope.cancel()
}
......@@ -530,11 +539,11 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
//保存在内存中
if (isNormalMode) {
normalLayoutParams?.let {
DokitViewManager.getInstance().saveDokitViewPos(tag, it.leftMargin, it.topMargin)
DokitViewManager.instance.saveDokitViewPos(tag, it.leftMargin, it.topMargin)
}
} else {
systemLayoutParams?.let {
DokitViewManager.getInstance().saveDokitViewPos(tag, it.x, it.y)
DokitViewManager.instance.saveDokitViewPos(tag, it.x, it.y)
}
}
}
......@@ -591,7 +600,7 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
*
* @param dokitView
*/
override fun onDokitViewAdd(dokitView: AbsDokitView) {}
override fun onDokitViewAdd(dokitView: AbsDokitView?) {}
override fun onResume() {}
override fun onPause() {}
......@@ -635,7 +644,7 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
* 将当前dokitView于activity解绑
*/
fun detach() {
DokitViewManager.getInstance().detach(this)
DokitViewManager.instance.detach(this)
}
/**
......@@ -666,7 +675,7 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
this.leftMargin = FloatIconConfig.getLastPosX()
this.topMargin = FloatIconConfig.getLastPosY()
} else {
val doKitViewInfo = DokitViewManager.getInstance().getDokitViewPos(tag)
val doKitViewInfo = DokitViewManager.instance.getDoKitViewPos(tag)
if (doKitViewInfo != null) {
if (doKitViewInfo.orientation == Configuration.ORIENTATION_PORTRAIT) {
this.leftMargin = doKitViewInfo.portraitPoint.x
......@@ -882,11 +891,6 @@ abstract class AbsDokitView : DokitView, TouchProxy.OnTouchEventListener,
* 构造函数
*/
init {
if (DokitViewManager.getInstance().getLastDokitViewPosInfo(tag) == null) {
mLastDokitViewPosInfo = LastDokitViewPosInfo()
DokitViewManager.getInstance().saveLastDokitViewPosInfo(tag, mLastDokitViewPosInfo)
} else {
mLastDokitViewPosInfo = DokitViewManager.getInstance().getLastDokitViewPosInfo(tag)
}
}
}
\ No newline at end of file
package com.didichuxing.doraemonkit.kit.core;
package com.didichuxing.doraemonkit.kit.core
import android.app.Activity;
import com.didichuxing.doraemonkit.constant.DoKitConstant;
import com.didichuxing.doraemonkit.constant.DoKitModule;
import com.didichuxing.doraemonkit.constant.WSMode;
import com.didichuxing.doraemonkit.kit.health.CountDownDokitView;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity
import com.didichuxing.doraemonkit.constant.DoKitConstant
import com.didichuxing.doraemonkit.constant.DoKitConstant.WS_MODE
import com.didichuxing.doraemonkit.constant.WSMode
import com.didichuxing.doraemonkit.kit.health.CountDownDokitView
/**
* ================================================
......@@ -19,23 +15,22 @@ import java.util.Map;
* 修订历史:
* ================================================
*/
public abstract class AbsDokitViewManager implements DokitViewManagerInterface {
protected String TAG = this.getClass().getSimpleName();
abstract class AbsDokitViewManager : DokitViewManagerInterface {
protected var TAG = this.javaClass.simpleName
/**
* 添加倒计时DokitView
*/
void attachCountDownDokitView(Activity activity) {
fun attachCountDownDokitView(activity: Activity) {
if (!DoKitConstant.APP_HEALTH_RUNNING) {
return;
return
}
if (activity instanceof UniversalActivity) {
return;
if (activity is UniversalActivity) {
return
}
DokitIntent dokitIntent = new DokitIntent(CountDownDokitView.class);
dokitIntent.mode = DokitIntent.MODE_ONCE;
attach(dokitIntent);
val dokitIntent = DokitIntent(CountDownDokitView::class.java)
dokitIntent.mode = DokitIntent.MODE_ONCE
attach(dokitIntent)
}
/**
......@@ -43,25 +38,9 @@ public abstract class AbsDokitViewManager implements DokitViewManagerInterface {
*
* @param activity
*/
void attachMcDokitView(Activity activity) {
if (DoKitConstant.INSTANCE.getWS_MODE() == WSMode.UNKNOW) {
return;
fun attachMcDokitView(activity: Activity) {
if (WS_MODE === WSMode.UNKNOW) {
return
}
// DokitAbility.DokitModuleProcessor processor = DoKitConstant.INSTANCE.getModuleProcessor(DoKitModule.MODULE_MC);
// if (processor == null) {
// return;
// }
//
// if (DoKitConstant.INSTANCE.getWS_MODE() == WSMode.HOST) {
// Map<String, String> action = new HashMap();
// action.put("action", "launch_host_view");
// processor.proceed(action);
// } else if (DoKitConstant.INSTANCE.getWS_MODE() == WSMode.CLIENT) {
// Map<String, String> action = new HashMap();
// action.put("action", "launch_client_view");
// processor.proceed(action);
// }
}
}
}
\ No newline at end of file
......@@ -63,7 +63,7 @@ abstract class BaseFragment : Fragment() {
} catch (e: Exception) {
e.printStackTrace()
}
DokitViewManager.getInstance().detach(MainIconDokitView::class.java)
DokitViewManager.instance.detach(MainIconDokitView::class.java)
}
......
......@@ -13,6 +13,7 @@ import com.didichuxing.doraemonkit.constant.DoKitModule
*/
interface DokitAbility {
fun init()
/**
......@@ -29,6 +30,8 @@ interface DokitAbility {
interface DokitModuleProcessor {
val TAG: String
get() = this.javaClass.simpleName
fun values(): Map<String, Any>
......
package com.didichuxing.doraemonkit.kit.core;
package com.didichuxing.doraemonkit.kit.core
import android.app.Activity;
import java.util.Map;
import android.app.Activity
/**
* ================================================
......@@ -13,50 +11,48 @@ import java.util.Map;
* 修订历史:
* ================================================
*/
public interface DokitViewManagerInterface {
interface DokitViewManagerInterface {
/**
* 在当前Activity中添加指定悬浮窗
*
* @param dokitIntent
*/
void attach(DokitIntent dokitIntent);
fun attach(dokitIntent: DokitIntent)
/**
* 移除每个activity指定的dokitView
*
* @param dokitView
*/
void detach(AbsDokitView dokitView);
fun detach(dokitView: AbsDokitView)
/**
* 移除每个activity指定的dokitView
* @param activity
* @param dokitView
*/
void detach(Activity activity,AbsDokitView dokitView);
fun detach(activity: Activity, dokitView: AbsDokitView)
/**
* 移除每个activity指定的dokitView tag
*
* @param tag 一般为dokitView的className
*/
void detach(String tag);
fun detach(tag: String)
/**
* 移除每个activity指定的dokitView
* @param activity
* @param tag
*/
void detach(Activity activity,String tag);
fun detach(activity: Activity, tag: String)
/**
* 移除指定的dokitView
*
* @param dokitViewClass
*/
void detach(Class<? extends AbsDokitView> dokitViewClass);
fun detach(dokitViewClass: Class<out AbsDokitView>)
/**
* 移除指定activity的dokitview
......@@ -64,13 +60,12 @@ public interface DokitViewManagerInterface {
* @param activity
* @param dokitViewClass
*/
void detach(Activity activity, Class<? extends AbsDokitView> dokitViewClass);
fun detach(activity: Activity, dokitViewClass: Class<out AbsDokitView>)
/**
* 移除所有activity的所有dokitView
*/
void detachAll();
fun detachAll()
/**
* 获取页面上指定的dokitView
......@@ -79,8 +74,7 @@ public interface DokitViewManagerInterface {
* @param tag
* @return
*/
AbsDokitView getDokitView(Activity activity, String tag);
fun getDokitView(activity: Activity, tag: String): AbsDokitView?
/**
* 获取页面上所有的dokitView
......@@ -88,26 +82,24 @@ public interface DokitViewManagerInterface {
* @param activity
* @return
*/
Map<String, AbsDokitView> getDokitViews(Activity activity);
fun getDokitViews(activity: Activity): Map<String, AbsDokitView>?
/**
* 当app进入后台时调用
*/
void notifyBackground();
fun notifyBackground()
/**
* 当app进入前台时调用
*/
void notifyForeground();
fun notifyForeground()
/**
* Activity销毁时调用
*
* @param activity
*/
void onActivityDestroy(Activity activity);
fun onActivityDestroy(activity: Activity)
/**
* 只有普通的浮标才需要调用
......@@ -115,33 +107,33 @@ public interface DokitViewManagerInterface {
*
* @param activity
*/
void resumeAndAttachDokitViews(Activity activity);
fun resumeAndAttachDokitViews(activity: Activity)
/**
* main activity 创建时回调
*
* @param activity
*/
void onMainActivityCreate(Activity activity);
fun onMainActivityCreate(activity: Activity)
/**
* 除main activity 以外 其他activty 创建时回调
*
* @param activity
*/
void onActivityCreate(Activity activity);
fun onActivityCreate(activity: Activity)
/**
* 页面回退的时候调用
*
* @param activity
*/
void onActivityResume(Activity activity);
fun onActivityResume(activity: Activity)
/**
* 页面onPause时调用
*
* @param activity
*/
void onActivityPause(Activity activity);
}
fun onActivityPause(activity: Activity)
}
\ No newline at end of file
......@@ -26,14 +26,14 @@ object SimpleDokitStarter {
val doKitIntent = DokitIntent(targetClass)
doKitIntent.mode = mode
doKitIntent.bundle = bundle
DokitViewManager.getInstance().attach(doKitIntent)
DokitViewManager.instance.attach(doKitIntent)
}
@JvmStatic
fun removeFloating(
targetClass: Class<out AbsDokitView?>
) {
DokitViewManager.getInstance().detach(targetClass)
DokitViewManager.instance.detach(targetClass)
}
......
package com.didichuxing.doraemonkit.kit.core;
import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
import android.view.WindowManager;
import com.didichuxing.doraemonkit.DoKit;
import com.didichuxing.doraemonkit.constant.DoKitConstant;
import com.didichuxing.doraemonkit.constant.DoKitModule;
import com.didichuxing.doraemonkit.constant.WSMode;
import com.didichuxing.doraemonkit.kit.health.CountDownDokitView;
import com.didichuxing.doraemonkit.kit.main.MainIconDokitView;
import com.didichuxing.doraemonkit.model.ActivityLifecycleInfo;
import com.didichuxing.doraemonkit.util.DoKitSystemUtil;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
package com.didichuxing.doraemonkit.kit.core
import android.app.Activity
import android.content.Context
import android.text.TextUtils
import com.didichuxing.doraemonkit.DoKit
import com.didichuxing.doraemonkit.DoKit.Companion.isMainIconShow
import com.didichuxing.doraemonkit.DoKit.Companion.show
import com.didichuxing.doraemonkit.constant.DoKitConstant
import com.didichuxing.doraemonkit.constant.DoKitConstant.getModuleProcessor
import com.didichuxing.doraemonkit.constant.DoKitModule
import com.didichuxing.doraemonkit.kit.health.CountDownDokitView
import com.didichuxing.doraemonkit.kit.main.MainIconDokitView
import com.didichuxing.doraemonkit.model.ActivityLifecycleInfo
import com.didichuxing.doraemonkit.util.DoKitSystemUtil
import com.didichuxing.doraemonkit.util.SPUtils
import java.util.*
/**
* Created by wanglikun on 2018/10/23.
* 系统悬浮窗管理类
*/
class SystemDokitViewManager extends AbsDokitViewManager {
internal class SystemDokitViewManager : AbsDokitViewManager() {
/**
* 参考:
* https://blog.csdn.net/awenyini/article/details/78265284
* https://yuqirong.me/2017/09/28/Window%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90(%E4%B8%80)%EF%BC%9A%E4%B8%8EDecorView%E7%9A%84%E9%82%A3%E4%BA%9B%E4%BA%8B/
*/
private WindowManager mWindowManager = DokitViewManager.getInstance().getWindowManager();
private Context mContext;
private List<AbsDokitView> mDokitViews = new ArrayList<>();
private List<DokitViewManager.DokitViewAttachedListener> mListeners = new ArrayList<>();
private val mWindowManager = DokitViewManager.instance.windowManager
private val mContext: Context by lazy { DoKit.APPLICATION }
private val mDokitViews: MutableList<AbsDokitView> by lazy { mutableListOf() }
private val mListeners: MutableList<DokitViewManager.DokitViewAttachedListener> by lazy { mutableListOf() }
/**
* 获取页面上所有的dokitViews
*
* @return map
*/
@Override
public Map<String, AbsDokitView> getDokitViews(Activity activity) {
if (mDokitViews == null) {
return new HashMap<>();
}
Map<String, AbsDokitView> dokitViewMaps = new HashMap<>();
for (AbsDokitView dokitView : mDokitViews) {
dokitViewMaps.put(dokitView.getTag(), dokitView);
override fun getDokitViews(activity: Activity): Map<String, AbsDokitView> {
val dokitViewMaps: MutableMap<String, AbsDokitView> = mutableMapOf()
for (dokitView in mDokitViews) {
dokitViewMaps[dokitView.tag] = dokitView
}
return dokitViewMaps;
return dokitViewMaps
}
/**
* 当app进入后台时调用
*/
@Override
public void notifyBackground() {
if (mDokitViews == null) {
return;
}
for (AbsDokitView dokitView : mDokitViews) {
dokitView.onEnterBackground();
override fun notifyBackground() {
for (dokitView in mDokitViews) {
dokitView.onEnterBackground()
}
}
/**
* 当app进入前台时调用
*/
@Override
public void notifyForeground() {
if (mDokitViews == null) {
return;
}
for (AbsDokitView page : mDokitViews) {
page.onEnterForeground();
}
}
override fun notifyForeground() {
public SystemDokitViewManager(Context context) {
this.mContext = context.getApplicationContext();
//获取WindowService
for (page in mDokitViews) {
page.onEnterForeground()
}
}
/**
* @param activity
*/
@Override
public void resumeAndAttachDokitViews(Activity activity) {
if (activity instanceof UniversalActivity) {
AbsDokitView countDownDokitView = getDokitView(activity, CountDownDokitView.class.getSimpleName());
override fun resumeAndAttachDokitViews(activity: Activity) {
if (activity is UniversalActivity) {
val countDownDokitView =
getDokitView(activity, CountDownDokitView::class.java.simpleName)
if (countDownDokitView != null) {
DokitViewManager.getInstance().detach(CountDownDokitView.class.getSimpleName());
DokitViewManager.instance.detach(
CountDownDokitView::class.java.simpleName
)
}
return;
return
}
//app启动
if (DoKitSystemUtil.isOnlyFirstLaunchActivity(activity)) {
onMainActivityCreate(activity);
onMainActivityCreate(activity)
}
ActivityLifecycleInfo activityLifecycleInfo = DoKitConstant.ACTIVITY_LIFECYCLE_INFOS.get(activity.getClass().getCanonicalName());
val activityLifecycleInfo =
DoKitConstant.ACTIVITY_LIFECYCLE_INFOS[activity.javaClass.canonicalName]
//新建Activity
if (activityLifecycleInfo != null && activityLifecycleInfo.getActivityLifeCycleCount() == ActivityLifecycleInfo.ACTIVITY_LIFECYCLE_CREATE2RESUME) {
onActivityCreate(activity);
if (activityLifecycleInfo != null && activityLifecycleInfo.activityLifeCycleCount == ActivityLifecycleInfo.ACTIVITY_LIFECYCLE_CREATE2RESUME) {
onActivityCreate(activity)
}
//activity resume
if (activityLifecycleInfo != null && activityLifecycleInfo.getActivityLifeCycleCount() > ActivityLifecycleInfo.ACTIVITY_LIFECYCLE_CREATE2RESUME) {
onActivityResume(activity);
if (activityLifecycleInfo != null && activityLifecycleInfo.activityLifeCycleCount > ActivityLifecycleInfo.ACTIVITY_LIFECYCLE_CREATE2RESUME) {
onActivityResume(activity)
}
//生命周期回调
Map<String, AbsDokitView> dokitViewMap = getDokitViews(activity);
for (AbsDokitView absDokitView : dokitViewMap.values()) {
absDokitView.onResume();
val dokitViewMap = getDokitViews(activity)
for (absDokitView in dokitViewMap.values) {
absDokitView!!.onResume()
}
}
@Override
public void onMainActivityCreate(Activity activity) {
override fun onMainActivityCreate(activity: Activity) {
//倒计时DokitView
attachCountDownDokitView(activity);
attachMcDokitView(activity);
attachCountDownDokitView(activity)
attachMcDokitView(activity)
if (!DoKitConstant.AWAYS_SHOW_MAIN_ICON) {
return;
return
}
//添加main icon
DokitIntent intent = new DokitIntent(MainIconDokitView.class);
intent.mode = DokitIntent.MODE_SINGLE_INSTANCE;
DokitViewManager.getInstance().attach(intent);
DoKitConstant.MAIN_ICON_HAS_SHOW = true;
val intent = DokitIntent(
MainIconDokitView::class.java
)
intent.mode = DokitIntent.MODE_SINGLE_INSTANCE
DokitViewManager.instance.attach(intent)
DoKitConstant.MAIN_ICON_HAS_SHOW = true
//添加录制中的悬浮窗
if (SPUtils.getInstance().getBoolean(DoKitConstant.MC_CASE_RECODING_KEY, false)) {
val action: MutableMap<String, String> = HashMap()
action["action"] = "launch_recoding_view"
getModuleProcessor(DoKitModule.MODULE_MC)!!.proceed(action)
}
}
@Override
public void onActivityCreate(Activity activity) {
override fun onActivityCreate(activity: Activity) {
//判断是否有MainIcon
if (DoKitConstant.AWAYS_SHOW_MAIN_ICON && !DoKit.isMainIconShow()) {
DoKit.show();
if (DoKitConstant.AWAYS_SHOW_MAIN_ICON && !isMainIconShow) {
show()
}
//如果倒计时浮标没显示则重新添加
AbsDokitView countDownDokitView = getDokitView(activity, CountDownDokitView.class.getSimpleName());
val countDownDokitView = getDokitView(activity, CountDownDokitView::class.java.simpleName)
if (countDownDokitView == null) {
if (activity instanceof UniversalActivity) {
return;
if (activity is UniversalActivity) {
return
}
attachCountDownDokitView(activity);
attachCountDownDokitView(activity)
} else {
if (activity instanceof UniversalActivity) {
DokitViewManager.getInstance().detach(CountDownDokitView.class.getSimpleName());
if (activity is UniversalActivity) {
DokitViewManager.instance.detach(
CountDownDokitView::class.java.simpleName
)
} else {
//重置倒计时
((CountDownDokitView) countDownDokitView).resetTime();
(countDownDokitView as CountDownDokitView).resetTime()
}
}
attachMcDokitView(activity);
attachMcDokitView(activity)
}
@Override
public void onActivityResume(Activity activity) {
override fun onActivityResume(activity: Activity) {
//移除倒计时浮标
AbsDokitView countDownDokitView = getDokitView(activity, CountDownDokitView.class.getSimpleName());
val countDownDokitView = getDokitView(activity, CountDownDokitView::class.java.simpleName)
if (countDownDokitView == null) {
attachCountDownDokitView(activity);
attachCountDownDokitView(activity)
} else {
//重置倒计时
((CountDownDokitView) countDownDokitView).resetTime();
(countDownDokitView as CountDownDokitView).resetTime()
}
attachMcDokitView(activity);
attachMcDokitView(activity)
//判断是否存在主入口icon
Map<String, AbsDokitView> dokitViews = getDokitViews(activity);
if (dokitViews == null || dokitViews.get(MainIconDokitView.class.getSimpleName()) == null) {
if (DoKitConstant.AWAYS_SHOW_MAIN_ICON && !(activity instanceof UniversalActivity)) {
val dokitViews = getDokitViews(activity)
if (dokitViews[MainIconDokitView::class.java.simpleName] == null) {
if (DoKitConstant.AWAYS_SHOW_MAIN_ICON && activity !is UniversalActivity) {
//添加main icon
DokitIntent intent = new DokitIntent(MainIconDokitView.class);
intent.mode = DokitIntent.MODE_SINGLE_INSTANCE;
DokitViewManager.getInstance().attach(intent);
DoKitConstant.MAIN_ICON_HAS_SHOW = true;
val intent = DokitIntent(
MainIconDokitView::class.java
)
intent.mode = DokitIntent.MODE_SINGLE_INSTANCE
DokitViewManager.instance.attach(intent)
DoKitConstant.MAIN_ICON_HAS_SHOW = true
}
}
}
@Override
public void onActivityPause(Activity activity) {
Map<String, AbsDokitView> dokitViews = getDokitViews(activity);
for (AbsDokitView absDokitView : dokitViews.values()) {
absDokitView.onPause();
override fun onActivityPause(activity: Activity) {
val dokitViews = getDokitViews(activity)
for (absDokitView in dokitViews.values) {
absDokitView.onPause()
}
}
/**
* 添加悬浮窗
*
* @param pageIntent
*/
@Override
public void attach(DokitIntent pageIntent) {
override fun attach(pageIntent: DokitIntent) {
try {
if (mDokitViews == null) {
return;
}
if (pageIntent.targetClass == null) {
return;
return
}
if (pageIntent.mode == DokitIntent.MODE_SINGLE_INSTANCE) {
for (AbsDokitView dokitView : mDokitViews) {
for (dokitView in mDokitViews) {
//如果当前page对象已经存在 则直接返回
if (pageIntent.targetClass.isInstance(dokitView)) {
return;
return
}
}
}
//通过newInstance方式创建floatPage
AbsDokitView dokitView = pageIntent.targetClass.newInstance();
dokitView.setBundle(pageIntent.bundle);
val dokitView = pageIntent.targetClass.newInstance()
dokitView.bundle = pageIntent.bundle
//page.setTag(pageIntent.tag);
//添加进page列表
mDokitViews.add(dokitView);
dokitView.performCreate(mContext);
mDokitViews.add(dokitView)
dokitView.performCreate(mContext)
//在window上显示floatIcon
//WindowManagerImpl具体实现
mWindowManager.addView(dokitView.getDoKitView(),
dokitView.getSystemLayoutParams());
dokitView.onResume();
mWindowManager.addView(
dokitView.doKitView,
dokitView.systemLayoutParams
)
dokitView.onResume()
if (!DoKitConstant.IS_NORMAL_FLOAT_MODE) {
for (DokitViewManager.DokitViewAttachedListener listener : mListeners) {
listener.onDokitViewAdd(dokitView);
for (listener in mListeners) {
listener.onDokitViewAdd(dokitView)
}
}
} catch (Exception e) {
e.printStackTrace();
} catch (e: Exception) {
e.printStackTrace()
}
}
@Override
public void detach(String tag) {
if (TextUtils.isEmpty(tag) || mWindowManager == null || mDokitViews == null) {
return;
override fun detach(tag: String) {
if (TextUtils.isEmpty(tag)) {
return
}
for (Iterator<AbsDokitView> it = mDokitViews.iterator(); it.hasNext(); ) {
AbsDokitView dokitView = it.next();
if (tag.equals(dokitView.getTag())) {
mWindowManager.removeView(dokitView.getDoKitView());
dokitView.performDestroy();
it.remove();
return;
val it = mDokitViews.iterator()
while (it.hasNext()) {
val dokitView = it.next()
if (tag == dokitView.tag) {
mWindowManager.removeView(dokitView.doKitView)
dokitView.performDestroy()
it.remove()
return
}
}
}
@Override
public void detach(Activity activity, String tag) {
override fun detach(activity: Activity, tag: String) {}
override fun detach(dokitView: AbsDokitView) {
detach(dokitView!!.javaClass.simpleName)
}
@Override
public void detach(AbsDokitView dokitView) {
detach(dokitView.getClass().getSimpleName());
override fun detach(activity: Activity, dokitView: AbsDokitView) {}
override fun detach(dokitViewClass: Class<out AbsDokitView>) {
detach(dokitViewClass.simpleName)
}
@Override
public void detach(Activity activity, AbsDokitView dokitView) {
override fun detach(activity: Activity, dokitViewClass: Class<out AbsDokitView>) {}
override fun detachAll() {
}
@Override
public void detach(Class<? extends AbsDokitView> dokitViewClass) {
detach(dokitViewClass.getSimpleName());
}
@Override
public void detach(Activity activity, Class<? extends AbsDokitView> dokitViewClass) {
}
@Override
public void detachAll() {
if (mDokitViews == null) {
return;
}
for (Iterator<AbsDokitView> it = mDokitViews.iterator(); it.hasNext(); ) {
AbsDokitView dokitView = it.next();
mWindowManager.removeView(dokitView.getDoKitView());
dokitView.performDestroy();
it.remove();
val it = mDokitViews.iterator()
while (it.hasNext()) {
val dokitView = it.next()
mWindowManager.removeView(dokitView.doKitView)
dokitView.performDestroy()
it.remove()
}
}
@Override
public AbsDokitView getDokitView(Activity activity, String tag) {
if (mDokitViews == null) {
return null;
}
override fun getDokitView(activity: Activity, tag: String): AbsDokitView? {
if (TextUtils.isEmpty(tag)) {
return null;
return null
}
for (AbsDokitView dokitView : mDokitViews) {
if (tag.equals(dokitView.getTag())) {
return dokitView;
for (dokitView in mDokitViews) {
if (tag == dokitView.tag) {
return dokitView
}
}
return null;
return null
}
/**
* Activity销毁时调用 不需要实现 为了统一api
*/
@Override
public void onActivityDestroy(Activity activity) {
}
override fun onActivityDestroy(activity: Activity) {}
/**
* 在每一个float page创建时 添加监听器
*
* @param listener
*/
void addListener(DokitViewManager.DokitViewAttachedListener listener) {
mListeners.add(listener);
fun addListener(listener: DokitViewManager.DokitViewAttachedListener) {
mListeners.add(listener)
}
void removeListener(DokitViewManager.DokitViewAttachedListener listener) {
mListeners.remove(listener);
fun removeListener(listener: DokitViewManager.DokitViewAttachedListener) {
mListeners.remove(listener)
}
}
}
\ No newline at end of file
......@@ -224,7 +224,7 @@ class DokitJSI {
* 更新本地localStorage的adapter
*/
private fun updateStorageAdapter(type: Int) {
val h5DokitView = DokitViewManager.getInstance().getDokitView(
val h5DokitView = DokitViewManager.instance.getDokitView(
ActivityUtils.getTopActivity(),
H5DokitView::class.java.simpleName
)
......
......@@ -46,7 +46,7 @@ class DokitWebViewClient(webViewClient: WebViewClient?, userAgent: String) : Web
view?.let { it ->
if (it.context is Activity) {
val activity = it.context as Activity
val absDokitView: AbsDokitView? = DokitViewManager.getInstance()
val absDokitView: AbsDokitView? = DokitViewManager.instance
.getDokitView(activity, H5DokitView::class.java.simpleName)
absDokitView?.let { h5DokitView ->
(h5DokitView as H5DokitView).updateUrl(url)
......
......@@ -46,7 +46,7 @@ class DokitX5WebViewClient(webViewClient: WebViewClient?, userAgent: String) : W
view?.let { it ->
if (it.context is Activity) {
val activity = it.context as Activity
val absDokitView: AbsDokitView? = DokitViewManager.getInstance()
val absDokitView: AbsDokitView? = DokitViewManager.instance
.getDokitView(activity, H5DokitView::class.java.simpleName)
absDokitView?.let { h5DokitView ->
(h5DokitView as H5DokitView).updateUrl(url)
......
......@@ -72,7 +72,7 @@ class H5DokitView : AbsDokitView() {
rootView?.let {
val close = it.findViewById<ImageView>(R.id.iv_close)
close.setOnClickListener {
DokitViewManager.getInstance().detach(this)
DokitViewManager.instance.detach(this)
}
mTvLink = it.findViewById(R.id.tv_link)
mJsCheckBox = it.findViewById(R.id.js_switch)
......
......@@ -37,9 +37,9 @@ class CountDownDokitView : AbsDokitView() {
.onCompletion {
withContext(Dispatchers.Main) {
if (isNormalMode) {
DokitViewManager.getInstance().detach(activity, this@CountDownDokitView)
DokitViewManager.instance.detach(activity, this@CountDownDokitView)
} else {
DokitViewManager.getInstance().detach(this@CountDownDokitView)
DokitViewManager.instance.detach(this@CountDownDokitView)
}
}
}
......
......@@ -59,7 +59,7 @@ class AMapRealNavMockView : AbsDokitView() {
val tvProgress = it.findViewById<TextView>(R.id.tv_progress)
tvProgress.text = "当前导航进度: 0%"
close.setOnClickListener {
DokitViewManager.getInstance().detach(this)
DokitViewManager.instance.detach(this)
}
......
......@@ -100,7 +100,7 @@ class ToolPanelAdapter(kitViews: MutableList<KitWrapItem>?) :
KitWrapItem.TYPE_EXIT -> {
holder.getView<TextView>(R.id.close).setOnClickListener {
DokitViewManager.getInstance().detachToolPanel()
DokitViewManager.instance.detachToolPanel()
DoKit.hide()
}
......
......@@ -122,7 +122,7 @@ class ToolPanelDokitView : AbsDokitView() {
//常规模式下点击常用工具不隐藏工具面板
it.onClick(ActivityUtils.getTopActivity())
if (it.onClickWithReturn(ActivityUtils.getTopActivity())) {
DokitViewManager.getInstance().detachToolPanel()
DokitViewManager.instance.detachToolPanel()
}
//添加埋点
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册