[6.2.6]录包上报Reason改版

This commit is contained in:
xuxinchao
2023-12-21 20:11:45 +08:00
parent 3882fb7b5d
commit 5c6dd0133c
7 changed files with 257 additions and 274 deletions

View File

@@ -3,6 +3,7 @@ package com.zhjt.mogo_core_function_devatools.badcase.biz
import android.annotation.SuppressLint
import android.app.Activity
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.PixelFormat
import android.os.Bundle
import android.os.Environment
@@ -13,10 +14,10 @@ import android.util.Log
import android.view.*
import android.view.animation.Animation
import android.view.animation.ScaleAnimation
import android.widget.CheckBox
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.flexbox.FlexboxLayout
import com.iflytek.cloud.ErrorCode
import com.iflytek.cloud.InitListener
import com.iflytek.cloud.RecognizerListener
@@ -47,6 +48,7 @@ import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
import com.mogo.eagle.core.utilcode.util.AppUtils
import com.mogo.eagle.core.utilcode.util.BarUtils
import com.mogo.eagle.core.utilcode.util.JsonParser
import com.mogo.eagle.core.utilcode.util.SizeUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String
@@ -58,7 +60,6 @@ import com.zhidao.loglib.upload.UploadManager
import com.zhidao.loglib.util.FileUtil
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseAnalyticsManager
import com.zhjt.mogo_core_function_devatools.badcase.biz.adapter.BadReasonListAdapter
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.mogo_core_function_devatools.badcase.record.RecordManager
import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.BadCaseNetManager
@@ -66,6 +67,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.repository.store.BadCaseRea
import com.zhjt.mogo_core_function_devatools.badcase.util.RecordBitmapUtils
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import me.jessyan.autosize.utils.AutoSizeUtils
import org.json.JSONArray
import org.json.JSONException
import org.json.JSONObject
@@ -105,8 +107,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
private lateinit var tvInitiativeReport: TextView
private lateinit var tvInitiativeCancel: TextView
private lateinit var rvInitiativeList: RecyclerView
private var badReasonListAdapter: BadReasonListAdapter ?= null
private lateinit var flReasonLayout: FlexboxLayout
private var audioStatus = false
private var audioFileName:String?=null //录音文件名称
@@ -174,25 +175,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
tvInitiativeReport = mFloatLayout.findViewById(R.id.tvInitiativeReport)
tvInitiativeCancel = mFloatLayout.findViewById(R.id.tvInitiativeCancel)
rvInitiativeList = mFloatLayout.findViewById(R.id.rvInitiativeList)
val linearLayoutManager = LinearLayoutManager(mActivity)
linearLayoutManager.orientation = LinearLayoutManager.VERTICAL
rvInitiativeList.layoutManager = linearLayoutManager
badReasonListAdapter = BadReasonListAdapter(mActivity)
badReasonListAdapter?.setListener(object: BadReasonListAdapter.ReasonClickListener{
override fun onClick(reason: String, isChecked: Boolean) {
if(isChecked){
if(!uploadList.contains(reason)){
uploadList.add(reason)
}
}else{
if(uploadList.contains(reason)){
uploadList.remove(reason)
}
}
}
})
rvInitiativeList.adapter = badReasonListAdapter
flReasonLayout = mFloatLayout.findViewById(R.id.flReasonLayout)
if(BadCaseConfig.windowNum<1){
BadCaseConfig.windowNum = 1
}
@@ -201,6 +185,14 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
tvInitiativeTime.text = "时间:${millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat())}"
tvInitiativeIdentity.text = "身份:${BadCaseConfig.identity}"
//展示缓存数据
if(BadCaseReasonStore.getInitiativeDataRecord().isNotEmpty()){
val parseList = parseData()
if(parseList.isNotEmpty()){
isLoadData = true
setData(parseList)
}
}
/**
* 获取录包原因数据
*/
@@ -611,50 +603,52 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
override fun onInitiativeResponse(list: List<RecordOptionEntity>) {
if(!isLoadData && list.isNotEmpty()){
badReasonListAdapter?.setData(list)
setData(list)
isLoadData = true
}
}
override fun onInitiativeError() {
if(!isLoadData && BadCaseReasonStore.getInitiativeDataRecord().isNotEmpty()){
val list = ArrayList<RecordOptionEntity>()
val result = JSONArray(BadCaseReasonStore.getInitiativeDataRecord())
if(result.length() > 0){
for(i in 0 until result.length()){
val entity = RecordOptionEntity()
val jsonObject = result[i] as JSONObject
val optionName = jsonObject.optString("optionName")
entity.optionName = optionName
val optionCode = jsonObject.optString("optionCode")
entity.optionCode = optionCode
val children = jsonObject.optJSONArray("children")
if (children != null) {
if(children.length() > 0){
for(index in 0 until children.length()){
val childJson = children[index] as JSONObject
val child = RecordOptionEntity()
val childOptionNme = childJson.optString("optionName")
val childOptionCode = childJson.optString("optionCode")
child.optionName = childOptionNme
child.optionCode = childOptionCode
entity.children.add(child)
}
}
}
list.add(entity)
}
}
if(list.isNotEmpty()){
isLoadData = true
badReasonListAdapter?.setData(list)
}
}else{
if(BadCaseReasonStore.getInitiativeDataRecord().isEmpty()){
ToastUtils.showShort("主动录包数据采集错误且无缓存数据可用")
}
}
/**
* 解析JSON数据
*/
private fun parseData(): ArrayList<RecordOptionEntity>{
val list = ArrayList<RecordOptionEntity>()
val result = JSONArray(BadCaseReasonStore.getInitiativeDataRecord())
if(result.length() > 0){
for(i in 0 until result.length()){
val entity = RecordOptionEntity()
val jsonObject = result[i] as JSONObject
val optionName = jsonObject.optString("optionName")
entity.optionName = optionName
val optionCode = jsonObject.optString("optionCode")
entity.optionCode = optionCode
val children = jsonObject.optJSONArray("children")
if (children != null) {
if(children.length() > 0){
for(index in 0 until children.length()){
val childJson = children[index] as JSONObject
val child = RecordOptionEntity()
val childOptionNme = childJson.optString("optionName")
val childOptionCode = childJson.optString("optionCode")
child.optionName = childOptionNme
child.optionCode = childOptionCode
entity.children.add(child)
}
}
}
list.add(entity)
}
}
return list
}
override fun onUploadCosSuccess(cosUrl: String) {
if(isUploadCos){
//上传到服务器
@@ -662,6 +656,50 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
}
}
private fun setData(list: List<RecordOptionEntity>){
val defineList = ArrayList<String>()
//将列表中的所有二级列表取出然后添加到最终需要展示的列表中defineList
list.forEach { oneLevel ->
if(oneLevel.children.isNotEmpty()){
oneLevel.children.forEach { twoLevel->
if(twoLevel.optionName.isNotBlank()){
defineList.add(twoLevel.optionName)
}
}
}
}
//绘制原因列表
if(defineList.isNotEmpty()){
defineList.forEach {
val checkBox = CheckBox(mActivity)
checkBox.setTextColor(Color.WHITE)
val lp = FlexboxLayout.LayoutParams(
FlexboxLayout.LayoutParams.WRAP_CONTENT,
FlexboxLayout.LayoutParams.WRAP_CONTENT)
checkBox.buttonDrawable = mActivity.resources.getDrawable(R.drawable.badcase_radio_button_style)
checkBox.setPadding(
SizeUtils.dp2px(18f),
SizeUtils.dp2px(7f),
SizeUtils.dp2px(18f),
SizeUtils.dp2px(7f))
checkBox.textSize = AutoSizeUtils.dp2px(mActivity,15f).toFloat()
checkBox.text = it
checkBox.setOnCheckedChangeListener{ _, isChecked ->
if(isChecked){
if(!uploadList.contains(it)){
uploadList.add(it)
}
}else{
if(uploadList.contains(it)){
uploadList.remove(it)
}
}
}
flReasonLayout.addView(checkBox,lp)
}
}
}
/**
* 高精地图截图回调
*/

View File

@@ -3,6 +3,7 @@ package com.zhjt.mogo_core_function_devatools.badcase.biz
import android.annotation.SuppressLint
import android.app.Activity
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.PixelFormat
import android.os.Bundle
import android.os.Environment
@@ -12,10 +13,10 @@ import android.util.Log
import android.view.*
import android.view.animation.Animation
import android.view.animation.ScaleAnimation
import android.widget.CheckBox
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.flexbox.FlexboxLayout
import com.iflytek.cloud.ErrorCode
import com.iflytek.cloud.InitListener
import com.iflytek.cloud.RecognizerListener
@@ -55,10 +56,10 @@ import kotlinx.coroutines.launch
import com.zhidao.loglib.upload.UploadManager
import com.zhidao.loglib.util.FileUtil
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseAnalyticsManager
import com.zhjt.mogo_core_function_devatools.badcase.biz.adapter.BadReasonListAdapter
import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.BadCaseNetManager
import com.zhjt.mogo_core_function_devatools.badcase.repository.store.BadCaseReasonStore
import com.zhjt.mogo_core_function_devatools.badcase.util.RecordBitmapUtils
import me.jessyan.autosize.utils.AutoSizeUtils
import org.greenrobot.eventbus.EventBus
import org.json.JSONArray
import org.json.JSONException
@@ -98,8 +99,6 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
private var hasOperated: Boolean = false //是否有页面操作
private lateinit var rvPassiveList : RecyclerView
private var badReasonListAdapter: BadReasonListAdapter?= null
private var screenSavePath: String ?= null //截图保存路径
private var mInViewX = 0f
@@ -123,6 +122,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
private lateinit var tvPassiveReport: TextView
private lateinit var tvPassiveCancel: TextView
private lateinit var flReasonLayout: FlexboxLayout
// 语音听写对象
private var mIat: SpeechRecognizer? = null
@@ -163,26 +164,16 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
viewAudioStart = mFloatLayout.findViewById(R.id.viewAudioStart)
tvPassiveReport = mFloatLayout.findViewById(R.id.tvPassiveReport)
tvPassiveCancel = mFloatLayout.findViewById(R.id.tvPassiveCancel)
rvPassiveList = mFloatLayout.findViewById(R.id.rvPassiveList)
val linearLayoutManager = LinearLayoutManager(mActivity)
linearLayoutManager.orientation = LinearLayoutManager.VERTICAL
rvPassiveList.layoutManager = linearLayoutManager
badReasonListAdapter = BadReasonListAdapter(mActivity)
badReasonListAdapter?.setListener(object: BadReasonListAdapter.ReasonClickListener{
override fun onClick(reason: String, isChecked: Boolean) {
hasOperated = true
if(isChecked){
if(!uploadList.contains(reason)){
uploadList.add(reason)
}
}else{
if(uploadList.contains(reason)){
uploadList.remove(reason)
}
}
flReasonLayout = mFloatLayout.findViewById(R.id.flReasonLayout)
//展示缓存数据
if(BadCaseReasonStore.getPassiveDataRecord().isNotEmpty()){
val parseList = parseData()
if(parseList.isNotEmpty()){
isLoadData = true
setData(parseList)
}
})
rvPassiveList.adapter = badReasonListAdapter
}
/**
* 获取录包原因数据
@@ -235,7 +226,9 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
uploadAudio()
}
//删除记录
CallerMsgBoxManager.removeRecordInfo(mActivity, boxBean!!, recordKey!!)
boxBean?.let {
CallerMsgBoxManager.removeRecordInfo(mActivity,it, recordKey!!)
}
EventBus.getDefault().post(boxBean)
}
@@ -244,7 +237,9 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
BadCaseConfig.windowNum--
clickListener?.closeWindow()
//删除记录
CallerMsgBoxManager.removeRecordInfo(mActivity, boxBean!!, recordKey!!)
boxBean?.let {
CallerMsgBoxManager.removeRecordInfo(mActivity, it, recordKey!!)
}
EventBus.getDefault().post(boxBean)
}
@@ -578,45 +573,13 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
override fun onPassiveResponse(list: List<RecordOptionEntity>) {
if(!isLoadData && list.isNotEmpty()){
badReasonListAdapter?.setData(list)
setData(list)
isLoadData = true
}
}
override fun onPassiveError() {
if(!isLoadData && BadCaseReasonStore.getPassiveDataRecord().isNotEmpty()){
val list = ArrayList<RecordOptionEntity>()
val result = JSONArray(BadCaseReasonStore.getPassiveDataRecord())
if(result.length() > 0){
for(i in 0 until result.length()){
val entity = RecordOptionEntity()
val jsonObject = result[i] as JSONObject
val optionName = jsonObject.optString("optionName")
entity.optionName = optionName
val optionCode = jsonObject.optString("optionCode")
entity.optionCode = optionCode
val children = jsonObject.optJSONArray("children")
if (children != null) {
if(children.length() > 0){
for(index in 0 until children.length()){
val childJson = children[index] as JSONObject
val child = RecordOptionEntity()
val childOptionNme = childJson.optString("optionName")
val childOptionCode = childJson.optString("optionCode")
child.optionName = childOptionNme
child.optionCode = childOptionCode
entity.children.add(child)
}
}
}
list.add(entity)
}
}
if(list.isNotEmpty()){
isLoadData = true
badReasonListAdapter?.setData(list)
}
}else{
if(BadCaseReasonStore.getPassiveDataRecord().isEmpty()){
ToastUtils.showShort("被动录包数据采集错误且无缓存数据可用")
}
}
@@ -671,4 +634,82 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
RecordBitmapUtils.deleteExpiredFile(currentDay)
}
/**
* 解析JSON数据
*/
private fun parseData(): ArrayList<RecordOptionEntity>{
val list = ArrayList<RecordOptionEntity>()
val result = JSONArray(BadCaseReasonStore.getPassiveDataRecord())
if(result.length() > 0){
for(i in 0 until result.length()){
val entity = RecordOptionEntity()
val jsonObject = result[i] as JSONObject
val optionName = jsonObject.optString("optionName")
entity.optionName = optionName
val optionCode = jsonObject.optString("optionCode")
entity.optionCode = optionCode
val children = jsonObject.optJSONArray("children")
if (children != null) {
if(children.length() > 0){
for(index in 0 until children.length()){
val childJson = children[index] as JSONObject
val child = RecordOptionEntity()
val childOptionNme = childJson.optString("optionName")
val childOptionCode = childJson.optString("optionCode")
child.optionName = childOptionNme
child.optionCode = childOptionCode
entity.children.add(child)
}
}
}
list.add(entity)
}
}
return list
}
private fun setData(list: List<RecordOptionEntity>){
val defineList = ArrayList<String>()
//将列表中的所有二级列表取出然后添加到最终需要展示的列表中defineList
list.forEach { oneLevel ->
if(oneLevel.children.isNotEmpty()){
oneLevel.children.forEach { twoLevel->
if(twoLevel.optionName.isNotBlank()){
defineList.add(twoLevel.optionName)
}
}
}
}
//绘制原因列表
if(defineList.isNotEmpty()){
defineList.forEach {
val checkBox = CheckBox(mActivity)
checkBox.setTextColor(Color.WHITE)
val lp = FlexboxLayout.LayoutParams(
FlexboxLayout.LayoutParams.WRAP_CONTENT,
FlexboxLayout.LayoutParams.WRAP_CONTENT)
checkBox.buttonDrawable = mActivity.resources.getDrawable(R.drawable.badcase_radio_button_style)
checkBox.setPadding(
SizeUtils.dp2px(18f),
SizeUtils.dp2px(7f),
SizeUtils.dp2px(18f),
SizeUtils.dp2px(7f))
checkBox.textSize = AutoSizeUtils.dp2px(mActivity,15f).toFloat()
checkBox.text = it
checkBox.setOnCheckedChangeListener{ _, isChecked ->
if(isChecked){
if(!uploadList.contains(it)){
uploadList.add(it)
}
}else{
if(uploadList.contains(it)){
uploadList.remove(it)
}
}
}
flReasonLayout.addView(checkBox,lp)
}
}
}
}

View File

@@ -1,84 +0,0 @@
package com.zhjt.mogo_core_function_devatools.badcase.biz.adapter
import android.app.Activity
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.google.android.flexbox.FlexboxLayout
import com.mogo.eagle.core.data.deva.badcase.RecordOptionEntity
import com.mogo.eagle.core.utilcode.util.SizeUtils
import com.zhjt.mogo_core_function_devatools.R
import me.jessyan.autosize.utils.AutoSizeUtils
/**
* 主动录包和被动录包采集原因列表适配器
*/
class BadReasonListAdapter(activity: Activity): RecyclerView.Adapter<BadReasonListAdapter.BadReasonHolder>() {
init {
activity.also { this.mActivity = it }
}
private var data:List<RecordOptionEntity> ?= null
private var clickListener: ReasonClickListener ?= null
private var mActivity: Activity
fun setData(data: List<RecordOptionEntity>){
this.data = data
notifyDataSetChanged()
}
fun setListener(listener: ReasonClickListener){
clickListener = listener
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BadReasonHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_case_reason, parent, false)
return BadReasonHolder(view)
}
override fun onBindViewHolder(holder: BadReasonHolder, position: Int) {
data?.let {
val entity = it[position]
holder.tvReasonTitle.text = entity.optionName
if(entity.children.size>0){
entity.children.forEach { child->
val checkBox = CheckBox(mActivity)
checkBox.setTextColor(Color.WHITE)
val lp = FlexboxLayout.LayoutParams(FlexboxLayout.LayoutParams.WRAP_CONTENT,
FlexboxLayout.LayoutParams.WRAP_CONTENT)
checkBox.buttonDrawable = mActivity.resources.getDrawable(R.drawable.badcase_radio_button_style)
checkBox.setPadding(
SizeUtils.dp2px(15f),
SizeUtils.dp2px(5f),
SizeUtils.dp2px(15f),
SizeUtils.dp2px(5f))
checkBox.textSize = AutoSizeUtils.dp2px(mActivity,15f).toFloat()
checkBox.text = child.optionName
checkBox.setOnCheckedChangeListener{ _, isChecked ->
clickListener?.onClick(checkBox.text.toString(),isChecked)
}
holder.flReasonLayout.addView(checkBox,lp)
}
}
}
}
override fun getItemCount() = data?.size ?: 0
class BadReasonHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
var tvReasonTitle: TextView = itemView.findViewById(R.id.tvReasonTitle)
var flReasonLayout: FlexboxLayout = itemView.findViewById(R.id.flReasonLayout)
}
interface ReasonClickListener{
fun onClick(reason: String,isChecked: Boolean)
}
}

