[2.13.0-arch-opt] move binding car to deva tools

This commit is contained in:
zhongchao
2023-01-12 10:11:23 +08:00
parent 8ceced4bcf
commit d8728fe8c9
57 changed files with 522 additions and 1240 deletions

View File

@@ -58,7 +58,6 @@ import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager
import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
@@ -1467,14 +1466,14 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
if (toBindingCarDialog == null) {
toBindingCarDialog = ToBindingCarDialog(requireContext())
}
toBindingCarDialog!!.showToBindingcarDialog()
toBindingCarDialog!!.showToBindingCarDialog()
}
override fun showModifyBindingcarDialog() {
if (modifyBindingCarDialog == null) {
modifyBindingCarDialog = ModifyBindingCarDialog(requireContext())
}
modifyBindingCarDialog!!.showModifyBindingcarDialog()
modifyBindingCarDialog!!.showModifyBindingCarDialog()
}
/**
@@ -1513,8 +1512,7 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
adUpgradeDialog?.setClickListener(object : AdUpgradeDialog.ClickListener {
override fun confirm() {
//确认升级
CallerBindingcarManager.getBindingcarProvider()
.upgradeConfirm(images, padSn, releaseId)
CallerDevaToolsManager.upgradeConfirm(images, padSn, releaseId)
AdUpgradeStateHelper.setConfirmUpgrade(true)
ToastUtils.showLong("最新版本下载中...")
adUpgradeDialog?.dismiss()

View File

@@ -6,7 +6,7 @@ import androidx.lifecycle.LifecycleObserver
import com.mogo.commons.module.status.IMogoStatusChangedListener
import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.commons.module.status.StatusDescriptor
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
@@ -18,7 +18,10 @@ import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
*/
class ModifyBindingCarDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver {
private val TAG = "BindingCarDialog"
companion object{
private const val TAG = "BindingCarDialog"
}
private var confirmTv: TextView? = null
private var cancelTv: TextView? = null
@@ -37,7 +40,7 @@ class ModifyBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifec
cancelTv = findViewById(R.id.tv_bindingcar_cancel)
confirmTv?.setOnClickListener {
modifyBindingcar()
modifyBindingCar()
}
cancelTv?.setOnClickListener {
@@ -54,8 +57,8 @@ class ModifyBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifec
/**
* 修改绑定车机
*/
fun modifyBindingcar() {
CallerBindingcarManager.getBindingcarProvider().modifyCarInfo {
private fun modifyBindingCar() {
CallerDevaToolsManager.modifyCarInfo{
if (it.code == 200) {
TipToast.shortTip("修改绑定成功")
} else {
@@ -74,11 +77,10 @@ class ModifyBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifec
)
}
fun showModifyBindingcarDialog() {
fun showModifyBindingCarDialog() {
if (isShowing) {
return
}
show()
}

View File

@@ -6,7 +6,7 @@ import androidx.lifecycle.LifecycleObserver
import com.mogo.commons.module.status.IMogoStatusChangedListener
import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.commons.module.status.StatusDescriptor
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
@@ -18,7 +18,10 @@ import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
*/
class ToBindingCarDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver{
private val TAG = "ToBindingCarDialog"
companion object{
private const val TAG = "ToBindingCarDialog"
}
private var confirmTv: TextView? = null
private var cancelTv: TextView? = null
@@ -36,7 +39,7 @@ class ToBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifecycle
cancelTv = findViewById(R.id.tv_to_bindingcar_cancel)
confirmTv?.setOnClickListener {
toBindingcar()
toBindingCar()
}
cancelTv?.setOnClickListener {
@@ -53,8 +56,8 @@ class ToBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifecycle
/**
* 修改绑定车机
*/
fun toBindingcar() {
CallerBindingcarManager.getBindingcarProvider().modifyCarInfo {
private fun toBindingCar() {
CallerDevaToolsManager.modifyCarInfo{
if (it.code == 200) {
TipToast.shortTip("绑定成功")
} else {
@@ -73,11 +76,10 @@ class ToBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifecycle
)
}
fun showToBindingcarDialog() {
fun showToBindingCarDialog() {
if (isShowing) {
return
}
show()
}

View File

@@ -1,8 +0,0 @@
package com.mogo.eagle.core.function.hmi.ui.dispatch;
public interface IDispatchRemindClickListener {
void affirm();
void cancel(boolean manualTrigger);
}

View File

@@ -16,7 +16,6 @@ import androidx.appcompat.widget.PopupMenu
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.core.view.*
import androidx.recyclerview.widget.LinearLayoutManager
import chassis.Chassis
import chassis.ChassisStatesOuterClass
import com.mogo.cloud.passport.MoGoAiCloudClient
@@ -41,7 +40,6 @@ import com.mogo.eagle.core.data.gnss.AccelerationEntity
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.data.obu.ObuStatusInfo
import com.mogo.eagle.core.data.report.ReportEntity
import com.mogo.eagle.core.data.upgrade.UpgradeVersionEntity
import com.mogo.eagle.core.function.api.autopilot.*
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
@@ -64,7 +62,6 @@ import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.logcatch.ILogViewListener
import com.mogo.eagle.core.function.hmi.ui.logcatch.LogInfoView
import com.mogo.eagle.core.function.hmi.ui.upgrade.UpgradeListAdapter
import com.mogo.eagle.core.function.hmi.ui.widget.DemoModeView
import com.mogo.eagle.core.utilcode.kotlin.currentPadding
import com.mogo.eagle.core.utilcode.kotlin.onClick
@@ -151,12 +148,6 @@ class DebugSettingView @JvmOverloads constructor(
private var onlineSelected: Boolean = true
private var qaSelected: Boolean = true
private var upgradeListAdapter: UpgradeListAdapter? = null
private val upgradeVersionList by lazy {
ArrayList<UpgradeVersionEntity>()
}
private val mapUiController by lazy {
CallerMapUIServiceManager.getMapUIController()
}
@@ -484,21 +475,6 @@ class DebugSettingView @JvmOverloads constructor(
}
}
/**
* 应用包管理中心
*/
btnApkCenter.setOnCheckedChangeListener { buttonView, isChecked ->
if (isChecked) {
buttonView.setCompoundDrawables(null, null, iconDown, null)
//展示应用包管理中心
apkCenterLayout.visibility = View.VISIBLE
} else {
buttonView.setCompoundDrawables(null, null, iconRight, null)
//隐藏应用包管理中心
apkCenterLayout.visibility = View.GONE
}
}
lastVisualAngleMode = mapUiController?.currentMapVisualAngle
/**
@@ -572,8 +548,6 @@ class DebugSettingView @JvmOverloads constructor(
setHmiCheckedChangeListener()
//日志中心事件点击监听
setLogCheckedChangeListener()
//APK包管理中心配置
setApkCenterListener()
//OBU配置信息
tvObuInfo.text = CallerObuListenerManager.getObuStatusInfoJsonString()
@@ -1553,77 +1527,6 @@ class DebugSettingView @JvmOverloads constructor(
}
}
/**
* APK包管理
*/
private fun setApkCenterListener() {
val layoutManager: LinearLayoutManager = object : LinearLayoutManager(
context,
VERTICAL, false
) {
override fun canScrollVertically(): Boolean {
// 直接禁止垂直滑动
return false
}
}
rvUpgradeVersionList.layoutManager = layoutManager
upgradeListAdapter = UpgradeListAdapter(context, upgradeVersionList,
object : UpgradeListAdapter.ClickListener {
override fun downloadApk(name: String, url: String) {
//下载包
CallerDevaToolsManager.downLoadPackage(name, url)
ToastUtils.showLong("开始下载APK,稍后可前往downloads文件夹查看")
}
})
rvUpgradeVersionList.adapter = upgradeListAdapter
ivApkSearch.setOnClickListener {
val searchStr = etApkSearch.text.toString()
if (searchStr.isEmpty()) {
ToastUtils.showShort("请输入正确的搜索关键字")
} else {
CallerDevaToolsManager.getUpgradeVersionUrls(searchStr)
}
}
//Online
cbApkOnline.setOnCheckedChangeListener { _, isChecked ->
onlineSelected = isChecked
upgradeListAdapter?.setDada(dataFilter(upgradeVersionList))
upgradeListAdapter?.notifyDataSetChanged()
}
//QA
cbApkQa.setOnCheckedChangeListener { _, isChecked ->
qaSelected = isChecked
upgradeListAdapter?.setDada(dataFilter(upgradeVersionList))
upgradeListAdapter?.notifyDataSetChanged()
}
}
/**
* 数据包数据过滤器
*/
private fun dataFilter(list: ArrayList<UpgradeVersionEntity>): ArrayList<UpgradeVersionEntity> {
val tempList = ArrayList<UpgradeVersionEntity>()
list.let {
it.iterator().forEach { entity ->
if (onlineSelected && entity.name.contains("online")) {
tempList.add(entity)
}
if (qaSelected && entity.name.contains("qa")) {
tempList.add(entity)
}
}
}
return tempList
}
private fun logViewDestroy() {
logInfoView?.let {
it.dismiss()
@@ -2249,23 +2152,4 @@ class DebugSettingView @JvmOverloads constructor(
setLogCheckedChangeListener()
}
override fun upgradeVersionUrls(urls: Map<String, String>?) {
//版本信息更新
urls?.let {
upgradeVersionList.clear()
it.iterator().forEach { map ->
val name =
if (map.key.contains("{")) map.key.replace("{", "") else map.key
val url = if (map.value.contains("}")) map.value.replace(
"}",
""
) else map.value
upgradeVersionList.add(UpgradeVersionEntity(name.trim(), url))
}
upgradeVersionList.sortByDescending { upgradeVersionEntity -> upgradeVersionEntity.name }
upgradeListAdapter?.setDada(dataFilter(upgradeVersionList))
upgradeListAdapter?.notifyDataSetChanged()
}
}
}

View File

@@ -1,66 +0,0 @@
package com.mogo.eagle.core.function.hmi.ui.upgrade
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView.Adapter
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.mogo.eagle.core.data.upgrade.UpgradeVersionEntity
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.upgrade.UpgradeListAdapter.UpgradeListHolder
/**
* @author XuXinChao
* @description APK升级包列表适配器
* @since: 2022/3/25
*/
class UpgradeListAdapter: Adapter<UpgradeListHolder> {
private var context: Context? = null
private var data:List<UpgradeVersionEntity>? = null
private var clickListener: ClickListener? = null
constructor(
context: Context,
data: List<UpgradeVersionEntity>?,
clickListener: ClickListener? = null
) {
this.context = context
this.data = data
this.clickListener = clickListener
}
public fun setDada( data: List<UpgradeVersionEntity>?){
this.data = data
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UpgradeListHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_upgrade_version, parent, false)
return UpgradeListHolder(view)
}
override fun onBindViewHolder(holder: UpgradeListHolder, position: Int) {
data?.let {
val upgradeVersionEntity = it[position]
holder.tvUpgradeApkName.text=upgradeVersionEntity.name
holder.tvUpgradeApkName.setOnClickListener {
clickListener?.downloadApk(upgradeVersionEntity.name,upgradeVersionEntity.url)
}
}
}
override fun getItemCount() = data?.size ?: 0
class UpgradeListHolder(itemView: View) : ViewHolder(itemView) {
var tvUpgradeApkName: TextView = itemView.findViewById(R.id.tvUpgradeApkName)
}
interface ClickListener{
fun downloadApk(name:String,url:String)
}
}

View File

@@ -9,10 +9,10 @@ import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper
import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.bindingcar.IMoGoBindingCarListener
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingCarListenerManager
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
@@ -32,7 +32,8 @@ class SystemVersionView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener,IMoGoBindingCarListener {
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener,
IMoGoDevaToolsListener {
companion object {
const val TAG = "SystemVersionView"
@@ -61,8 +62,7 @@ class SystemVersionView @JvmOverloads constructor(
//鹰眼版本视图点击事件
ivPadVersion.setOnClickListener {
CallerLogger.i("$M_HMI$$TAG", "pad version view clicked")
CallerBindingcarManager.getBindingcarProvider().queryAppUpgrade()
CallerDevaToolsManager.queryAppUpgrade()
//弹框和下载回调
// showUpgradeDialog(
// "",
@@ -268,7 +268,7 @@ class SystemVersionView @JvmOverloads constructor(
return
}
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerBindingCarListenerManager.addListener(TAG,this)
CallerDevaToolsListenerManager.addListener(TAG,this)
needQueryContainers = true
}
@@ -278,7 +278,7 @@ class SystemVersionView @JvmOverloads constructor(
return
}
CallerAutoPilotStatusListenerManager.removeListener(TAG)
CallerBindingCarListenerManager.removeListener(TAG)
CallerDevaToolsListenerManager.removeListener(TAG)
needQueryContainers = false
}

View File

@@ -18,11 +18,9 @@ import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.module.MogoModule;
import com.mogo.commons.module.MogoModulePaths;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.data.constants.MoGoConfig;
import com.mogo.eagle.core.data.constants.MogoServicePaths;
import com.mogo.eagle.core.function.api.chat.biz.ChatConsts;
import com.mogo.eagle.core.function.api.devatools.IMogoDevaToolsUpgradeListener;
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager;
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsUpgradeListenerManager;
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
@@ -32,11 +30,8 @@ import com.mogo.eagle.core.function.overview.OverviewDb;
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
import com.mogo.eagle.core.utilcode.util.ProcessUtils;
import com.mogo.eagle.core.utilcode.util.SPUtils;
import com.mogo.map.MapApiPath;
import com.zhidao.support.obu.ami.AmiClientManager;
import com.zhjt.mogo_core_function_devatools.monitor.db.CpuInfo;
import com.zhjt.mogo_core_function_devatools.monitor.db.MemInfo;
import com.zhjt.mogo_core_function_devatools.monitor.db.MonitorDb;
@@ -62,7 +57,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
return;
}
start = System.currentTimeMillis();
connectAmiIp();
initOverviewDb();
// Crash 日志收集
initCrashConfig();
@@ -87,12 +81,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
}
private void queryAppUpgrade() {
UiThreadHandler.postDelayed(new Runnable() {
@Override
public void run() {
CallerBindingcarManager.getBindingcarProvider().queryAppUpgrade();
}
},9000);
}
@SuppressLint("SimpleDateFormat")
@@ -212,33 +201,20 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
OverviewDb.Companion.getDb(this);
}
/**
* 连接ami
*/
private void connectAmiIp() {
String ipAddress = SharedPrefsMgr.getInstance(AbsMogoApplication.getApp().getBaseContext()).getString(MoGoConfig.OBU_IP, "192.168.1.199");
AmiClientManager.getInstance().setObuIp(ipAddress);
}
private void initModules() {
CallerLogger.INSTANCE.d(M_HMI + TAG, "initModules");
//och模块
// MogoModulePaths.addModuleFunction(new MogoModule("/driver/api", "IMoGoFunctionProvider"));
// MogoModulePaths.addModuleFunction(new MogoModule("/passenger/api", "IMoGoFunctionProvider"));
// MogoModulePaths.addBaseModule(new MogoModule(MapApiPath.PATH, "CustomMapApiBuilder"));
// MogoModulePaths.addBaseModule(new MogoModule(V2XConst.PATH_V2X_UI, V2XConst.MODULE_NAME));
// OBU 模块
MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_V2X_OBU_MOGO, "IMoGoObuProvider"));
// 云公告发布
// BIZ
MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_FUNC_BIZ, "IMoGoNoticeProvider"));
// 车聊聊IM
MogoModulePaths.addModuleFunctionServer(new MogoModule(ChatConsts.CHAT_PROVIDER_PATH, ChatConsts.CHAT_MODULE_NAME));
// V2X 模块
MogoModulePaths.addBaseModule(new MogoModule(MogoServicePaths.PATH_V2X_MODULE, "V2XProvider"));
// 绑定车辆
MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_BINDING_CAR, "IMoGoBindingcarProvider"));
// 司机身份专属模块
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp">
<TextView
android:id="@+id/tvUpgradeApkName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="@color/color_FF2966EC"
android:padding="10dp"
/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#F0F0F0"
android:layout_marginTop="3dp"
android:layout_marginBottom="3dp"/>
</LinearLayout>

View File

@@ -2273,99 +2273,6 @@
android:textSize="@dimen/dp_24" />
</LinearLayout>
</LinearLayout>
<ToggleButton
android:id="@+id/btnApkCenter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_10"
android:background="@drawable/radio_button_normal_background_right"
android:drawableEnd="@drawable/icon_right"
android:padding="@dimen/dp_20"
android:textOff="应用包管理中心"
android:textOn="应用包管理中心"
android:textSize="@dimen/dp_24"
android:visibility="gone"
/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/apkCenterLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible">
<ImageView
android:id="@+id/ivApkSearch"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="10dp"
android:padding="10dp"
android:src="@drawable/icon_search"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/etApkSearch"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginEnd="@dimen/dp_20"
android:layout_marginBottom="@dimen/dp_10"
android:background="@drawable/debug_setting_edit_bg"
android:gravity="center"
android:hint="请输入搜索关键字如版本号等"
android:textColor="#1A1A1A"
android:textSize="@dimen/dp_24"
app:layout_constraintBottom_toBottomOf="@id/ivApkSearch"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/ivApkSearch"
app:layout_constraintTop_toTopOf="@id/ivApkSearch" />
<CheckBox
android:id="@+id/cbApkOnline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:padding="@dimen/dp_10"
android:text="Online"
android:textColor="#000"
android:textSize="@dimen/dp_24"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/cbApkQa"
app:layout_constraintTop_toBottomOf="@id/ivApkSearch" />
<CheckBox
android:id="@+id/cbApkQa"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:padding="@dimen/dp_10"
android:text="QA"
android:textColor="#000"
android:textSize="@dimen/dp_24"
app:layout_constraintLeft_toRightOf="@id/cbApkOnline"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/ivApkSearch" />
<View
android:id="@+id/apkSearchDivider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="@dimen/dp_10"
android:background="#F0F0F0"
app:layout_constraintTop_toBottomOf="@id/cbApkQa" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvUpgradeVersionList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false"
app:layout_constraintTop_toBottomOf="@id/apkSearchDivider" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>