Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	gradle.properties
#	libraries/tanlulib/src/main/java/com/zhidao/roadcondition/service/CosStatusController.kt
#	modules/mogo-module-share/src/main/java/com/mogo/module/share/manager/UploadHelper.kt
#	modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/view/SimpleCoverVideoPlayer.kt
This commit is contained in:
wangcongtao
2020-11-10 17:48:45 +08:00
83 changed files with 1903 additions and 403 deletions

View File

@@ -61,7 +61,7 @@ open class IMogoAuthorizeController {
})
}
private fun realInvokeAuthorizeContent(agreementType: Int, onStart: (() -> Unit), onSuccess: ((BaseResponse<AgreementData>) -> Unit), onError: ((String) -> Unit), needContent: Boolean = false) {
private fun realInvokeAuthorizeContent(agreementType: Int, onStart: (() -> Unit), onSuccess: ((BaseResponse<AgreementData?>) -> Unit), onError: ((String) -> Unit), needContent: Boolean = false) {
onStart.invoke()
try {
request<BaseResponse<AgreementData>> {

View File

@@ -8,7 +8,7 @@ import com.mogo.module.authorize.model.proxy.toAuthorizeType
import com.mogo.module.authorize.util.SharedPreferenceUtil.needAuthorization
import com.mogo.utils.logger.Logger
open abstract class MogoAuthorizeManagerImpl : IMogoAuthorizeInvoke {
abstract class MogoAuthorizeManagerImpl : IMogoAuthorizeInvoke {
companion object {
const val TAG = "AuthorizeManagerImpl"

View File

@@ -1,3 +1,5 @@
@file:Suppress("DEPRECATION")
package com.mogo.module.authorize.authprovider.biz
import android.content.Context
@@ -11,7 +13,6 @@ import com.mogo.map.marker.IMogoMarkerClickListener
import com.mogo.map.navi.IMogoNaviListener
import com.mogo.module.authorize.authprovider.invoke.AuthorizeConstant.Companion.PATH_AGREEMENT_MODULE_NAME
import com.mogo.module.authorize.authprovider.invoke.AuthorizeInvokerConstant.Companion.AUTHORIZE_TYPE_LAUNCHER_MAIN
import com.mogo.module.authorize.authprovider.launcher.MogoMainAuthorize
import com.mogo.module.authorize.authprovider.launcher.MogoMainAuthorize.Companion.mogoAuthShow
import com.mogo.module.authorize.util.SharedPreferenceUtil.hasGuide
import com.mogo.service.MogoServicePaths

View File

@@ -42,9 +42,9 @@ class AuthorizeController {
agreementContent: (id: Long, content: String, title: String, bottomContent: String, lastContent: String) -> Unit,
agreementError: () -> Unit) {
Logger.d(TAG, "requestContentSuccess userAgreement:$userAgreement")
if (userAgreement.agreementContent.isNotEmpty()) {
if (userAgreement.agreementContent!= null && userAgreement.agreementContent!!.isNotEmpty()) {
val id = userAgreement.tUserAgreementEntity.id
val content = userAgreement.agreementContent[0]
val content = userAgreement.agreementContent!![0]
val title = userAgreement.tUserAgreementEntity.title
val bottomContent = userAgreement.tUserAgreementEntity.agreementButtonFirst
val lastContent = userAgreement.tUserAgreementEntity.agreementButtonSecond

View File

@@ -10,6 +10,7 @@ import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.debug.DebugConfig
import com.mogo.module.authorize.R
import com.mogo.module.authorize.util.AnalyticsUtil
import com.mogo.module.authorize.util.HtmlUtil
import com.mogo.module.authorize.voice.IVoiceAuthorizeIntentListener
import com.mogo.module.authorize.voice.IVoiceCommandListener
import com.mogo.module.authorize.voice.VoiceUtil
@@ -22,14 +23,15 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.withContext
class AuthorizeDialog : BaseFloatDialog, View.OnClickListener, IVoiceCommandListener, IVoiceAuthorizeIntentListener {
class AuthorizeDialog(invokeTag: String, context: Context) : BaseFloatDialog(context),
View.OnClickListener, IVoiceCommandListener, IVoiceAuthorizeIntentListener {
companion object {
const val TAG = "AuthorizeDialog"
}
private var mContext: Context? = null
private var invokeTag: String? = null
private var mContext: Context? = context
private var invokeTag: String? = invokeTag
private var agreementId: Long = 0L
@@ -48,9 +50,7 @@ class AuthorizeDialog : BaseFloatDialog, View.OnClickListener, IVoiceCommandList
private var authorizeController: AuthorizeController? = null
constructor(invokeTag: String, context: Context) : super(context) {
mContext = context
this.invokeTag = invokeTag
init {
initView()
}
@@ -62,24 +62,24 @@ class AuthorizeDialog : BaseFloatDialog, View.OnClickListener, IVoiceCommandList
private fun setWrapContent() {
val mWindow = window
if(DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_BYD){
if (mWindow != null && CarSeries.getSeries() == CarSeries.CAR_SERIES_F80X) {
val lp = mWindow.attributes
lp.width = 1920
lp.height = 1080
mWindow.attributes = lp
}else{
val lp = mWindow.attributes
lp.width = 1024
lp.height = 600
mWindow.attributes = lp
}
}else{
if (mWindow != null) {
val lp = mWindow.attributes
mWindow?.let {
if (DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_BYD) {
if (CarSeries.getSeries() == CarSeries.CAR_SERIES_F80X) {
val lp = it.attributes
lp.width = 1920
lp.height = 1080
it.attributes = lp
} else {
val lp = it.attributes
lp.width = 1024
lp.height = 600
it.attributes = lp
}
} else {
val lp = it.attributes
lp.width = 1920
lp.height = 1000
mWindow.attributes = lp
it.attributes = lp
}
}
}
@@ -132,15 +132,15 @@ class AuthorizeDialog : BaseFloatDialog, View.OnClickListener, IVoiceCommandList
this.agreementId = agreementId
clLoadAuthorizeContainer?.visibility = View.GONE
clContainer?.visibility = View.VISIBLE
tvTitle?.text = Html.fromHtml(agreementTitle)
tvTitle?.text = HtmlUtil.getSpanned(agreementTitle)
GlobalScope.async(Dispatchers.IO) {
val spannable = Html.fromHtml(agreementContent)
val spannable = HtmlUtil.getSpanned(agreementContent)
withContext(Dispatchers.Main) {
tvContent?.text = spannable
}
}
tvButtonContent?.text = Html.fromHtml(agreementBottom)
tvLastContent?.text = Html.fromHtml(agreementLast)
tvButtonContent?.text = HtmlUtil.getSpanned(agreementBottom)
tvLastContent?.text = HtmlUtil.getSpanned(agreementLast)
}
private fun showAuthorizationError() {

View File

@@ -1,179 +0,0 @@
package com.mogo.module.authorize.layout
import android.text.Html
import android.view.LayoutInflater
import android.view.View
import android.widget.Button
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.commons.AbsMogoApplication
import com.mogo.module.authorize.R
import com.mogo.module.authorize.util.AnalyticsUtil
import com.mogo.module.authorize.util.AnalyticsUtil.INVOKE_TRACK_AUTHORIZE_CLICK
import com.mogo.module.authorize.util.AnalyticsUtil.INVOKE_TRACK_AUTHORIZE_SHOW
import com.mogo.module.authorize.voice.IVoiceAuthorizeIntentListener
import com.mogo.module.authorize.voice.IVoiceCommandListener
import com.mogo.module.authorize.voice.VoiceUtil
import com.mogo.utils.logger.Logger
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.withContext
class AuthorizeLayout(private val invokeTag: String) : View.OnClickListener, IVoiceCommandListener, IVoiceAuthorizeIntentListener {
companion object {
const val TAG = "AuthorizeLayout"
}
private var agreementId: Long = 0L
private var clTopParent: ConstraintLayout? = null
private var clErrorContainer: ConstraintLayout? = null
private var clLoadAuthorizeContainer: ConstraintLayout? = null
private var clContainer: ConstraintLayout? = null
private var clAuthorizeLoading: ConstraintLayout? = null
private var btnAgree: Button? = null
private var btnDisAgree: Button? = null
private var btnLoadingError: Button? = null
private var tvTitle: TextView? = null
private var tvContent: TextView? = null
private var tvButtonContent: TextView? = null
private var tvLastContent: TextView? = null
private lateinit var layoutInflater: View
private var authorizeController: AuthorizeController? = null
fun getLayoutView(): View {
layoutInflater = LayoutInflater.from(AbsMogoApplication.getApp().applicationContext).inflate(getLayoutId(), null)
initViews(layoutInflater)
return layoutInflater
}
fun getLayoutId(): Int {
return R.layout.module_authorize_fragment
}
fun initViews(mRootView: View) {
Logger.d(TAG, "initView ")
AnalyticsUtil.track(INVOKE_TRACK_AUTHORIZE_SHOW)
init(mRootView)
Logger.d(TAG, "invokeTag :$invokeTag")
authorizeController = AuthorizeController(invokeTag)
invokeAuthorizationContent()
VoiceUtil.registerAll(this, this)
}
private fun init(mRootView: View) {
clTopParent = mRootView.findViewById(R.id.clAuthorizeTopParent)
clErrorContainer = mRootView.findViewById(R.id.clLoadingErrorContainer)
clLoadAuthorizeContainer = mRootView.findViewById(R.id.clLoadingAuthorizeContainer)
clContainer = mRootView.findViewById(R.id.clAuthorizeContainer)
clAuthorizeLoading = mRootView.findViewById(R.id.clAuthorizeLoading)
btnAgree = mRootView.findViewById(R.id.btnAuthorizeAgree)
btnDisAgree = mRootView.findViewById(R.id.btnAuthorizeDisAgree)
btnLoadingError = mRootView.findViewById(R.id.btnAuthorizeLoadingError)
tvTitle = mRootView.findViewById(R.id.tvAuthorizeTitle)
tvContent = mRootView.findViewById(R.id.tvAuthorizeContent)
tvButtonContent = mRootView.findViewById(R.id.tvAuthorizeButtonContent)
tvLastContent = mRootView.findViewById(R.id.tvAuthorizeLastContent)
btnAgree?.setOnClickListener(this)
btnDisAgree?.setOnClickListener(this)
btnLoadingError?.setOnClickListener(this)
clTopParent?.setOnClickListener(this)
clContainer?.setOnClickListener(this)
clErrorContainer?.setOnClickListener(this)
clLoadAuthorizeContainer?.setOnClickListener(this)
clAuthorizeLoading?.setOnClickListener(this)
}
private fun readyToAuthorize() {
clErrorContainer?.visibility = View.GONE
clLoadAuthorizeContainer?.visibility = View.VISIBLE
}
private fun showAuthorizationAgreementContent(
agreementId: Long,
agreementContent: String,
agreementTitle: String,
agreementBottom: String,
agreementLast: String) {
VoiceUtil.speak(AbsMogoApplication.getApp().applicationContext.resources.getString(R.string.module_authorize_agreement_tip), AbsMogoApplication.getApp().applicationContext, this)
this.agreementId = agreementId
clLoadAuthorizeContainer?.visibility = View.GONE
clContainer?.visibility = View.VISIBLE
tvTitle?.text = Html.fromHtml(agreementTitle)
GlobalScope.async(Dispatchers.IO) {
val spannable = Html.fromHtml(agreementContent)
withContext(Dispatchers.Main) {
tvContent?.text = spannable
}
}
tvButtonContent?.text = Html.fromHtml(agreementBottom)
tvLastContent?.text = Html.fromHtml(agreementLast)
}
private fun showAuthorizationError() {
clLoadAuthorizeContainer?.visibility = View.GONE
clErrorContainer?.visibility = View.VISIBLE
}
private fun voiceAuthorizeError() {
VoiceUtil.speak(AbsMogoApplication.getApp().applicationContext.getString(R.string.module_authorize_failed), AbsMogoApplication.getApp().applicationContext, this)
Logger.d(TAG, "onDestroy")
VoiceUtil.unregisterAll(AbsMogoApplication.getApp().applicationContext, this)
}
override fun onClick(v: View) {
when (v.id) {
R.id.btnAuthorizeAgree -> {
AnalyticsUtil.track(INVOKE_TRACK_AUTHORIZE_CLICK, hashMapOf("operation_type" to 1, "operation_result" to 1))
agreeAuthorize()
}
R.id.btnAuthorizeDisAgree -> {
AnalyticsUtil.track(INVOKE_TRACK_AUTHORIZE_CLICK, hashMapOf("operation_type" to 1, "operation_result" to 2))
disAgreeAuthorize()
}
R.id.clLoadingErrorContainer, R.id.btnAuthorizeLoadingError -> {
invokeAuthorizationContent()
}
R.id.clAuthorizeTopParent-> {
Logger.i(TAG,"dismiss authorizeView")
authorizeController?.onDestroy()
}
}
}
override fun onVoiceCmdAgree() {
AnalyticsUtil.track(INVOKE_TRACK_AUTHORIZE_CLICK, hashMapOf("operation_type" to 2, "operation_result" to 1))
agreeAuthorize()
}
override fun onVoiceCmdDisAgree() {
AnalyticsUtil.track(INVOKE_TRACK_AUTHORIZE_CLICK, hashMapOf("operation_type" to 2, "operation_result" to 2))
disAgreeAuthorize()
}
private fun agreeAuthorize() {
authorizeController?.agreeAuthorize(invokeTag, agreementId) {
voiceAuthorizeError()
}
}
private fun disAgreeAuthorize() {
authorizeController?.disAgreeAuthorize(invokeTag, agreementId) {
voiceAuthorizeError()
}
}
private fun invokeAuthorizationContent() {
authorizeController?.invokeAuthorizationContent(invokeTag, {
readyToAuthorize()
}, { id: Long, content: String, title: String, bottomContent: String, lastContent: String ->
showAuthorizationAgreementContent(id, content, title, bottomContent, lastContent)
}, {
showAuthorizationError()
})
}
}

View File

@@ -21,7 +21,7 @@ data class AgreementStatus(val agreementStatus:Int)
data class AgreementData(val agreement: Agreement)
data class Agreement(var tUserAgreementEntity: TUserAgreementEntity, var agreementContent: List<String>)
data class Agreement(var tUserAgreementEntity: TUserAgreementEntity, var agreementContent: List<String>?)
data class TUserAgreementEntity(
val id: Long, //协议ID

View File

@@ -62,7 +62,7 @@ class Request<T> {
}
} catch (e: Exception) {
e.printStackTrace()
if (e == null) {
if (e.message == null) {
onError?.invoke(NULL_EXCEPTION)
return@launch
}

View File

@@ -4,6 +4,7 @@ import java.util.*
object DateUtil {
@Suppress("DEPRECATION")
fun parseDateToTime(tmpDate: String): Long {
val time = Date(tmpDate)
return time.time

View File

@@ -0,0 +1,20 @@
package com.mogo.module.authorize.util
import android.os.Build
import android.text.Html
import android.text.Spanned
class HtmlUtil {
companion object{
fun getSpanned(content: String): Spanned {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(content, Html.FROM_HTML_MODE_LEGACY)
} else {
@Suppress("DEPRECATION")
Html.fromHtml(content)
}
}
}
}

View File

@@ -1,53 +0,0 @@
package com.mogo.module.authorize.view
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.util.AttributeSet
import android.widget.TextView
class AutoSplitTextView : TextView {
private var textShowWidth: Float = 0f
private var paint: Paint? = null
constructor(context: Context?) : super(context, null)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
init()
}
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
init()
}
private fun init() {
paint = Paint()
}
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
textShowWidth = (this.measuredWidth - paddingLeft - paddingRight).toFloat()
var lineCount = 0
if (text.toString().isNullOrBlank()) return
val textCharArray = text.toString().toCharArray()
var drawWidth = 0f
var charWidth: Float
for (i in 0..textCharArray.size) {
charWidth = paint!!.measureText(textCharArray, i, 1)
if (textCharArray[i] == '\n') {
lineCount++
drawWidth = 0f
continue
}
if (textShowWidth - drawWidth < charWidth) {
lineCount++
drawWidth = 0f
}
canvas.drawText(textCharArray, i, 1, paddingLeft + drawWidth, (lineCount + 1) * textSize, paint)
drawWidth += charWidth
}
height = (lineCount + 1) * textSize as Int
}
}

View File

@@ -11,7 +11,7 @@ interface IVoiceAuthorizeIntentListener : IMogoIntentListener, IVoiceBusinessLis
override fun onIntentReceived(cmd: String?, intent: Intent?) {
Logger.i(IVoiceIntentTAG, "cmd -> $cmd")
if (intent != null && cmd != null) {
VoiceManager.handleOnIntentCmd(cmd, intent, this)
VoiceManager.handleOnIntentCmd(cmd,this)
}
}

View File

@@ -25,7 +25,7 @@ object VoiceManager {
}
}
fun handleOnIntentCmd(cmd: String, intent: Intent, listener: IVoiceAuthorizeIntentListener) {
fun handleOnIntentCmd(cmd: String, listener: IVoiceAuthorizeIntentListener) {
Logger.i(TAG, "handleOnIntentCmd: cmd -> $cmd")
when (cmd) {
VOICE_INTENT_AGREE -> {

View File

@@ -0,0 +1,38 @@
package com.mogo.module.common.entity;
import com.mogo.map.MogoLatLng;
import java.util.List;
public class RoadTrafficSegment {
//道路拥堵信息分级
private int status;
//分段道路拥堵经纬度点
private List<MogoLatLng> mogoLatLngList;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public List<MogoLatLng> getMogoLatLngList() {
return mogoLatLngList;
}
public void setMogoLatLngList(List<MogoLatLng> mogoLatLngList) {
this.mogoLatLngList = mogoLatLngList;
}
@Override
public String toString() {
return "RoadTrafficSegment{" +
"status=" + status +
", mogoLatLngList=" + mogoLatLngList +
'}';
}
}

View File

@@ -0,0 +1,113 @@
package com.mogo.module.common.entity;
import com.mogo.map.MogoLatLng;
import java.util.List;
/**
* 交通路况信息
*/
public class RoadTrafficStatus {
//角度
private int angle;
//行车信息描述
private String direction;
//道路名称
private String roadName;
//道路拥堵信息分级
private int status;
//道路拥堵长度
private int length;
//整条道路拥堵经纬度点
private List<MogoLatLng> mogoLatLngList;
//是否存在道路分段数据
private boolean segment;
//分段道路数据
private List<RoadTrafficSegment> roadTrafficSegmentList;
public int getAngle() {
return angle;
}
public void setAngle(int angle) {
this.angle = angle;
}
public String getDirection() {
return direction;
}
public void setDirection(String direction) {
this.direction = direction;
}
public String getRoadName() {
return roadName;
}
public void setRoadName(String roadName) {
this.roadName = roadName;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public List<MogoLatLng> getMogoLatLngList() {
return mogoLatLngList;
}
public void setMogoLatLngList(List<MogoLatLng> mogoLatLngList) {
this.mogoLatLngList = mogoLatLngList;
}
public boolean isSegment() {
return segment;
}
public void setSegment(boolean segment) {
this.segment = segment;
}
public List<RoadTrafficSegment> getRoadTrafficSegmentList() {
return roadTrafficSegmentList;
}
public void setRoadTrafficSegmentList(List<RoadTrafficSegment> roadTrafficSegmentList) {
this.roadTrafficSegmentList = roadTrafficSegmentList;
}
@Override
public String toString() {
return "RoadTrafficStatus{" +
"angle=" + angle +
", direction='" + direction + '\'' +
", roadName='" + roadName + '\'' +
", status=" + status +
", length=" + length +
", mogoLatLngList=" + mogoLatLngList +
", segment=" + segment +
", roadTrafficSegmentList=" + roadTrafficSegmentList +
'}';
}
}

View File

@@ -0,0 +1,26 @@
package com.mogo.module.common.entity;
import java.util.List;
/**
* 上报路况服务Entity
*/
public class UploadTrafficEntity {
private List<RoadTrafficStatus> roadTrafficStatuses;
public List<RoadTrafficStatus> getRoadTrafficStatuses() {
return roadTrafficStatuses;
}
public void setRoadTrafficStatuses(List<RoadTrafficStatus> roadTrafficStatuses) {
this.roadTrafficStatuses = roadTrafficStatuses;
}
@Override
public String toString() {
return "UploadTrafficEntity{" +
"roadTrafficStatuses=" + roadTrafficStatuses +
'}';
}
}

View File

@@ -82,4 +82,16 @@ public class PoiWrapper {
public void setIconInfoUrl(String iconInfoUrl) {
this.iconInfoUrl = iconInfoUrl;
}
@Override
public String toString() {
return "PoiWrapper{" +
"poiType='" + poiType + '\'' +
", iconRes=" + iconRes +
", iconInfoRes=" + iconInfoRes +
", iconUrl='" + iconUrl + '\'' +
", iconInfoUrl='" + iconInfoUrl + '\'' +
", title='" + title + '\'' +
'}';
}
}

View File

@@ -80,6 +80,7 @@ public class CloudPoiManager {
String config = SharedPrefsMgr.getInstance(context).getString("SHARE_BUTTON_CONFIG", "");
if (!config.isEmpty()) {
List<PoiWrapper> configWrappers = GsonUtil.arrayFromJson(config, PoiWrapper.class);
Logger.d(TAG, "config: " + configWrappers);
if(configWrappers!=null) {
for (PoiWrapper wrapper : configWrappers) {
wrapper.setIconInfoRes(R.drawable.module_common_icon_map_marker_road_block_up2_white);
@@ -91,6 +92,7 @@ public class CloudPoiManager {
wrapper.setIconInfoRes(defWrapper.getIconInfoRes());
}
}
Logger.d(TAG, "put===" + wrapper);
poiWrapper.put(wrapper.getPoiType(), wrapper);
}
}else{

View File

@@ -230,7 +230,6 @@ public class CustomRatingBar extends LinearLayout {
layout.setMargins(0, 0, Math.round(elementPadding), 0);//设置每颗星星在线性布局的间距
imageView.setLayoutParams(layout);
imageView.setAdjustViewBounds(true);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setImageDrawable(elementEmptyDrawable);
imageView.setMinimumWidth((int) elementWidth);
imageView.setMaxWidth((int) elementWidth);

View File

@@ -37,8 +37,7 @@ class PushRepository(mContext: Context) {
PushRepository(appContext)
}
@JvmField
val TAG: String = "PushRepository.kt"
private const val TAG: String = "PushRepository.kt"
}
// 被中断的push消息仅再次展示一次
@@ -74,13 +73,13 @@ class PushRepository(mContext: Context) {
Log.d("PushRepository", "pushBean = $bean")
if (bean != null) {
AnalyticsUtils.track(Config.NEWS_ARRIVE, "title", bean.title)
if (bean.mainSchema == null || bean.mainSchema == "") {
if (bean.mainSchema.isBlank()) {
bean.mainSchema = ""
}
if (bean.imageUrl == null || bean.imageUrl == "null") {
if (bean.imageUrl.isBlank()) {
bean.imageUrl = ""
}
if (bean.appIcon == null || bean.appIcon == "null") {
if (bean.appIcon.isBlank()) {
bean.appIcon = ""
}
pushBeanQueue.offer(bean)
@@ -144,10 +143,7 @@ class PushRepository(mContext: Context) {
startIterate()
}
private inline fun needDelay(bean: PushBean): Boolean {
if (bean == null) {
return false
}
private fun needDelay(bean: PushBean): Boolean {
if (locationClient.lastKnowLocation != null) {
if (bean.speedLimit > 0 && bean.speedLimit <= locationClient.lastKnowLocation.speed * 18 / 5) {
Log.d("PushRepository", "speedLimit" + locationClient.lastKnowLocation.speed)

View File

@@ -6,12 +6,12 @@ import androidx.core.view.get
import androidx.core.view.isNotEmpty
import com.mogo.utils.logger.Logger
val TAG: String = "AnimatorUtils.kt"
const val TAG: String = "AnimatorUtils.kt"
fun startClearAnimator(root: ViewGroup, runnable: Runnable) {
if (root.isNotEmpty()) {
var view: View
var size = root.childCount - 1
val size = root.childCount - 1
for (i in size downTo 0) {
view = root[i]
view.animate().translationX(-view.width.toFloat()).apply {
@@ -27,7 +27,7 @@ fun startClearAnimator(root: ViewGroup, runnable: Runnable) {
}
}
} else {
runnable?.apply {
runnable.apply {
run()
}
}

View File

@@ -49,7 +49,7 @@ class FloatView constructor(
fun inflateView(@LayoutRes layoutId: Int)
}
open abstract inner class PushView(context: Context) : FrameLayout(context),
abstract inner class PushView(context: Context) : FrameLayout(context),
PushViewController {
lateinit var appIcon: ImageView
lateinit var titleIconContainer: View
@@ -95,7 +95,7 @@ class FloatView constructor(
fun hasButtons(bean: PushBean?): Boolean {
bean?.buttons?.forEach {
if (!it?.text?.isNullOrEmpty()) {
if (!it.text?.isNullOrEmpty()) {
return true
}
}

View File

@@ -6,7 +6,6 @@ import android.util.Log
import com.mogo.commons.voice.AIAssist
import com.mogo.commons.voice.IMogoVoiceCmdCallBack
import com.mogo.module.push.Config
import com.zhidao.auto.platform.voice.VoiceClient
import com.mogo.module.push.model.PushBean
import com.mogo.module.push.repository.PushRepository
import com.mogo.module.push.utils.AnalyticsUtils
@@ -119,8 +118,8 @@ class PushViewModel(
}
field?.showTimeoutShadow = field?.showTimeout?:0
Log.d("yilz", "pushbean = $value")
if (value != null && value!!.imageUrl == null) {
value!!.imageUrl = ""
if (value.imageUrl.isBlank()) {
value.imageUrl = ""
}
if (floatView == null) {
floatView = FloatView(this, mContext)

View File

@@ -49,41 +49,41 @@ object SettingManager : IMogoSettingManager {
private var isGpsSimulator: Boolean = false
override fun getPathPrefer(): Int {
return settings!!.getInt(KEY_PAHT_PREFER, 0)
return settings.getInt(KEY_PAHT_PREFER, 0)
}
override fun getVolume(): Int {
return settings!!.getInt(KEY_VOLUME, 0)
return settings.getInt(KEY_VOLUME, 0)
}
override fun getVoiceStyle(): Int {
return settings!!.getInt(KEY_VOICE_STYLE, R.id.rb_navi_detail)
return settings.getInt(KEY_VOICE_STYLE, R.id.rb_navi_detail)
}
override fun getMapType(): Int {
return settings!!.getInt(KEY_MAP_TYPE, R.id.rb_navi_day)
return settings.getInt(KEY_MAP_TYPE, R.id.rb_navi_day)
}
fun setPathPrefer(type: Int) {
settings!!.edit()
settings.edit()
.putInt(KEY_PAHT_PREFER, type)
.apply()
}
fun setVolume(type: Int) {
settings!!.edit()
settings.edit()
.putInt(KEY_VOLUME, type)
.apply()
}
fun setVoiceStyle(type: Int) {
settings!!.edit()
settings.edit()
.putInt(KEY_VOICE_STYLE, type)
.apply()
}
fun setMapType(type: Int) {
settings!!.edit()
settings.edit()
.putInt(KEY_MAP_TYPE, type)
.apply()
}

View File

@@ -19,7 +19,6 @@ import com.mogo.module.common.map.Scene
import com.mogo.module.common.utils.CarSeries
import com.mogo.module.navi.R
import com.mogo.module.navi.constants.SearchApisHolder
import com.mogo.module.navi.manager.AddressManager
import com.mogo.module.navi.ui.adapter.SearchCategoryAdapter
import com.mogo.module.navi.ui.base.BaseFragment
import com.mogo.module.navi.uitls.BitmapUtils
@@ -34,17 +33,16 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
override fun onCmdSelected(cmd: String?) {
if (cmd?.startsWith("position") == true) {
var index = cmd.substring(8)
val index = cmd.substring(8)
mAdapter.current = index.toInt()
updateMarker(false)
goPath()
}
}
private val TAG: String = "CategorySearchFragment"
private var addMarkers: ArrayList<IMogoMarker> = ArrayList()
var arrayList = ArrayList<MogoMarkerOptions>()
var locationList = ArrayList<MogoLatLng>()
private var arrayList = ArrayList<MogoMarkerOptions>()
private var locationList = ArrayList<MogoLatLng>()
private lateinit var cmds: ArrayList<String>
@@ -57,13 +55,13 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
arrayList.clear()
locationList.clear()
for (index in 0 until datums!!.size) {
var decodeResource = BitmapFactory.decodeResource(
for (index in datums!!.indices) {
val decodeResource = BitmapFactory.decodeResource(
resources,
if (mAdapter.current == index) R.mipmap.icon_search_category_checked else R.mipmap.icon_search_category_unchecked
)
var createWaterMask = BitmapUtils.createWaterMask(
val createWaterMask = BitmapUtils.createWaterMask(
context,
decodeResource,
(index + 1).toString(),
@@ -76,15 +74,15 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
.owner("CategorySearchFragment")
.`object`(index)
// .anchor(0.5f, 1f)
.longitude(datums[index].point?.lng ?: 0.0)
.longitude(datums[index].point?.lon ?: 0.0)
arrayList.add(options)
if (locationList.size < 3) {
locationList.add(datums[index].point)
}
var int2String = StringUtils.int2String(index + 1)
val int2String = StringUtils.int2String(index + 1)
AIAssist.getInstance(context).registerUnWakeupCommand("position${index}", arrayOf("${int2String}", "${int2String}"), this)
cmds.add("position" + index)
cmds.add("position$index")
}
addMarkers()
@@ -92,7 +90,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
private fun addMarkers() {
addMarkers.clear()
var marginBounder = resources.getDimensionPixelSize(R.dimen.dp_60) * 2
val marginBounder = resources.getDimensionPixelSize(R.dimen.dp_60) * 2
SearchApisHolder.getUiControllerApis().showBounds(TAG,
locationList[0],
locationList,
@@ -101,7 +99,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
)
for (options in arrayList) {
var addMarker = SearchApisHolder.getMarkerManager().addMarker(TAG, options)
val addMarker = SearchApisHolder.getMarkerManager().addMarker(TAG, options)
addMarker.onMarkerClickListener = this
addMarkers.add(addMarker)
}
@@ -109,7 +107,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
private fun registerVoice() {
for (index in 0 until cmds.size) {
var int2String = StringUtils.int2String(index + 1)
val int2String = StringUtils.int2String(index + 1)
AIAssist.getInstance(context).registerUnWakeupCommand("position${index}", arrayOf("${int2String}", "${int2String}"), this)
}
}
@@ -125,7 +123,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
}
override fun onMarkerClicked(marker: IMogoMarker?): Boolean {
var index = marker?.mogoMarkerOptions?.`object` as Int
val index = marker?.mogoMarkerOptions?.`object` as Int
mAdapter.current = index
rv_search_result.smoothScrollToPosition(index)
updateMarker()
@@ -142,7 +140,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
category = arguments?.getString("category")
mSearchPresenter = CategoryPresenter(this)
lifecycle.addObserver(mSearchPresenter)
cmds = ArrayList<String>()
cmds = ArrayList()
}
override fun getLayoutId(): Int {
@@ -168,7 +166,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
goPath()
}
mAdapter.setOnClickListener {
var position = it.getTag(R.id.tag_position) as Int
val position = it.getTag(R.id.tag_position) as Int
mAdapter.current = position
updateMarker()
}
@@ -183,13 +181,12 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
}
private fun updateMarker(moveToCenter: Boolean = true) {
addMarkers?.get(mAdapter.lastPosition)?.setIcon(getMarkerIcon(mAdapter.lastPosition))
var current = addMarkers?.get(mAdapter.current)
current?.setIcon(getMarkerIcon(mAdapter.current))
current?.setToTop()
arrayList.get(mAdapter.lastPosition).icon(getMarkerIcon(mAdapter.lastPosition))
arrayList.get(mAdapter.current).icon(getMarkerIcon(mAdapter.current))
addMarkers[mAdapter.lastPosition].setIcon(getMarkerIcon(mAdapter.lastPosition))
val current = addMarkers[mAdapter.current]
current.setIcon(getMarkerIcon(mAdapter.current))
current.setToTop()
arrayList[mAdapter.lastPosition].icon(getMarkerIcon(mAdapter.lastPosition))
arrayList[mAdapter.current].icon(getMarkerIcon(mAdapter.current))
if (moveToCenter) {
SearchApisHolder.getStatusManager().setUserInteractionStatus(TAG, true, false)
SearchApisHolder.getUiControllerApis().moveToCenter(current.position, CarSeries.CAR_SERIES_F80X == CarSeries.getSeries())
@@ -197,7 +194,7 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
}
private fun getMarkerIcon(index: Int): Bitmap {
var decodeResource = BitmapFactory.decodeResource(
val decodeResource = BitmapFactory.decodeResource(
resources,
if (mAdapter.current == index) R.mipmap.icon_search_category_checked else R.mipmap.icon_search_category_unchecked
)
@@ -232,13 +229,16 @@ class CategorySearchFragment : BaseFragment(), CategoryView, IMogoVoiceCmdCallBa
}
companion object {
private const val TAG: String = "CategorySearchFragment"
fun newInstance(category: String): Fragment {
MapCenterPointStrategy.setMapCenterPointByScene(SearchApisHolder.getUiControllerApis(), Scene.CATEGORY_SEARCH)
var bundle = Bundle()
val bundle = Bundle()
bundle.putString("category", category)
var categorySerachFragment = CategorySearchFragment()
categorySerachFragment.arguments = bundle
return categorySerachFragment
val categorySearchFragment = CategorySearchFragment()
categorySearchFragment.arguments = bundle
return categorySearchFragment
}
}
}

View File

@@ -0,0 +1,100 @@
package com.mogo.module.share;
import android.content.Context;
import android.nfc.Tag;
import android.util.Log;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.facade.template.IProvider;
import com.amap.api.services.nearby.UploadInfoCallback;
import com.google.gson.JsonObject;
import com.mogo.map.MogoLatLng;
import com.mogo.map.navi.IMogoAimlessModeListener;
import com.mogo.map.navi.MogoCongestionInfo;
import com.mogo.map.navi.MogoCongestionLink;
import com.mogo.map.navi.MogoTraffic;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.entity.RoadTrafficSegment;
import com.mogo.module.common.entity.RoadTrafficStatus;
import com.mogo.module.common.entity.UploadTrafficEntity;
import com.mogo.module.share.net.TrafficModelData;
import com.mogo.service.MogoServicePaths;
import com.mogo.utils.network.utils.GsonUtil;
import java.util.ArrayList;
import java.util.List;
/**
* TODO 高德巡航信息监听,并将拥堵信息上报到服务端
*/
@Route(path = MogoServicePaths.PATH_GAODE_AIMLESS_SHARE)
public class GaoDeAimlessProvider implements IProvider {
private final String TAG = "GaoDeAimlessProvider";
private TrafficModelData mTanluModelData;
List<RoadTrafficSegment> mlist = new ArrayList<>();
RoadTrafficSegment roadTrafficSegment = new RoadTrafficSegment();
@Override
public void init(Context context) {
Log.d(TAG, "provider init……");
if (mTanluModelData == null) {
mTanluModelData = new TrafficModelData();
}
// 开启巡航监听
MogoApisHandler.getInstance()
.getApis()
.getMapServiceApi()
.getAimless(context)
.setAimlessModeStatus(true);
// 注册高德巡航回调
MogoApisHandler.getInstance()
.getApis()
.getRegisterCenterApi()
.registerMogoAimlessModeListener(TAG, new IMogoAimlessModeListener() {
@Override
public void onUpdateTraffic2(MogoTraffic traffic) {
Log.d(TAG, "onUpdateTraffic2 back……");
}
@Override
public void onUpdateCongestion(MogoCongestionInfo info) {
Log.d(TAG, GsonUtil.jsonFromObject(info));
UploadInfo(info);
}
});
}
/**
* 上报拥堵信息
*
* @param info
*/
private void UploadInfo(MogoCongestionInfo info) {
UploadTrafficEntity uploadTrafficEntity = new UploadTrafficEntity();
List<RoadTrafficStatus> roadTrafficStatusList = new ArrayList<>();
RoadTrafficStatus mStatusBean = new RoadTrafficStatus();
mStatusBean.setLength(info.getLength());
mStatusBean.setRoadName(info.getRoadName());
mStatusBean.setStatus(info.getCongestionStatus());
mStatusBean.setSegment(true);
if (info.getCongestionLinks() != null && info.getCongestionLinks().size() > 0) {
mlist.clear();
for (MogoCongestionLink data : info.getCongestionLinks()
) {
roadTrafficSegment.setStatus(data.getCongestionStatus());
roadTrafficSegment.setMogoLatLngList(data.getCoords());
mlist.add(roadTrafficSegment);
}
mStatusBean.setRoadTrafficSegmentList(mlist);
}
roadTrafficStatusList.add(mStatusBean);
uploadTrafficEntity.setRoadTrafficStatuses(roadTrafficStatusList);
mTanluModelData.uploadTrafficInfo(uploadTrafficEntity);
}
}

View File

@@ -4,6 +4,7 @@ import android.content.Context;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.map.location.IMogoLocationClient;
import com.mogo.map.navi.IMogoAimless;
import com.mogo.map.search.poisearch.IMogoPoiSearch;
import com.mogo.map.search.poisearch.query.MogoPoiSearchQuery;
import com.mogo.service.IMogoServiceApis;
@@ -31,6 +32,7 @@ public class TanluServiceManager {
private static IMogoIntentManager mogoIntentManager;
private static IMogoRegisterCenter mogoRegisterCenter;
private static IMogoTopViewManager mIMogoTopViewManager;
private static IMogoAimless mIMogoAimless;
public static void init(Context context) {
mServiceApis = (IMogoServiceApis) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(context);
@@ -39,6 +41,7 @@ public class TanluServiceManager {
mAnalytics = mServiceApis.getAnalyticsApi();
mogoIntentManager = mServiceApis.getIntentManagerApi();
mogoRegisterCenter = mServiceApis.getRegisterCenterApi();
mIMogoAimless = mMapService.getAimless(context);
mIMogoTopViewManager = mServiceApis.getTopViewManager();
mPoiSearch = mMapService.getPoiSearch(context, new MogoPoiSearchQuery());
@@ -81,4 +84,7 @@ public class TanluServiceManager {
return mServiceApis;
}
public static IMogoAimless getMogoAimless() {
return mIMogoAimless;
}
}

View File

@@ -0,0 +1,23 @@
@file:Suppress("DEPRECATION")
package com.mogo.module.share
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.facade.template.IProvider
import com.mogo.module.share.manager.TrafficUploadManager.Companion.trafficUpload
import com.mogo.service.MogoServicePaths
import com.mogo.service.share.IMogoTrafficUploadProvider
@Route( path = MogoServicePaths.PATH_TRAFFIC_UPLOAD )
class TrafficUploadProvider :IProvider , IMogoTrafficUploadProvider{
override fun init(context: Context?) {
}
override fun verifyCurrentTrafficStatus() {
trafficUpload.verityTrafficStatus()
}
}

View File

@@ -10,6 +10,11 @@ class HttpConstant {
const val HOST_DEMO = "http://dzt-show.zhidaohulian.com"
const val HOST_PRODUCT = "https://dzt.zhidaohulian.com"
const val TMC_HOST_TEST="http://dzt-test.zhidaozhixing.com"
const val TMC_HOST_DEMO="http://dzt-show.zhidaozhixing.com"
const val TMC_HOST_PRODUCT="http://dzt.zhidaozhixing.com"
@JvmStatic
fun getNetHost(): String {
return when (DebugConfig.getNetMode()) {
DebugConfig.NET_MODE_DEV -> HOST_DEV
@@ -18,6 +23,16 @@ class HttpConstant {
else -> HOST_PRODUCT
}
}
@JvmStatic
fun getTMCHost(): String {
return when (DebugConfig.getNetMode()) {
DebugConfig.NET_MODE_DEV -> TMC_HOST_TEST
DebugConfig.NET_MODE_QA -> TMC_HOST_TEST
DebugConfig.NET_MODE_DEMO -> TMC_HOST_DEMO
else -> TMC_HOST_PRODUCT
}
}
}
}

View File

@@ -0,0 +1,68 @@
package com.mogo.module.share.manager
import com.mogo.map.MogoLatLng
import com.mogo.map.search.traffic.IMogoTrafficSearchListener
import com.mogo.map.search.traffic.MogoTrafficResult
import com.mogo.module.common.MogoApisHandler
import com.mogo.module.common.entity.RoadTrafficStatus
import com.mogo.module.common.entity.UploadTrafficEntity
import com.mogo.module.share.TanluServiceManager
import com.mogo.module.share.net.TrafficModelData
import com.mogo.utils.logger.Logger
import java.util.*
class TrafficUploadManager : IMogoTrafficSearchListener {
companion object {
const val TAG = "TrafficUploadManager"
const val TRAFFIC_SEARCH_AREA = 500
const val TRACK_UPLOAD_INVOKE = "Mogoer_Upload_Traffic_Invoke"
val trafficUpload by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
TrafficUploadManager()
}
}
private val trafficModelData = TrafficModelData()
fun verityTrafficStatus() {
val trafficSearchApi = TanluServiceManager.getMapService().trafficSearchApi
val location = TanluServiceManager.getLocationClient().lastKnowLocation
trafficSearchApi.registerTrafficSearchListener(this)
Logger.d(TAG, "verityTrafficStatus searchTrafficByCircleArea")
trafficSearchApi.searchTrafficByCircleArea(MogoLatLng(location.latitude, location.longitude), TRAFFIC_SEARCH_AREA)
}
override fun onTrafficSearchError(errorMsg: String?) {
errorMsg?.let {
Logger.d(TAG, "onTrafficSearchError errorMsg : $errorMsg , So drop this verity and track")
val map = hashMapOf<String, Any>("upload" to 2) //调用高德接口失败
MogoApisHandler.getInstance().apis.analyticsApi.track(TRACK_UPLOAD_INVOKE, map)
}
}
override fun onTrafficSearchInfo(trafficResult: MogoTrafficResult?) {
val map = hashMapOf<String, Any>("upload" to 1) //调用高德接口成功
MogoApisHandler.getInstance().apis.analyticsApi.track(TRACK_UPLOAD_INVOKE, map)
trafficResult?.let {
val uploadTrafficEntity = UploadTrafficEntity()
val roadTrafficStatusList: MutableList<RoadTrafficStatus> = ArrayList()
val trafficStatusInfoList = it.trafficStatusInfos
trafficStatusInfoList.forEach { info ->
val roadTrafficStatus = RoadTrafficStatus()
roadTrafficStatus.angle = info.angle
roadTrafficStatus.direction = info.direction
roadTrafficStatus.isSegment = false
roadTrafficStatus.length = 0
roadTrafficStatus.roadName = info.name
roadTrafficStatus.status = info.status.toInt()
roadTrafficStatus.mogoLatLngList = info.mogoLatLngs
roadTrafficStatusList.add(roadTrafficStatus)
}
uploadTrafficEntity.roadTrafficStatuses = roadTrafficStatusList
trafficModelData.uploadTrafficInfo(uploadTrafficEntity)
}
}
}

View File

@@ -6,7 +6,6 @@ import com.mogo.commons.voice.AIAssist
import com.mogo.map.MogoLatLng
import com.mogo.module.common.entity.MarkerPoiTypeEnum
import com.mogo.module.share.R
import com.mogo.module.share.TanluManager
import com.mogo.module.share.constant.ShareConstants.*
import com.mogo.service.share.TanluUploadParams
import com.mogo.utils.NetworkUtils
@@ -70,10 +69,10 @@ object UploadHelper {
private fun showVoiceTip(context: Context, type: String) {
var shareItemSum = SharedPrefsMgr.getInstance(context).getInt(KEY_CLICK_SHARE_ITEM_BUTTON, 0)
var intervalTime = SharedPrefsMgr.getInstance(context).getLong(KEY_CLICK_SHARE_ITEM_TIME, 0)
val intervalTime = SharedPrefsMgr.getInstance(context).getLong(KEY_CLICK_SHARE_ITEM_TIME, 0)
if (shareItemSum < VOICE_ALERT_COUNT) {
Log.d("UploadHelper", "shareItemSum = $shareItemSum --- intervalTime = $intervalTime --type = ${type}")
var time = System.currentTimeMillis()
val time = System.currentTimeMillis()
if (intervalTime == 0.toLong()) {
SharedPrefsMgr.getInstance(context).putLong(KEY_CLICK_SHARE_ITEM_TIME, time)
SharedPrefsMgr.getInstance(context).putInt(KEY_CLICK_SHARE_ITEM_BUTTON, ++shareItemSum)
@@ -93,8 +92,7 @@ object UploadHelper {
private fun getTypeName(type: String): String? {
var typeName = ""
typeName = when (type) {
return when (type) {
MarkerPoiTypeEnum.TRAFFIC_CHECK -> "交通检查"
MarkerPoiTypeEnum.ROAD_CLOSED -> "封路"
MarkerPoiTypeEnum.FOURS_ROAD_WORK -> "施工"
@@ -106,7 +104,6 @@ object UploadHelper {
MarkerPoiTypeEnum.FOURS_LIVING -> "实时路况"
else -> "实时路况"
}
return typeName
}
}

View File

@@ -42,6 +42,6 @@ interface ShareApiService {
*/
@FormUrlEncoded
@POST("/yycp-launcherSnapshot/launcherSnapshot/searchRoadEventsSync")
fun queryRoadInfos(@FieldMap params: Map<String, Object>): Observable<BaseDataCompat<RoadInfos>>
fun queryRoadInfos(@FieldMap params: Map<String, Any>): Observable<BaseDataCompat<RoadInfos>>
}

View File

@@ -0,0 +1,21 @@
package com.mogo.module.share.net;
import com.mogo.commons.data.BaseData;
import java.util.Map;
import io.reactivex.Observable;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface TrafficApiService {
/**
* 上报路况拥堵情况
*
*/
@FormUrlEncoded
@POST("/yycp-tmcServer/tmcServer/car/reportTraffic/v1")
Observable<BaseData> UploadCongestionInfo(@FieldMap Map<String, Object> parames);
}

View File

@@ -0,0 +1,68 @@
package com.mogo.module.share.net;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.data.BaseData;
import com.mogo.commons.network.ParamsProvider;
import com.mogo.commons.network.SubscribeImpl;
import com.mogo.commons.network.Utils;
import com.mogo.module.common.entity.RoadTrafficStatus;
import com.mogo.module.common.entity.UploadTrafficEntity;
import com.mogo.module.share.constant.HttpConstant;
import com.mogo.service.MogoServicePaths;
import com.mogo.service.network.IMogoNetwork;
import com.mogo.utils.logger.Logger;
import com.mogo.utils.network.RequestOptions;
import com.mogo.utils.network.utils.GsonUtil;
import java.util.Map;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import static com.mogo.commons.AbsMogoApplication.getApp;
public class TrafficModelData {
private static final String TAG = "TrafficModelData";
private TrafficApiService mTrafficApiService;
public TrafficModelData() {
IMogoNetwork network = (IMogoNetwork) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICES_NETWORK).navigation(getApp().getApplicationContext());
mTrafficApiService = network.create(TrafficApiService.class, HttpConstant.getTMCHost());
}
/**
* 拥堵信息上报
*
* @param uploadTrafficEntity 高的返回的拥堵信息对象
* @param
*/
public void uploadTrafficInfo(UploadTrafficEntity uploadTrafficEntity) {
final ParamsProvider.Builder builder = new ParamsProvider.Builder( getApp().getApplicationContext());
Map<String, Object> parameters = builder.build();
parameters.put("sn", Utils.getSn());
parameters.put("data",GsonUtil.jsonFromObject(uploadTrafficEntity));
mTrafficApiService.UploadCongestionInfo(parameters)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<BaseData>(RequestOptions.create( getApp().getApplicationContext())) {
@Override
public void onError(Throwable e) {
super.onError(e);
Logger.d(TAG, "拥堵上报失败" + e.toString());
// callback.UploadFail(e.getMessage(), -1);
}
@Override
public void onSuccess(BaseData o) {
super.onSuccess(o);
Logger.d(TAG, "拥堵上报成功" + o.toString());
// callback.UpLoadSuccess(o.msg.toString(), o.code);
}
});
}
}

View File

@@ -167,7 +167,7 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService
val params = ArrayMap<String, Any>()
params["speed"] = average.toInt()
val body = RequestBody.create(MediaType.parse("Content-type:application/json;charset=UTF-8"), GsonUtil.jsonFromObject(params))
val disposable = apis.networkApi.create(ShareApiService::class.java, HttpConstant.getNetHost()).sendAverageSpeedForBlockStrategy(body, Utils.getSn()).subscribeOn(Schedulers.io()).subscribe(object : SubscribeImpl<AverateSpeedResponse>(RequestOptions.create(context)) {
apis.networkApi.create(ShareApiService::class.java, HttpConstant.getNetHost()).sendAverageSpeedForBlockStrategy(body, Utils.getSn()).subscribeOn(Schedulers.io()).subscribe(object : SubscribeImpl<AverateSpeedResponse>(RequestOptions.create(context)) {
override fun onSuccess(response: AverateSpeedResponse?) {
super.onSuccess(response)
response?.let {

View File

@@ -30,6 +30,7 @@ import com.mogo.service.module.IMogoMarkerService;
import com.mogo.service.module.IMogoRegisterCenter;
import com.mogo.service.module.IMogoSearchManager;
import com.mogo.service.share.IMogoShareManager;
import com.mogo.service.share.IMogoTrafficUploadProvider;
import com.mogo.service.statusmanager.IMogoStatusManager;
import com.mogo.service.strategy.IMogoOnlineCarListPanelProvider;
import com.mogo.service.strategy.IMogoRefreshStrategyController;
@@ -72,6 +73,7 @@ public class V2XServiceManager {
private static IMogoMarkerService mIMogoMarkerService;
private static IMogoShareManager mIMogoShareManager;
private static IMogoTanluProvider mIMogoTanluProvider;
private static IMogoTrafficUploadProvider mIMogoTrafficUploadProvider;
//事件面板
private static IEventPanelProvider mIEventPanelProvider;
@@ -120,6 +122,7 @@ public class V2XServiceManager {
mIMogoMarkerService = mMogoServiceApis.getMarkerService();
mIMogoShareManager = mMogoServiceApis.getShareManager();
mIMogoTanluProvider = mMogoServiceApis.getTanluApi();
mIMogoTrafficUploadProvider = mMogoServiceApis.getTrafficUploadApi();
mMogoOnlineCarListPanelProvider = mMogoServiceApis.getOnlineCarPanelApi();
//事件面板
mIEventPanelProvider = mMogoServiceApis.getEventPanelManager();
@@ -274,6 +277,9 @@ public class V2XServiceManager {
return mIMogoTanluProvider;
}
public static IMogoTrafficUploadProvider getIMogoTrafficUploadProvider(){
return mIMogoTrafficUploadProvider;
}
public static IMogoOnlineCarListPanelProvider getMogoOnlineCarListPanelProvider() {
return mMogoOnlineCarListPanelProvider;

View File

@@ -71,7 +71,7 @@ class V2XEventPanelFragment : MvpFragment<V2XEventPanelFragment, EventPanelPrese
}
// 打开出行动态TAB
private val mCheckHistoryEventCb = V2XVoiceCallbackListener { command: String?, intent: Intent? ->
private val mCheckHistoryEventCb = V2XVoiceCallbackListener { _: String?, _: Intent? ->
try {
mRbScenarioHistory?.isChecked = true
} catch (e: java.lang.Exception) {
@@ -80,7 +80,7 @@ class V2XEventPanelFragment : MvpFragment<V2XEventPanelFragment, EventPanelPrese
}
// 打开周边事件TAB
private val mCheckSurroundingCb = V2XVoiceCallbackListener { command: String?, intent: Intent? ->
private val mCheckSurroundingCb = V2XVoiceCallbackListener { _: String?, _: Intent? ->
try {
mRbSurroundingEvent?.isChecked = true
} catch (e: java.lang.Exception) {
@@ -89,7 +89,7 @@ class V2XEventPanelFragment : MvpFragment<V2XEventPanelFragment, EventPanelPrese
}
// 打开我的分享TAB
private val mCheckShearEventCb = V2XVoiceCallbackListener { command: String?, intent: Intent? ->
private val mCheckShearEventCb = V2XVoiceCallbackListener { _: String?, _: Intent? ->
try {
mRbShareEvents?.isChecked = true
} catch (e: java.lang.Exception) {
@@ -98,7 +98,7 @@ class V2XEventPanelFragment : MvpFragment<V2XEventPanelFragment, EventPanelPrese
}
// 打关闭事件面板
private val mCloeEventCb = V2XVoiceCallbackListener { command: String?, intent: Intent? ->
private val mCloeEventCb = V2XVoiceCallbackListener { _: String?, _: Intent? ->
try {
TrackUtils.trackV2xHistoryEvent(5)
hidePanel()
@@ -132,7 +132,7 @@ class V2XEventPanelFragment : MvpFragment<V2XEventPanelFragment, EventPanelPrese
mVpEventPanel?.adapter = V2XEventPagerAdapter(this, fragments!!)
mVpEventPanel?.isUserInputEnabled = false; //true:滑动false禁止滑动
mRgTabSelect?.setOnCheckedChangeListener { group, checkedId ->
mRgTabSelect?.setOnCheckedChangeListener { _, checkedId ->
when (checkedId) {
R.id.rbScenarioHistory -> {
// 更改选中是否加粗

View File

@@ -84,7 +84,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario<V2XRoadEventEntity> imp
boolean onlyShow = getV2XMessageEntity().isOnlyShow();
if (onlyShow == false){
if (onlyShow == false) {
// 设置TTS
getV2XMessageEntity().getContent().getTts(false);
// 广播给ADASzzz
@@ -198,7 +198,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario<V2XRoadEventEntity> imp
public void onViewAdded(View view) {
Logger.d(MODULE_NAME, "展示 Window 动画结束");
if (V2XServiceManager.getMoGoStatusManager().isMainPageLaunched()) {
if (getV2XMessageEntity() != null && getV2XMessageEntity().isNeedAddLine() == true){
if (getV2XMessageEntity() != null && getV2XMessageEntity().isNeedAddLine() == true) {
drawPOI();
}
}

View File

@@ -33,6 +33,7 @@ import com.mogo.utils.logger.Logger;
import java.util.ArrayList;
import java.util.List;
import static com.mogo.module.common.entity.MarkerPoiTypeEnum.FOURS_BLOCK_UP;
import static com.mogo.module.v2x.V2XConst.MODULE_NAME;
/**
@@ -168,12 +169,19 @@ public class V2XRoadEventWindow extends RelativeLayout
if (v2XRoadEventEntity != null) {
// 道路事件行驶到了50米附近弹出事件纠错框给用户
//Logger.d(MODULE_NAME, "V2X===道路事件:" + v2XRoadEventEntity);
//如果poiType是道路拥堵则调用接口查询拥堵状态
String poiType = v2XRoadEventEntity.getPoiType();
if(poiType != null && poiType.equals(FOURS_BLOCK_UP)){
V2XServiceManager.getIMogoTrafficUploadProvider().verifyCurrentTrafficStatus();
}
// 进行类型分发
switch (v2XRoadEventEntity.getPoiType()) {
case V2XPoiTypeEnum.TRAFFIC_CHECK: // 交通检查
case V2XPoiTypeEnum.ROAD_CLOSED://封路
case V2XPoiTypeEnum.FOURS_ROAD_WORK://施工
case V2XPoiTypeEnum.FOURS_BLOCK_UP://拥堵
case FOURS_BLOCK_UP://拥堵
case V2XPoiTypeEnum.FOURS_PONDING://积水
case V2XPoiTypeEnum.FOURS_FOG://浓雾
case V2XPoiTypeEnum.FOURS_ICE://结冰

View File

@@ -54,6 +54,7 @@ public class V2XTestConsoleWindow extends ConstraintLayout {
private Button mBtnTriggerParkEvent;
private Button mBtnTriggerCallUserInfo;
private Button mBtnTriggerEventUgc;
private Button mBtnTriggerTrafficSearch;
public static V2XTestConsoleWindow getInstance(Context context, int showType) {
if (mV2XTestConsoleWindow == null) {
@@ -101,6 +102,7 @@ public class V2XTestConsoleWindow extends ConstraintLayout {
mBtnTriggerParkEvent = findViewById(R.id.btnTriggerParkEvent);
mBtnTriggerEventUgc = findViewById(R.id.btnTriggerEventUgc);
mBtnTriggerCallUserInfo = findViewById(R.id.btnTriggerCallUserInfo);
mBtnTriggerTrafficSearch = findViewById(R.id.btnTriggerTrafficSearch);
switch (showType) {
case 0:
@@ -214,6 +216,7 @@ public class V2XTestConsoleWindow extends ConstraintLayout {
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
});
mBtnTriggerTrafficSearch.setOnClickListener(v-> V2XServiceManager.getIMogoTrafficUploadProvider().verifyCurrentTrafficStatus());
}
}

View File

@@ -149,6 +149,7 @@ class SimpleCoverVideoPlayer : StandardGSYVideoPlayer {
mFullPauseBitmap = null
if (mAudioManager != null) {
try {
@Suppress("DEPRECATION")
mAudioManager.abandonAudioFocus(onAudioFocusChangeListener)
} catch (e: Exception) {
Logger.e(TAG, e, "onDetachedFromWindow - abandonAudioFocus")

View File

@@ -47,8 +47,9 @@
android:id="@+id/ivIconP"
android:layout_width="@dimen/module_v2x_history_event_icon_size"
android:layout_height="@dimen/module_v2x_history_event_icon_size"
android:layout_marginEnd="@dimen/dp_16"
android:layout_marginEnd="@dimen/dp_26"
android:src="@drawable/icon_illegal_parking"
app:layout_constraintRight_toLeftOf="@+id/tvAddress"
app:layout_constraintLeft_toLeftOf="@+id/tagEventType"
app:layout_constraintTop_toBottomOf="@+id/tagEventType"
app:layout_constraintTop_toTopOf="@+id/tvAddress" />
@@ -57,7 +58,6 @@
android:id="@+id/tvAddress"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_12"
android:layout_marginTop="@dimen/dp_24"
android:layout_marginRight="@dimen/dp_30"
android:ellipsize="end"

View File

@@ -11,7 +11,7 @@
android:id="@+id/tagEventType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/module_v2x_surrounding_item_bottom_image_height"
android:layout_marginStart="@dimen/dp_36"
android:layout_marginTop="@dimen/dp_24"
android:background="@drawable/bg_v2x_event_type_orange"
android:gravity="center"

View File

@@ -26,7 +26,7 @@
android:layout_height="@dimen/dp_88"
android:layout_marginEnd="@dimen/dp_28"
android:layout_marginBottom="@dimen/dp_40"
android:background="@drawable/icon_window_close2"
android:background="@drawable/v2x_panel_close"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent" />

View File

@@ -165,6 +165,20 @@
android:textSize="@dimen/dp_22"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/btnTriggerTrafficSearch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_10"
android:layout_marginBottom="@dimen/dp_10"
android:background="#3196E2"
android:padding="@dimen/dp_10"
android:text="交通状况查询"
android:textColor="#FFFFFF"
android:textSize="@dimen/dp_22"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</com.google.android.flexbox.FlexboxLayout>