View File

@@ -79,18 +79,31 @@ class BadCaseNetManager {
}
list.add(entity)
}
}
//将结果回调到调用页面
if(optionType == 1){
//主动录包
CallerDevaToolsNetManager.invokeInitiativeResponse(list)
//缓存数据
BadCaseReasonStore.setInitiativeDataRecord(it)
} else if(optionType == 2){
//被动录包
CallerDevaToolsNetManager.invokePassiveResponse(list)
//缓存数据
BadCaseReasonStore.setPassiveDataRecord(it)
//将结果回调到调用页面
if(optionType == 1){
if( it != BadCaseReasonStore.getInitiativeDataRecord()){
//如果请求数据和缓存数据不一致则更新数据和UI
//主动录包
CallerDevaToolsNetManager.invokeInitiativeResponse(list)
//缓存数据
BadCaseReasonStore.setInitiativeDataRecord(it)
}
} else if(optionType == 2){
if(it != BadCaseReasonStore.getPassiveDataRecord()){
//被动录包
CallerDevaToolsNetManager.invokePassiveResponse(list)
//缓存数据
BadCaseReasonStore.setPassiveDataRecord(it)
}
}
}else{
if(optionType == 1){
//主动录包
CallerDevaToolsNetManager.invokeInitiativeError()
}else if(optionType == 2){
//被动录包
CallerDevaToolsNetManager.invokePassiveError()
}
}
},
onError =

View File

@@ -1,51 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<View
android:id="@+id/tvReasonTitleDivider"
android:layout_width="@dimen/dp_6"
android:layout_height="@dimen/dp_29"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintRight_toLeftOf="@id/tvReasonTitle"
android:background="#0176FF"
android:layout_margin="@dimen/dp_15"
/>
<TextView
android:id="@+id/tvReasonTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/sp_32"
android:textColor="@color/white"
app:layout_constraintTop_toTopOf="@id/tvReasonTitleDivider"
app:layout_constraintBottom_toBottomOf="@id/tvReasonTitleDivider"
app:layout_constraintStart_toEndOf="@id/tvReasonTitleDivider"
android:layout_marginStart="@dimen/dp_15"
/>
<com.google.android.flexbox.FlexboxLayout
android:id="@+id/flReasonLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:alignContent="flex_start"
app:alignItems="center"
app:flexDirection="row"
app:flexWrap="wrap"
app:justifyContent="flex_start"
app:layout_constraintTop_toBottomOf="@id/tvReasonTitleDivider"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="@dimen/dp_25"
android:layout_marginStart="@dimen/dp_15"
android:layout_marginEnd="@dimen/dp_15"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -50,8 +50,7 @@
android:layout_marginEnd="@dimen/dp_50"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvInitiativeList"
<ScrollView
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
app:layout_constraintLeft_toLeftOf="parent"
@@ -60,8 +59,22 @@
app:layout_constraintBottom_toTopOf="@id/viewAudioBg"
android:scrollbars="vertical"
android:fadeScrollbars="false"
android:layout_margin="@dimen/dp_20"
/>
android:layout_margin="@dimen/dp_20">
<com.google.android.flexbox.FlexboxLayout
android:id="@+id/flReasonLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:alignContent="flex_start"
app:alignItems="center"
app:flexDirection="row"
app:flexWrap="wrap"
app:justifyContent="flex_start"
android:layout_margin="@dimen/dp_20"
/>
</ScrollView>
<TextView
android:id="@+id/tvInitiativeReport"

View File

@@ -50,18 +50,31 @@
android:layout_marginEnd="@dimen/dp_50"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvPassiveList"
<ScrollView
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvPassiveNum"
app:layout_constraintTop_toBottomOf="@id/tvInitiativeNum"
app:layout_constraintBottom_toTopOf="@id/viewAudioBg"
android:scrollbars="vertical"
android:fadeScrollbars="false"
android:layout_margin="@dimen/dp_20"
/>
android:layout_margin="@dimen/dp_20">
<com.google.android.flexbox.FlexboxLayout
android:id="@+id/flReasonLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:alignContent="flex_start"
app:alignItems="center"
app:flexDirection="row"
app:flexWrap="wrap"
app:justifyContent="flex_start"
android:layout_margin="@dimen/dp_20"
/>
</ScrollView>
<TextView
android:id="@+id/tvPassiveReport"