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

This commit is contained in:
董宏宇
2020-11-11 11:25:19 +08:00
78 changed files with 638 additions and 305 deletions

View File

@@ -373,8 +373,19 @@ dependencies {
apply from: "./functions/widgets.gradle"
apply from: "./functions/tts.gradle"
// implementation group: "com.tencent.matrix", name: "matrix-trace-canary", version:'0.6.6', changing: true
}
//apply plugin: 'com.tencent.matrix-plugin'
//matrix {
// trace {
// enable = true //if you don't want to use trace canary, set false
// baseMethodMapFile = "${project.buildDir}/matrix_output/Debug.methodmap"
// blackListFile = "${project.projectDir}/matrixTrace/blackMethodList.txt"
// }
//}
android.applicationVariants.all { variant ->
def buildTime = new Date().format("yyyyMMdd", TimeZone.getTimeZone("GMT+08:00"))
def flavor = variant.productFlavors.collect { it.name }.join('-')

View File

@@ -21,6 +21,7 @@ buildscript {
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.71'
classpath "com.alibaba:arouter-register:1.0.2"
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'
// classpath ("com.tencent.matrix:matrix-gradle-plugin:0.6.6") { changing = true }
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}

View File

@@ -7,7 +7,30 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
#org.gradle.jvmargs=-Xmx1536m
org.gradle.daemon=true
org.gradle.configureondemand=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx4096m
#开启gradle缓存
org.gradle.caching=true
android.enableBuildCache=true
#开启kotlin的增量和并行编译
kotlin.incremental=true
kotlin.incremental.java=true
kotlin.caching.enabled=true
#开启kotlin并行编译
kotlin.parallel.tasks.in.project=true
#优化kapt
#并行运行kapt1.2.60版本以上支持
kapt.use.worker.api=true
#增量编译 kapt1.3.30版本以上支持
kapt.incremental.apt=true
#kapt avoiding 如果用kapt依赖的内容没有变化会完全重用编译内容省掉app:kaptGenerateStubsDebugKotlin的时间
kapt.include.compile.classpath=false
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
@@ -18,7 +41,7 @@ org.gradle.jvmargs=-Xmx4096m
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
org.gradle.parallel=true
## maven 配置
RELEASE_REPOSITORY_URL=http://nexus.zhidaoauto.com/repository/maven-releases/
@@ -29,84 +52,84 @@ PASSWORD=xintai2018
RELEASE=false
# 模块版本
## 工程内模块
MOGO_COMMONS_VERSION=2.0.2
MOGO_UTILS_VERSION=2.0.0
MAP_AMAP_VERSION=2.0.0
MAP_AUTONAVI_VERSION=2.0.0
MOGO_MAP_VERSION=2.0.0
MOGO_MAP_API_VERSION=2.0.0
MOGO_SERVICE_VERSION=2.0.0
MOGO_SERVICE_API_VERSION=2.0.2
MOGO_CONNECTION_VERSION=2.0.0
MOGO_MODULE_APPS_VERSION=2.0.0
MOGO_MODULE_NAVI_VERSION=2.0.0
MOGO_MODULE_SHARE_VERSION=2.0.0
MOGO_MODULE_COMMON_VERSION=2.0.0
MOGO_MODULE_MAIN_VERSION=2.0.0
MOGO_MODULE_MAP_VERSION=2.0.0
MOGO_MODULE_SERVICE_VERSION=2.0.0
MOGO_MODULE_EXTENSIONS_VERSION=2.0.0
MOGO_MODULE_SEARCH_VERSION=2.0.0
MOGO_MODULE_BACK_VERSION=2.0.0
MOGO_MODULE_GPS_SIMULATOR_VERSION=2.0.0
MOGO_MODULE_GPS_SIMULATOR_DEBUG_VERSION=2.0.0
MOGO_MODULE_GPS_SIMULATOR_NOOP_VERSION=2.0.0
MOGO_MODULE_AUTHORIZE_VERSION=2.0.0
MOGO_MODULE_GUIDE_VERSION=2.0.0
MOGO_MODULE_MEDIA_VERSION=2.0.0
MOGO_MODULE_MAIN_LAUNCHER_VERSION = 2.0.0
MOGO_MODULE_MAIN_INDEPENDENT_VERSION = 2.0.0
MOGO_MODULE_V2X_VERSION=2.0.0
MOGO_COMMONS_VERSION=2.0.6
MOGO_UTILS_VERSION=2.0.6
MAP_AMAP_VERSION=2.0.6
MAP_AUTONAVI_VERSION=2.0.6
MOGO_MAP_VERSION=2.0.6
MOGO_MAP_API_VERSION=2.0.6
MOGO_SERVICE_VERSION=2.0.6
MOGO_SERVICE_API_VERSION=2.0.6
MOGO_CONNECTION_VERSION=2.0.6
MOGO_MODULE_APPS_VERSION=2.0.6
MOGO_MODULE_NAVI_VERSION=2.0.6
MOGO_MODULE_SHARE_VERSION=2.0.6
MOGO_MODULE_COMMON_VERSION=2.0.6
MOGO_MODULE_MAIN_VERSION=2.0.6
MOGO_MODULE_MAP_VERSION=2.0.6
MOGO_MODULE_SERVICE_VERSION=2.0.6
MOGO_MODULE_EXTENSIONS_VERSION=2.0.6
MOGO_MODULE_SEARCH_VERSION=2.0.6
MOGO_MODULE_BACK_VERSION=2.0.6
MOGO_MODULE_GPS_SIMULATOR_VERSION=2.0.6
MOGO_MODULE_GPS_SIMULATOR_DEBUG_VERSION=2.0.6
MOGO_MODULE_GPS_SIMULATOR_NOOP_VERSION=2.0.6
MOGO_MODULE_AUTHORIZE_VERSION=2.0.6
MOGO_MODULE_GUIDE_VERSION=2.0.6
MOGO_MODULE_MEDIA_VERSION=2.0.6
MOGO_MODULE_MAIN_LAUNCHER_VERSION=2.0.6
MOGO_MODULE_MAIN_INDEPENDENT_VERSION=2.0.6
MOGO_MODULE_V2X_VERSION=2.0.6
# 基础服务实现passport、socket、location
MOGO_BASE_SERVICES_APK_VERSION = 2.0.0
MOGO_BASE_SERVICES_SDK_VERSION = 2.0.0
MOGO_BASE_SERVICES_APK_VERSION=2.0.6
MOGO_BASE_SERVICES_SDK_VERSION=2.0.6
## 工程外部模块
# 探路
MOGO_MODULE_TANLU_VERSION=2.0.0
MOGO_MODULE_TANLU_VERSION=2.0.6
# 视频引导
MOGO_MODULE_GUIDESHOW_VERSION=2.0.0
MOGO_MODULE_GUIDESHOW_VERSION=2.0.6
# 推送
MOGO_MODULE_PUSH_VERSION=2.0.0
MOGO_MODULE_PUSH_BASE_VERSION=2.0.0
MOGO_MODULE_PUSH_NOOP_VERSION=2.0.0
MOGO_MODULE_PUSH_VERSION=2.0.6
MOGO_MODULE_PUSH_BASE_VERSION=2.0.6
MOGO_MODULE_PUSH_NOOP_VERSION=2.0.6
# 探路上报和分享模块
TANLULIB_VERSION=2.0.0
MOGO_TANLU_API_VERSION=2.0.0
TANLULIB_VERSION=2.0.6
MOGO_TANLU_API_VERSION=2.0.6
#左侧面板模块
MOGO_MODULE_LEFT_PANEL_VERSION=2.0.0
MOGO_MODULE_LEFT_PANEL_NOOP_VERSION=2.0.0
MOGO_MODULE_LEFT_PANEL_VERSION=2.0.6
MOGO_MODULE_LEFT_PANEL_NOOP_VERSION=2.0.6
# 小控件
MOGO_MODULE_WIDGETS_VERSION=2.0.0
MOGO_MODULE_WIDGETS_VERSION=2.0.6
# obu
MOGO_MODULE_OBU_VERSION=2.0.0
MOGO_MODULE_OBU_VERSION=2.0.6
# 皮肤
MOGO_SKIN_SUPPORT_VERSION=2.0.0
MOGO_SKIN_LIGHT_VERSION=2.0.0
MOGO_SKIN_SUPPORT_IMPL_VERSION=2.0.0
MOGO_SKIN_SUPPORT_NOOP_VERSION=2.0.0
SKIN_SUPPORT_VERSION=2.0.0
SKIN_SUPPORT_APPCOMPAT_VERSION=2.0.0
SKIN_SUPPORT_CARDVIEW_VERSION=2.0.0
SKIN_SUPPORT_CONSTRAINT_LAYOUT_VERSION=2.0.0
SKIN_SUPPORT_DESIGN_VERSION=2.0.0
MOGO_SKIN_SUPPORT_VERSION=2.0.6
MOGO_SKIN_LIGHT_VERSION=2.0.6
MOGO_SKIN_SUPPORT_IMPL_VERSION=2.0.6
MOGO_SKIN_SUPPORT_NOOP_VERSION=2.0.6
SKIN_SUPPORT_VERSION=2.0.6
SKIN_SUPPORT_APPCOMPAT_VERSION=2.0.6
SKIN_SUPPORT_CARDVIEW_VERSION=2.0.6
SKIN_SUPPORT_CONSTRAINT_LAYOUT_VERSION=2.0.6
SKIN_SUPPORT_DESIGN_VERSION=2.0.6
# 闪屏页
MOGO_MODULE_SPLASH_VERSION=2.0.0
MOGO_MODULE_SPLASH_NOOP_VERSION=2.0.0
MOGO_MODULE_SPLASH_VERSION=2.0.6
MOGO_MODULE_SPLASH_NOOP_VERSION=2.0.6
# monitor
MOGO_MODULE_MONITOR_VERSION=2.0.0
MOGO_MODULE_MONITOR_VERSION=2.0.6
# bugly
CRASHREPORT_VERSION=2.0.0
CRASHREPORT_BUGLY_VERSION=2.0.0
CRASHREPORT_NOOP_VERSION=2.0.0
CRASHREPORT_VERSION=2.0.6
CRASHREPORT_BUGLY_VERSION=2.0.6
CRASHREPORT_NOOP_VERSION=2.0.6
## tts
TTS_BASE_VERSION=1.0.0
TTS_DI_VERSION=1.0.0
TTS_ZHI_VERSION=1.0.0
TTS_NOOP_VERSION=1.0.0
TTS_BASE_VERSION=2.0.6
TTS_DI_VERSION=2.0.6
TTS_ZHI_VERSION=2.0.6
TTS_NOOP_VERSION=2.0.6
######## 外部依赖引用
# 车聊聊
CARCHATTING_VERSION=1.9.9
CARCHATTING_VERSION=2.0.2
# 车聊聊接口
CARCHATTINGPROVIDER_VERSION=1.4.1
# loglib

View File

@@ -900,7 +900,6 @@ public class AMapNaviViewWrapper implements IMogoMapView,
mLastDriveLocationShadow = location;
} else {
if ( ( int ) location.getBearing() == 0
&& mCurrentUIMode == EnumMapUI.NorthUP_2D
&& mLastDriveLocationShadow != null ) {
if ( mMyLocationMarker == null ) {
initMyLocationMarker();

View File

@@ -48,7 +48,9 @@ public class AMapWrapper implements IMogoMap {
mContext = context;
mUIcontroller = controller;
// 设置实现自定义 info window
mAMap.setInfoWindowAdapter( new AMapInfoWindowAdapter() );
if(mAMap!=null) {
mAMap.setInfoWindowAdapter(new AMapInfoWindowAdapter());
}
AMapUIController.getInstance().initClient( mUIcontroller );
}

View File

@@ -3,6 +3,7 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'android-aspectjx'
apply plugin: 'com.alibaba.arouter'
android {
@@ -73,9 +74,11 @@ dependencies {
if (Boolean.valueOf(RELEASE)) {
compileOnly rootProject.ext.dependencies.mogocommons
compileOnly rootProject.ext.dependencies.mogomap
compileOnly rootProject.ext.dependencies.mogoserviceapi
} else {
implementation project(':modules:mogo-module-common')
implementation project(':libraries:mogo-map')
implementation project(':services:mogo-service-api')
}
}

View File

@@ -21,5 +21,6 @@ data class InformationBody(
val isShare: Boolean, // 是否分享给附近车机
val direction: Float,
val poiType: String, //类型分类
val mainInfoId: Long //事件id
val mainInfoId: Long, //事件id
val speed: Float //车速
)

View File

@@ -19,6 +19,7 @@ import com.zhidao.roadcondition.util.StrategyPreferenceUtil.Companion.getStrateg
import com.zhidao.roadcondition.util.StrategyPreferenceUtil.Companion.getStrategyMinSpeed
import com.zhidao.roadcondition.util.StrategyPreferenceUtil.Companion.getStrategyType
import java.io.File
import kotlin.math.abs
/**
* @description 记录仪相关操作
@@ -35,6 +36,7 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
var mFromType: String = ""
private var mLongitude: Double = 0.0
private var mLatitude: Double = 0.0
var mSpeed: Float = 0f
private var getVideoFailed: (() -> Unit)? = null
private var interceptors: ArrayList<TakePhotoInterceptor> = ArrayList(1)
@@ -72,7 +74,8 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
mainInfoId: Long,
fromType: String,
longitude: Double,
latitude: Double
latitude: Double,
speed: Float
) {
Log.d(TAG, "takePhoto ---------- type = $type --- mType = $mType ---fromType = $fromType")
this.mType = type
@@ -80,6 +83,7 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
this.mFromType = fromType
this.mLongitude = longitude
this.mLatitude = latitude
this.mSpeed = speed
CustomStatusHandler.offerPhotoStatus(isCustom)
zdCarCoderController.takePhoto(photoType, cameraId, haveVoice)
trackGetPhoto(1)
@@ -98,14 +102,16 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
mainInfoId: Long,
fromType: String,
longitude: Double,
latitude: Double
latitude: Double,
speed: Float
) {
Log.d(TAG, "takeVideo -------- isCustom = $isCustom ---mFromType = $mFromType ---type = $type" )
Log.d(TAG, "takeVideo -------- isCustom = $isCustom ---mFromType = $mFromType ---type = $type ---speed = $speed" )
this.mType = type
this.mainInfoId = mainInfoId
this.mFromType = fromType
this.mLongitude = longitude
this.mLatitude = latitude
this.mSpeed = speed
if (DebugConfig.getCarMachineType() == 0) { //自研车机
outputVideoPath = getCompressVideoPath()
CustomStatusHandler.offerVideoStatus(TakeEntity(isCustom, id,fromType))
@@ -128,7 +134,8 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
entity,
mainInfoId,
mLongitude,
mLatitude
mLatitude,
mSpeed
)
//地图上打点
@@ -169,16 +176,16 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
// TANLU_ROAD_WORK
// )
// ) {
taskAsync(1_500) {
try {
// taskAsync(1_500) {
// try {
// VoiceController.speakVoice("上报失败")
// if (isCustom) {
// sendGetInfoFailedReceiver(mType)
// }
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
}
// } catch (e: java.lang.Exception) {
// e.printStackTrace()
// }
// }
//获取图片失败也上报,图片不打点
if (isCustom) {
@@ -189,7 +196,8 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
entity,
mainInfoId,
mLongitude,
mLatitude
mLatitude,
mSpeed
)
}
// }
@@ -215,24 +223,24 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
return
}
var minSpeedPic =
val minSpeedPic =
getStrategyMinSpeed(
AbsMogoApplication.getApp().applicationContext,
"pic",
getStrategyType("pic")
)
var maxSpeedPic =
val maxSpeedPic =
getStrategyMaxSpeed(
AbsMogoApplication.getApp().applicationContext,
"pic",
getStrategyType("pic")
)
var speed = LocationUtil.getInstance().getSpeed()
val speed = LocationUtil.getInstance().getSpeed()
if (!TextUtils.isEmpty(mType)) {
Log.d(TAG, "onTakePhotoSuccess mType != null")
CosStatusController().uploadFile(mutableListOf(photoPath as String), entity, mType, mainInfoId, mFromType, mLongitude,
mLatitude)
mLatitude, mSpeed)
} else {
Log.d(TAG, "onTakePhotoSuccess mType == null")
Log.d(
@@ -240,8 +248,8 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
"onTakePhotoSuccess maxSpeedPic = $maxSpeedPic ---> speed = $speed ---->minSpeedPic= $minSpeedPic"
)
if (maxSpeedPic == -1) {
if (speed >= (Math.abs(minSpeedPic) / 3.6f)) {
Log.d(TAG, "onTakePhotoSuccess abs =" + (Math.abs(minSpeedPic) / 3.6f))
if (speed >= (abs(minSpeedPic) / 3.6f)) {
Log.d(TAG, "onTakePhotoSuccess abs =" + (abs(minSpeedPic) / 3.6f))
CosStatusController().uploadFile(
mutableListOf(photoPath as String),
entity,
@@ -249,7 +257,8 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
mainInfoId,
mFromType,
mLongitude,
mLatitude
mLatitude,
mSpeed
)
}
}
@@ -264,7 +273,8 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
mainInfoId,
mFromType,
mLongitude,
mLatitude
mLatitude,
mSpeed
)
}
}
@@ -274,9 +284,9 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
//获取视频成功
override fun onTakeVideoSuccess(camera: Int, videoPath: String?) {
var thumbnailPath =
val thumbnailPath =
AbsMogoApplication.getApp().applicationContext.filesDir.parent + File.separator + "Thumbnail${System.currentTimeMillis()}.jpg"
var isSuccess = getVideoThumbnail(videoPath!!, thumbnailPath)
val isSuccess = getVideoThumbnail(videoPath!!, thumbnailPath)
Log.d(
TAG,
"getVideo onTakeVideoSuccess===$videoPath -----> isSuccess= $isSuccess ----> mType = $mType --- mainInfoId = $mainInfoId"
@@ -291,39 +301,39 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
}
if (isSuccess) {
var minSpeedVideo = getStrategyMinSpeed(
val minSpeedVideo = getStrategyMinSpeed(
AbsMogoApplication.getApp().applicationContext, "video",
getStrategyType("video")
)
var maxSpeedVideo = getStrategyMaxSpeed(
val maxSpeedVideo = getStrategyMaxSpeed(
AbsMogoApplication.getApp().applicationContext, "video",
getStrategyType("video")
)
var speed = LocationUtil.getInstance().getSpeed()
val speed = LocationUtil.getInstance().getSpeed()
entity?.let {
if (entity.isCustom) {
compressVideo(videoPath, thumbnailPath, entity)
if (it.isCustom) {
compressVideo(videoPath, thumbnailPath, it)
}else if (entity.fromType in STRATEGY_UPLOAD_TYPE_ARRAY) {
// 属于策略上报
compressVideo(videoPath, thumbnailPath, entity)
compressVideo(videoPath, thumbnailPath, it)
} else {
Log.d(
TAG,
"onTakeVideoSuccess maxSpeedVideo = $maxSpeedVideo --->speed= $speed + minSpeedVideo = $minSpeedVideo"
)
if (maxSpeedVideo == -1) {
Log.d(TAG, "onTakeVideoSuccess 111 abs =" + (Math.abs(minSpeedVideo) / 3.6f))
if (speed >= (Math.abs(minSpeedVideo) / 3.6f)) {
Log.d(TAG, "onTakeVideoSuccess 111 abs =" + (abs(minSpeedVideo) / 3.6f))
if (speed >= (abs(minSpeedVideo) / 3.6f)) {
//获取视频以及缩略图成功,开始上报
compressVideo(videoPath, thumbnailPath, entity)
compressVideo(videoPath, thumbnailPath, it)
}
}
if (minSpeedVideo > 0 && maxSpeedVideo > 0) {
Log.d(TAG, "onTakeVideoSuccess minSpeedVideo > 0 -- speed = $speed")
if ((speed >= (minSpeedVideo / 3.6f)) && speed <= (maxSpeedVideo / 3.6f)) {
compressVideo(videoPath, thumbnailPath, entity)
compressVideo(videoPath, thumbnailPath, it)
}
}
}
@@ -333,7 +343,7 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
}
}
var videoAndThumbMap: MutableMap<String, String> = mutableMapOf()
private var videoAndThumbMap: MutableMap<String, String> = mutableMapOf()
//获取视频失败
override fun onTakeVideoFail(camera: Int) {
@@ -361,7 +371,8 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
entity,
mainInfoId,
mLongitude,
mLatitude
mLatitude,
mSpeed
)
//地图上打点
@@ -377,12 +388,12 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
/**
* 压缩视频并且上传
*/
fun compressVideo(videoPath: String, thumbnailPath: String, entity: TakeEntity) {
private fun compressVideo(videoPath: String, thumbnailPath: String, entity: TakeEntity) {
Log.d(
TAG,
"outputVideoPath = " + outputVideoPath + ">> videoPath=" + videoPath + " isCustom = ${entity?.isCustom}"
"outputVideoPath = " + outputVideoPath + ">> videoPath=" + videoPath + " isCustom = ${entity.isCustom}"
)
var startTime = System.currentTimeMillis()
val startTime = System.currentTimeMillis()
Thread(Runnable {
try {
VideoProcessor.processor(AbsMogoApplication.getApp().applicationContext)
@@ -402,7 +413,8 @@ object CarCorderController : TakePhotoCallback, TakeVideoCallback {
mainInfoId,
mFromType,
mLongitude,
mLatitude
mLatitude,
mSpeed
)
//删除压缩前的视频
deletePicFile(videoPath)

View File

@@ -41,10 +41,11 @@ class CosStatusController : CosStatusCallback {
private var mFromType: String = ""
private var mLongitude: Double = 0.0
private var mLatitude: Double = 0.0
var mSpeed: Float = 0f
//上传文件
fun uploadFile(picPath: MutableList<String?>?, entity: TakeEntity, type: String, mainInfoId: Long,
fromType: String, longitude: Double, latitude: Double) {
fromType: String, longitude: Double, latitude: Double, speed: Float) {
CosCallbackMapController.registerCallback(picPath, this)
// CosLogger.setLogStatus(true)
@@ -54,7 +55,8 @@ class CosStatusController : CosStatusCallback {
this.mFromType = fromType
this.mLongitude = longitude
this.mLatitude = latitude
Log.d(TAG, "uploadFile type===$type ---- mainInfoId =$mainInfoId ----mFromType = $mFromType ---- picPath = $picPath ")
this.mSpeed = speed
Log.d(TAG, "uploadFile type===$type ---- mainInfoId =$mainInfoId ----mFromType = $mFromType ---- picPath = $picPath --speed = $speed")
trackUploadCos(3)
if(picPath == null){
return
@@ -171,7 +173,8 @@ class CosStatusController : CosStatusCallback {
entity,
mainInfoId,
mLongitude,
mLatitude
mLatitude,
mSpeed
)
}
Log.d(TAG, "delete file: $localPath")
@@ -186,7 +189,7 @@ class CosStatusController : CosStatusCallback {
// CosCallbackMapController.mainService?.sendCustomResult(it)
// }
// } else {
sendInformationDirectly(type, map, mType, entity, mainInfoId, mLongitude, mLatitude)
sendInformationDirectly(type, map, mType, entity, mainInfoId, mLongitude, mLatitude, mSpeed)
// }
}
@@ -200,7 +203,8 @@ class CosStatusController : CosStatusCallback {
entity: TakeEntity?,
mainInfoId: Long,
longitude: Double,
latitude: Double
latitude: Double,
speed: Float
) {
Log.d(TAG, "sendInformationDirectly poiType= $poiType ---- mainInfoId= $mainInfoId")
//开始上传
@@ -212,6 +216,7 @@ class CosStatusController : CosStatusCallback {
isCustom = it,
poiType = poiType,
mainInfoId = mainInfoId,
speed = speed,
longitude = longitude,
latitude = latitude
) { success ->

View File

@@ -44,7 +44,7 @@ object InformationUploadController {
it.cosParameter = cosParameter
it.isCustomSend = isCustomSend
it.callback = callback
tryUploadInformation(it)
// tryUploadInformation(it)
}
}
@@ -71,7 +71,7 @@ object InformationUploadController {
it.informationType = informationType
it.newsType = newsType
it.operType = operType
tryUploadInformation(it)
// tryUploadInformation(it)
}
}

View File

@@ -9,8 +9,11 @@ import android.content.Intent
import android.content.IntentFilter
import android.os.IBinder
import android.util.Log
import com.alibaba.android.arouter.launcher.ARouter
import com.elegant.analytics.Analytics
import com.mogo.commons.AbsMogoApplication
import com.mogo.service.IMogoServiceApis
import com.mogo.service.MogoServicePaths
import com.mogo.utils.logger.Logger
import com.mogo.utils.storage.SharedPrefsMgr
import com.zhidao.cosupload.manager.CosUploadManagerImpl
@@ -41,6 +44,7 @@ class MainService : Service() {
companion object {
fun launchService(context: Context, params: UploadParams?) {
val intent = Intent(context, MainService::class.java).apply {
Log.e("MainService", "launchService type = $params")
putExtra("params", params)
@@ -63,11 +67,13 @@ class MainService : Service() {
var shareType: String = "type"
var fromType: String = ""
var isCustom: Boolean = false
var speed: Float = 0f
var params: UploadParams? = null
var mainInfoId: Long = 0
private var mLongitude: Double = 0.0
private var mLatitude: Double = 0.0
lateinit var serviceApis: IMogoServiceApis
//发送主动上报结果广播给外部
// fun sendCustomResult(result: Boolean) {
@@ -87,7 +93,9 @@ class MainService : Service() {
.init(BuildConfig.APPLICATION_ID, 0)
//初始化语音
VoiceController.initVoice()
serviceApis = ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS).navigation(this) as IMogoServiceApis
speed = serviceApis.getMapServiceApi().getSingletonLocationClient(this).getLastKnowLocation().getSpeed()
Log.d(TAG, "onStartCommand speed = $speed" )
if (intent != null) {
params = intent.getParcelableExtra("params")
params?.let {
@@ -292,7 +300,7 @@ class MainService : Service() {
Observable.intervalRange(0, 1, 0, 2_000, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
CarCorderController.takePhoto(1, 1, false, isCustom, TANLU_ROAD_CURRENT, mainInfoId, fromType, mLongitude, mLatitude)
CarCorderController.takePhoto(1, 1, false, isCustom, TANLU_ROAD_CURRENT, mainInfoId, fromType, mLongitude, mLatitude, speed)
})
// }
@@ -311,7 +319,7 @@ class MainService : Service() {
Log.d("MainService", "takeVideo --------1---->")
// if (isAuthorization(BaseApplication.getAppContext())) {
// log(TAG, "takeVideo --------2---->")
CarCorderController.takeVideo(1, duration, isCustom, id, shareType, mainInfoId, fromType, mLongitude, mLatitude)
CarCorderController.takeVideo(1, duration, isCustom, id, shareType, mainInfoId, fromType, mLongitude, mLatitude, speed)
// }
postVideoAlarmTask(isInterval)

View File

@@ -231,6 +231,7 @@ class MainServiceController {
isShare:Boolean = false,
poiType:String,
mainInfoId:Long,
speed: Float,
longitude: Double,
latitude: Double,
customSend: ((Boolean) -> Unit)? = null
@@ -244,10 +245,10 @@ class MainServiceController {
if (locationInfo.address.isNullOrEmpty()) {
Log.d(TAG, " sendInformationMessage locationInfo.address = $locationInfo.address")
trackUploadGeo(1)
geoLocation(type, url, locationInfo, isCustom,trafficInfoType, isShare, customSend,poiType,mainInfoId,longitude,latitude)
geoLocation(type, url, locationInfo, isCustom,trafficInfoType, isShare, customSend,poiType,mainInfoId,speed, longitude,latitude)
} else {
postInformationMessage(
getInformationBody(type, url, locationInfo, isCustom, trafficInfoType, isShare,poiType,mainInfoId,longitude,latitude),
getInformationBody(type, url, locationInfo, isCustom, trafficInfoType, isShare,poiType,mainInfoId,longitude,latitude, speed),
customSend
)
}
@@ -265,6 +266,7 @@ class MainServiceController {
customSend: ((Boolean) -> Unit)? = null,
poiType: String,
mainInfoId: Long,
speed: Float,
longitude: Double,
latitude: Double
) {
@@ -273,20 +275,20 @@ class MainServiceController {
.geoCodeLocation(locationInfo.toLatLngPoint(), {
Log.d(TAG, "geoLocation -------start -->")
postInformationMessage(
getInformationBody(type, url, locationInfo, isCustom, trafficInfoType, isShare, poiType,mainInfoId,longitude,latitude),
getInformationBody(type, url, locationInfo, isCustom, trafficInfoType, isShare, poiType,mainInfoId,longitude,latitude, speed),
customSend
)
}, {
//转换失败的情况下再重试一次
Log.d(TAG, "geoLocation -------true-->")
geoRetryed = if (!geoRetryed) {
geoLocation(type, url, locationInfo, isCustom, trafficInfoType, isShare, customSend, poiType,mainInfoId,longitude,latitude)
geoLocation(type, url, locationInfo, isCustom, trafficInfoType, isShare, customSend, poiType,mainInfoId,speed, longitude,latitude)
true
} else {
//如果两次都失败,直接上报服务端
Log.d(TAG, "geoLocation ---- postInformationMessage ---false-->")
postInformationMessage(
getInformationBody(type, url, locationInfo, isCustom, trafficInfoType, isShare, poiType,mainInfoId,longitude,latitude),
getInformationBody(type, url, locationInfo, isCustom, trafficInfoType, isShare, poiType,mainInfoId,longitude,latitude,speed),
customSend
)

View File

@@ -32,7 +32,8 @@ fun getInformationBody(
poiType: String,
mainInfoId: Long,
longitude: Double,
latitude: Double
latitude: Double,
speed: Float
): InformationBody {
var jsonArray = JsonArray()
var type: Int
@@ -70,7 +71,8 @@ fun getInformationBody(
isShare,
locationInfo.direction,
poiType,
mainInfoId
mainInfoId,
speed
)
}

View File

@@ -23,7 +23,7 @@ public class MainIndependentActivity extends MainActivity {
protected void onCreate( @Nullable Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
// 独立app需要在onCreate里面增加处理scheme的情况
mPresenter.handleSchemeIntent( getIntent() );
mPresenter.handleSchemeIntent( getIntent(), false );
}
@Override

View File

@@ -5,6 +5,7 @@ import android.view.Gravity;
import android.view.WindowManager;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.wm.WindowManagerView;
import com.mogo.service.IMogoServiceApis;
@@ -15,6 +16,9 @@ public class BackToMainHomeManager {
private static final String TAG = "BackToMainHomeManager";
public static void backToLauncher() {
if (!DebugConfig.isLauncher()) {
return;
}
Intent intent2 = new Intent();
// 是否发自系统消息

View File

@@ -30,6 +30,8 @@ public class MarkerExploreWay implements Serializable {
//上报类型1-用户上报2-后台上报 3-三方上报
private String uploadType;
private boolean fabulous;
// http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=42321443
// 1 需要用户判断是否拥堵 进行UGC问答
private int infoCheckNode;
@@ -200,6 +202,14 @@ public class MarkerExploreWay implements Serializable {
this.infoCheckNode = infoCheckNode;
}
public boolean isFabulous() {
return fabulous;
}
public void setFabulous(boolean fabulous) {
this.fabulous = fabulous;
}
@Override
public String toString() {
return "MarkerExploreWay{" +
@@ -218,6 +228,7 @@ public class MarkerExploreWay implements Serializable {
", userInfo=" + userInfo +
", items=" + items +
", uploadType='" + uploadType + '\'' +
", fabulous=" + fabulous +
", infoCheckNode=" + infoCheckNode +
'}';
}

View File

@@ -0,0 +1,51 @@
package com.mogo.module.common.entity;
import com.mogo.utils.sqlite.annotation.DbDatabase;
import com.mogo.utils.sqlite.annotation.DbField;
import com.mogo.utils.sqlite.annotation.DbTable;
/**
* V2X 被点赞的事件
*
* @author donghongyu
*/
@DbDatabase(dbName = "MoGoScenario.db")
@DbTable(tableName = "tb_event_zan")
public class V2XEventZanData {
/**
* 事件ID
*/
@DbField(fieldName = "eventId")
public String eventId;
/**
* 触发时间
*/
@DbField(fieldName = "triggerTime")
public Long triggerTime;
public String getEventId() {
return eventId;
}
public void setEventId(String eventId) {
this.eventId = eventId;
}
public Long getTriggerTime() {
return triggerTime;
}
public void setTriggerTime(Long triggerTime) {
this.triggerTime = triggerTime;
}
@Override
public String toString() {
return "V2XEventZanData{" +
"eventId=" + eventId +
", triggerTime=" + triggerTime +
'}';
}
}

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

@@ -3,4 +3,5 @@
<color name="module_commons_dlg_bkg">#7f000000</color>
<color name="module_commons_wm_dialog_text_textColor">#FFFFFF</color>
<color name="v2x_FFF_666">#FFFFFF</color>
<color name="module_commons_FFF_333">#FFFFFF</color>
</resources>

View File

@@ -146,8 +146,8 @@
android:background="@drawable/module_ext_dw_common_corner_bkg"
android:gravity="center"
android:text="前方\n实况"
android:textColor="#FFFFFF"
android:textSize="@dimen/module_ext_navi_exit_textSize"
android:textColor="@color/module_commons_FFF_333"
android:textSize="@dimen/v2x_cancel_help_text_size"
android:textStyle="bold"
android:visibility="gone"
tools:visibility="visible" />
@@ -160,8 +160,8 @@
android:background="@drawable/module_ext_dw_common_corner_bkg"
android:gravity="center"
android:text="取消\n求助"
android:textColor="#FFFFFF"
android:textSize="@dimen/module_ext_navi_exit_textSize"
android:textColor="@color/module_commons_FFF_333"
android:textSize="@dimen/v2x_cancel_help_text_size"
android:textStyle="bold"
android:visibility="gone"
tools:visibility="visible" />

View File

@@ -52,6 +52,7 @@
<dimen name="module_ext_button_container_marginLeft">32px</dimen>
<dimen name="module_ext_button_container_marginBottom">60px</dimen>
<dimen name="module_ext_navi_exit_textSize">32px</dimen>
<dimen name="v2x_cancel_help_text_size">30px</dimen>
<dimen name="module_entrance_id_button_marginTop">20px</dimen>
<!-- module_ext_layout_extensions.xml-->

View File

@@ -52,6 +52,7 @@
<dimen name="module_ext_button_container_marginLeft">32px</dimen>
<dimen name="module_ext_button_container_marginBottom">60px</dimen>
<dimen name="module_ext_navi_exit_textSize">32px</dimen>
<dimen name="v2x_cancel_help_text_size">30px</dimen>
<dimen name="module_entrance_id_button_marginTop">20px</dimen>
<!-- module_ext_layout_extensions.xml-->

View File

@@ -53,6 +53,7 @@
<dimen name="module_ext_button_container_marginLeft">20px</dimen>
<dimen name="module_ext_button_container_marginBottom">30px</dimen>
<dimen name="module_ext_navi_exit_textSize">16px</dimen>
<dimen name="v2x_cancel_help_text_size">14px</dimen>
<dimen name="module_entrance_id_button_marginTop">8px</dimen>
<!-- module_ext_layout_extensions.xml-->
@@ -60,7 +61,7 @@
<dimen name="module_ext_paddingRight">32px</dimen>
<dimen name="module_ext_paddingLeft">32px</dimen>
<dimen name="module_ext_notice_margin_start">78px</dimen>
<dimen name="module_ext_notice_margin_start">0px</dimen>
<dimen name="module_ext_voice_textSize">22px</dimen>
<dimen name="module_ext_time_textSize">28px</dimen>
@@ -171,4 +172,5 @@
<dimen name="module_ext_seek_help_notice_text_margin_start">10px</dimen>
<dimen name="module_ext_seek_help_notice_number_text_size">22px</dimen>
<dimen name="module_ext_seek_help_notice_bg_margin_top">16px</dimen>
</resources>

View File

@@ -43,6 +43,7 @@ class GuideFragment : MvpFragment<GuideConstract.View, GuidePresenter>(), GuideC
adapter = GuideAdapter(this)
moduleGuideViewPager.adapter = adapter
(moduleGuideViewPager.getChildAt(0) as RecyclerView).layoutManager!!.isItemPrefetchEnabled = false
@Suppress("DEPRECATION")
moduleGuideIndicator.setSliderColor(context!!.resources.getColor(R.color.module_guide_indicator_dark), context!!.resources.getColor(R.color.module_guide_indicator_white))
.setSliderWidth(context!!.resources.getDimension(R.dimen.dp_22))
.setSlideMode(IndicatorSlideMode.NORMAL)

View File

@@ -30,6 +30,7 @@ class GuideStageFiveFragment : MvpFragment<IView, Presenter<IView>> {
override fun initViews() {
if(!DebugConfig.isLauncher()){
@Suppress("DEPRECATION")
moduleGuidePageFive.background = context!!.resources!!.getDrawable(R.mipmap.module_guide_item_stage_five)
}
}

View File

@@ -30,6 +30,7 @@ class GuideStageFourFragment : MvpFragment<IView, Presenter<IView>> {
override fun initViews() {
if(!DebugConfig.isLauncher()){
@Suppress("DEPRECATION")
moduleGuidePageFour.background = context!!.resources!!.getDrawable(R.mipmap.module_guide_item_stage_four)
}
}

View File

@@ -31,6 +31,7 @@ class GuideStageOneFragment : MvpFragment<IView, Presenter<IView>> {
override fun initViews() {
containerFragment?.visibleRight()
if(!DebugConfig.isLauncher()){
@Suppress("DEPRECATION")
moduleGuidePageOne.background = context!!.resources!!.getDrawable(R.mipmap.module_guide_item_stage_one)
}
}

View File

@@ -30,6 +30,7 @@ class GuideStageThreeFragment : MvpFragment<IView, Presenter<IView>> {
override fun initViews() {
if(!DebugConfig.isLauncher()){
@Suppress("DEPRECATION")
moduleGuidePageThree.background = context!!.resources!!.getDrawable(R.mipmap.module_guide_item_stage_three)
}
}

View File

@@ -30,6 +30,7 @@ class GuideStageTwoFragment : MvpFragment<IView, Presenter<IView>> {
override fun initViews() {
if(!DebugConfig.isLauncher()){
@Suppress("DEPRECATION")
moduleGuidePageTwo.background = context!!.resources!!.getDrawable(R.mipmap.module_guide_item_stage_two)
}
}

View File

@@ -1,3 +1,5 @@
@file:Suppress("DEPRECATION")
package com.zhidao.mogo.module.left.panel
import android.content.Context

View File

@@ -334,7 +334,7 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
@Override
protected void onNewIntent( Intent intent ) {
super.onNewIntent( intent );
mPresenter.handleSchemeIntent( intent );
mPresenter.handleSchemeIntent( intent, true );
}
@Override

View File

@@ -61,8 +61,8 @@ public class MainPresenter extends Presenter< MainView > {
mMsgHandler.sendMessageDelayed( msg, 100 );
}
public void handleSchemeIntent( Intent intent ) {
SchemeIntent.getInstance().handle( intent );
public void handleSchemeIntent( Intent intent, boolean isOnNewIntent ) {
SchemeIntent.getInstance().handle( intent, isOnNewIntent );
}
public void initADAS(){

View File

@@ -88,7 +88,12 @@ public class SchemeIntent implements IMogoStatusChangedListener {
}
public void handle( Intent intent ) {
/**
* 处理scheme
* @param intent 跳转的intent
* @param isOnNewIntent 根据这个参数判断是从onCreate过来还是从onNewIntent过来从而可以在{@link #isDelay(Intent, boolean)}里面确定延时逻辑如果是从onNewIntent过来是不需要延时的
*/
public void handle( Intent intent, boolean isOnNewIntent ) {
if ( intent == null || intent.getData() == null ) {
return;
}
@@ -100,8 +105,8 @@ public class SchemeIntent implements IMogoStatusChangedListener {
if ( !mApis.getStatusManagerApi().isMainPageOnResume() ) {
long delay = 0L;
if ( isNaviIntent( intent ) ) {
delay = 2_000L;
if ( isDelay( intent, isOnNewIntent ) ) {
delay = 5_000L;
}
mNextIntent = new IntentWrapper( intent, delay );
mApis.getLauncherApi().backToLauncher( mContext );
@@ -127,13 +132,13 @@ public class SchemeIntent implements IMogoStatusChangedListener {
mNextIntent = null;
}
private boolean isNaviIntent( Intent intent ) {
if ( intent == null || intent.getData() == null ) {
private boolean isDelay(Intent intent, boolean isOnNewIntent ) {
if ( isOnNewIntent || intent == null || intent.getData() == null ) {
return false;
}
Uri target = intent.getData();
String type = target.getQueryParameter( "type" );
return TextUtils.equals( TYPE_NAVI, type );
return TextUtils.equals(TYPE_NAVI, type) || TextUtils.equals(TYPE_SHOW_SHARE_PANEL, type);
}
private void handleSwitch2Action( Uri target ) {
@@ -225,7 +230,7 @@ public class SchemeIntent implements IMogoStatusChangedListener {
if ( mNextIntent == null ) {
return;
}
handle( mNextIntent.mIntent );
handle( mNextIntent.mIntent, false );
}, mNextIntent.mDelay );
}
}

View File

@@ -5,6 +5,7 @@ import android.text.TextUtils;
import com.mogo.map.navi.MogoNaviConfig;
import com.mogo.map.uicontroller.EnumMapUI;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.service.intent.IMogoIntentListener;
import com.mogo.service.intent.IMogoIntentManager;
import com.mogo.utils.logger.Logger;
@@ -20,15 +21,21 @@ class AutoNaviBroadcastIntentHandler implements IMogoIntentListener {
public static final String TAG = "AutoNaviBroadcastReceiver";
// 发送高德:部分是小智语音发给高德的,这里顺便接收处理,都是历史遗留问题
public static final String AUTONAVI_STANDARD_BROADCAST_RECV = "AUTONAVI_STANDARD_BROADCAST_RECV";
// 接收高德
public static final String AUTONAVI_STANDARD_BROADCAST_SEND = "AUTONAVI_STANDARD_BROADCAST_SEND";
public void register( IMogoIntentManager manager ) {
manager.registerIntentListener( AUTONAVI_STANDARD_BROADCAST_RECV, this );
manager.registerIntentListener( AUTONAVI_STANDARD_BROADCAST_SEND, this );
}
public void unregister(IMogoIntentManager manager ) {
public void unregister( IMogoIntentManager manager ) {
mCallback = null;
manager.unregisterIntentListener( AUTONAVI_STANDARD_BROADCAST_RECV, this );
manager.unregisterIntentListener( AUTONAVI_STANDARD_BROADCAST_SEND, this );
}
private OnMapControlCallback mCallback;
@@ -47,7 +54,8 @@ class AutoNaviBroadcastIntentHandler implements IMogoIntentListener {
Logger.d( TAG, "action = %s, keyType=%s, type=%s, operType=%s", action, keyType, type, operaType );
if ( !TextUtils.equals( action, AUTONAVI_STANDARD_BROADCAST_RECV ) ) {
if ( !TextUtils.equals( action, AUTONAVI_STANDARD_BROADCAST_RECV )
&& !TextUtils.equals( action, AUTONAVI_STANDARD_BROADCAST_SEND ) ) {
return;
}
@@ -68,6 +76,9 @@ class AutoNaviBroadcastIntentHandler implements IMogoIntentListener {
}
}
} else if ( keyType == 10048 ) {
if ( !intent.getBooleanExtra( "callback", true ) ) {
return;
}
//0自动; 1白天; 2黑夜;
int dayNightMode = intent.getIntExtra( "EXTRA_DAY_NIGHT_MODE", -1 );
if ( dayNightMode == 0 ) {
@@ -117,6 +128,16 @@ class AutoNaviBroadcastIntentHandler implements IMogoIntentListener {
.highSpeed( prefer == 20 )
.avoidSpeed( prefer == 3 );
mCallback.onReCalculatePath( config );
} else if ( keyType == 10019 ) {
int extraState = intent.getIntExtra( "EXTRA_STATE", -1 );
// 高德改变黑夜白天模式后传递给launcher顺便改变其他
if ( extraState == 37 ) {
// 白天模式
MogoApisHandler.getInstance().getApis().getAdasControllerApi().changeAdasControlMode( EnumMapUI.Type_Light );
} else if ( extraState == 38 ) {
// 夜间模式
MogoApisHandler.getInstance().getApis().getAdasControllerApi().changeAdasControlMode( EnumMapUI.Type_Night );
}
}
}
}

View File

@@ -1,5 +1,8 @@
package com.mogo.module.map;
import android.content.Intent;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.map.uicontroller.EnumMapUI;
import com.mogo.utils.logger.Logger;
@@ -52,6 +55,7 @@ class MapControlCommandHandler {
case VoiceConstants.CMD_MAP_DAY_TIME_MODE_UN_WAKEUP:
case VoiceConstants.CMD_MAP_DAY_TIME_MODE:
mCallback.onDayNightModeChanged( EnumMapUI.Type_Light );
notifyAMap( EnumMapUI.Type_Light );
break;
case VoiceConstants.CMD_MAP_HISTORY_UN_WAKEUP:
case VoiceConstants.CMD_MAP_HISTORY:
@@ -63,10 +67,12 @@ class MapControlCommandHandler {
case VoiceConstants.CMD_MAP_NIGHT_MODE_UN_WAKEUP:
case VoiceConstants.CMD_MAP_NIGHT_MODE:
mCallback.onDayNightModeChanged( EnumMapUI.Type_Night );
notifyAMap( EnumMapUI.Type_Night );
break;
case VoiceConstants.CMD_MAP_AUTO_LIGHT_NIGHT_MODE_UN_WAKEUP:
case VoiceConstants.CMD_MAP_AUTO_LIGHT_NIGHT_MODE:
mCallback.onDayNightModeChanged( EnumMapUI.Type_AUTO_LIGHT_Night );
notifyAMap( EnumMapUI.Type_AUTO_LIGHT_Night );
break;
case VoiceConstants.CMD_MAP_DISPLAY_OVERVIEW_MODE:
mCallback.onDisplayOverview();
@@ -91,4 +97,34 @@ class MapControlCommandHandler {
}
}
public void notifyAMap( EnumMapUI ui ) {
if ( ui == null ) {
return;
}
int KEY_TYPE = 10048;
int state = 0;//2黑夜;1白天 ;0自动
switch ( ui ) {
case Type_Light:
state = 1;
break;
case Type_Night:
state = 2;
break;
case Type_AUTO_LIGHT_Night:
state = 0;
break;
default:
return;
}
Intent intent = new Intent();
intent.setAction( "AUTONAVI_STANDARD_BROADCAST_RECV" );
intent.putExtra( "KEY_TYPE", KEY_TYPE );
intent.setFlags( Intent.FLAG_INCLUDE_STOPPED_PACKAGES );
// 避免在内部再次调用
intent.putExtra( "callback", false );
intent.putExtra( "EXTRA_DAY_NIGHT_MODE", state );
AbsMogoApplication.getApp().sendBroadcast( intent );
}
}

View File

@@ -81,7 +81,6 @@ public class MapPresenter extends Presenter< MapView > implements
public MapPresenter( MapView view ) {
super( view );
}
@Override
@@ -104,6 +103,7 @@ public class MapPresenter extends Presenter< MapView > implements
@Override
public void onMapUiModeChanged( EnumMapUI mapUI ) {
mView.getUIController().changeMapMode( mapUI );
mCustomVoiceCommandHandler.notifyAMap( mapUI );
}
@Override

View File

@@ -1,3 +1,5 @@
@file:Suppress("DEPRECATION")
package com.mogo.module.push.utils
import android.util.ArrayMap

View File

@@ -2,6 +2,7 @@ package com.mogo.module.push.view
import android.animation.Animator
import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.PixelFormat
import android.os.Build
@@ -87,7 +88,7 @@ class FloatView constructor(
}
private fun turnNextMessage() {
pushViewModel?.pushBean?.apply {
pushViewModel.pushBean?.apply {
showTimeout = 0
updateTimer()
}
@@ -123,17 +124,17 @@ class FloatView constructor(
pushTimer.text = if (bean.showTimeout > 99) "" else "${bean.showTimeout}s"
// image
if (bean.imageUrl.isNullOrEmpty() && bean.QRCode.isNullOrEmpty()) {
if (bean.imageUrl.isEmpty() && bean.QRCode.isEmpty()) {
pushImage.gone()
} else if (!bean.imageUrl.isNullOrEmpty()) {
var params = pushImage.layoutParams
} else if (bean.imageUrl.isNotEmpty()) {
val params = pushImage.layoutParams
params.width = getImgWidth()
params.height = getImgHeight()
pushImage.layoutParams = params
pushImage.visible()
GlideApp.with(this).load(bean.imageUrl).into(pushImage)
} else if (!bean.QRCode.isNullOrEmpty()) {
var params = pushImage.layoutParams
} else if (bean.QRCode.isNotEmpty()) {
val params = pushImage.layoutParams
params.width = getQrImgWidth()
params.height = getQrImgHeight()
pushImage.layoutParams = params
@@ -167,7 +168,7 @@ class FloatView constructor(
}
// content
if (bean.content.isNullOrEmpty()) {
if (bean.content.isEmpty()) {
pushContent.gone()
} else {
pushContent.text = bean.content
@@ -175,7 +176,7 @@ class FloatView constructor(
}
// tts
if (!bean?.tts?.isNullOrEmpty()) {
if (bean.tts.isNotEmpty()) {
AIAssist.getInstance(context).speakTTSVoice(bean.tts)
}
}
@@ -185,6 +186,7 @@ class FloatView constructor(
abstract fun getQrImgWidth(): Int
abstract fun getQrImgHeight(): Int
@SuppressLint("SetTextI18n")
override fun timer(time: Int) {
Logger.d(TAG, "time = $time")
pushTimer.text = "${time}s"
@@ -211,7 +213,7 @@ class FloatView constructor(
private var topViewStatusListener = object : IMogoTopViewStatusListener {
override fun onViewRemoved(view: View?) {
isAddWindow = false
if (pushViewModel?.pushBean?.showTimeout ?: 0 > 0) {
if (pushViewModel.pushBean?.showTimeout ?: 0 > 0) {
if (getApis(context).statusManagerApi.isV2XShow) {
// 被中断的消息,需要再次被显示一次
uiHandler.removeCallbacks(delayClosePush)
@@ -332,7 +334,7 @@ class FloatView constructor(
override fun setBean(bean: PushBean) {
super.setBean(bean)
var paddingBottom: Int = 0
var paddingBottom = 0
if (pushButton.isVisible) {
paddingBottom =
context.resources.getDimensionPixelSize(R.dimen.module_push_content_paddingBottom_vertical)
@@ -467,7 +469,7 @@ class FloatView constructor(
private fun updateTimer() {
uiHandler.removeCallbacks(delayClosePush)
var time = pushViewModel.pushBean?.showTimeout ?: 0
val time = pushViewModel.pushBean?.showTimeout ?: 0
if (time > 0) {
pushViewModel.pushBean!!.showTimeout--
pushViewController?.timer(time)

View File

@@ -81,7 +81,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB
}
override fun onCalculateSuccess() {
var calculatedStrategies = SearchApisHolder.getNaviApis().calculatedStrategies
val calculatedStrategies = SearchApisHolder.getNaviApis().calculatedStrategies
if (calculatedStrategies != null && calculatedStrategies.size > 0) {
mAdapter.setDatas(calculatedStrategies)
mAdapter.selectTag = calculatedStrategies[0].tagId
@@ -143,14 +143,14 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB
return R.layout.fragment_search_category
}
var mogoTip: MogoLatLng? = null
private var mogoTip: MogoLatLng? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mogoTip = arguments?.getParcelable<MogoLatLng>(AMapConstants.KEY_PARCELABLE)
mogoTip = arguments?.getParcelable(AMapConstants.KEY_PARCELABLE)
}
// 是否开启导航
var isStartedNavi = false
private var isStartedNavi = false
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -167,7 +167,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB
SearchApisHolder.getRegisterCenterApis().registerMogoNaviListener(AMapConstants.PATH_FRAGMENT_CHOOSE_PATH, this)
var arrayList = ArrayList<MogoCalculatePath>()
val arrayList = ArrayList<MogoCalculatePath>()
mAdapter = CalculatePathAdapter(activity, arrayList)
rv_search_result.layoutManager = LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false)
@@ -185,7 +185,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB
}
mAdapter.setOnClickListener {
var item = it.getTag(R.id.tag_item) as MogoCalculatePath
val item = it.getTag(R.id.tag_item) as MogoCalculatePath
selectPath(item)
}
@@ -202,7 +202,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB
}
private fun registerRetryVoice() {
AIAssist.getInstance(context).registerUnWakeupCommand("retry", arrayOf<String>("重试"), this)
AIAssist.getInstance(context).registerUnWakeupCommand("retry", arrayOf("重试"), this)
}
private fun unregisterRetryVoice() {
@@ -229,7 +229,7 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB
private fun selectPath(item: MogoCalculatePath?) {
item?.let {
mAdapter.setSelectTag(item.tagId)
mAdapter.selectTag = item.tagId
if (SearchApisHolder.getNaviApis().itemClickInteraction != null) {
SearchApisHolder.getNaviApis().itemClickInteraction.onItemClicked(item.tagId)
}
@@ -265,11 +265,10 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB
}
private fun choosePath(intent: Intent?) {
var dataJsonStr = intent?.getStringExtra("data") ?: ""
val dataJsonStr = intent?.getStringExtra("data") ?: ""
try {
var jsonObj = JSONObject(dataJsonStr)
var routePlan = jsonObj.optString("route_choice", " ")
when (routePlan) {
val jsonObj = JSONObject(dataJsonStr)
when (jsonObj.optString("route_choice", " ")) {
"fastest" -> {
// 时间最短
selectItem(mTimeShortestPosition)
@@ -282,19 +281,18 @@ class ChoosePathFragment : BaseFragment(), IMogoNaviListener, IMogoVoiceCmdCallB
}
}
} catch (e: Exception) {
e.printStackTrace()
}
}
companion object {
@JvmField
val TAG: String = "ChoosePathFragment"
const val TAG: String = "ChoosePathFragment"
fun newInstance(searchPoi: MogoLatLng): Fragment {
var bundle = Bundle()
val bundle = Bundle()
bundle.putParcelable(AMapConstants.KEY_PARCELABLE, searchPoi)
var choosePathFragment = ChoosePathFragment()
val choosePathFragment = ChoosePathFragment()
choosePathFragment.arguments = bundle
return choosePathFragment
}

View File

@@ -160,7 +160,7 @@ class LauncherCardRefresher {
private ZhidaoRefreshModel mZhidaoRefreshModel;
private LauncherCardRefreshStrategy mExplorerWayOrOnlineCarDataStrategy = new LauncherCardRefreshStrategy(
40 * ONE_MINUTE, null, MSG_EXPLORER_WAY_OR_ONLINE_CAR_DATA
18 * ONE_MINUTE, null, MSG_EXPLORER_WAY_OR_ONLINE_CAR_DATA
);
private LauncherCardRefreshStrategy mInduceStrategy = new LauncherCardRefreshStrategy(
18 * ONE_MINUTE, mExplorerWayOrOnlineCarDataStrategy, MSG_INDUCE
@@ -190,7 +190,6 @@ class LauncherCardRefresher {
}
mHandler.sendEmptyMessageDelayed( MSG_LOAD_NET_CONFIG, delay );
startInduceStrategy();
SharedPrefsMgr.getInstance( mContext ).putLong( KEY_LauncherCardTipLastTipTime, System.currentTimeMillis() );
}
/**
@@ -218,6 +217,9 @@ class LauncherCardRefresher {
if ( !mStart ) {
return;
}
if ( mRefreshStrategy == null ) {
return;
}
mRefreshStop = false;
mHandler.removeMessages( mRefreshStrategy.getMsgType() );
mHandler.sendEmptyMessageDelayed( mRefreshStrategy.getMsgType(), mRefreshStrategy.getInterval() );
@@ -238,7 +240,9 @@ class LauncherCardRefresher {
}
private void startNextRefreshStrategy() {
mRefreshStrategy = mRefreshStrategy.getNext();
if ( mRefreshStrategy != null ) {
mRefreshStrategy = mRefreshStrategy.getNext();
}
restart();
}
@@ -394,12 +398,8 @@ class LauncherCardRefresher {
return;
}
if ( mDefaultConfigCounter++ >= 1 ) {
return;
}
int counter = SharedPrefsMgr.getInstance( mContext ).getInt( KEY_LauncherCardTipCounter, 0 );
if ( counter >= 5 ) {
if ( counter >= 1 ) {
long lastTipTime = SharedPrefsMgr.getInstance( mContext ).getLong( KEY_LauncherCardTipLastTipTime, 0L );
if ( System.currentTimeMillis() - lastTipTime < 7 * ONE_DAY ) {
return;
@@ -417,6 +417,9 @@ class LauncherCardRefresher {
} catch ( Exception e ) {
e.printStackTrace();
}
if ( mDefaultConfigCounter++ >= 1 ) {
return;
}
startLoopDefaultConfigStrategy();
}

View File

@@ -1008,9 +1008,9 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
switch ( mapUI ) {
case Type_Light:
case Type_Night:
if ( !AppUtils.isAppForeground( mContext ) ) {
return;
}
// if ( !AppUtils.isAppForeground( mContext ) ) {
// return;
// }
if ( mLastDataResult != null ) {
runOnTargetThread( () -> {
MarkerServiceHandler.getMarkerManager().removeMarkers( ModuleNames.CARD_TYPE_ROAD_CONDITION );

View File

@@ -24,6 +24,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/module_services_panel_item_nickname_marginLeft"
android:layout_marginTop="@dimen/module_services_panel_item_nickname_marginTop"
android:textColor="@color/module_services_panel_item_nickname_textColor"
android:textSize="@dimen/module_services_panel_item_nickname_textSize"
android:textStyle="bold"
@@ -37,6 +38,7 @@
android:layout_height="wrap_content"
android:textColor="@color/module_services_panel_item_distance_textColor"
android:textSize="@dimen/module_services_panel_item_distance_textSize"
android:layout_marginBottom="@dimen/module_services_panel_item_distance_tag_marginBottom"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="@+id/module_services_id_panel_item_nickname"
android:text="@string/module_services_panel_item_distance_tag_text" />
@@ -49,7 +51,7 @@
android:textColor="@color/module_services_panel_item_nickname_textColor"
android:textSize="@dimen/module_services_panel_item_distance_textSize"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toBottomOf="@+id/module_services_id_panel_item_distance_tag"
app:layout_constraintLeft_toRightOf="@+id/module_services_id_panel_item_distance_tag"
tools:text="980M" />

View File

@@ -53,4 +53,6 @@
<dimen name="module_services_empty_tip_marginTop">17px</dimen>
<dimen name="module_services_panel_strategy_button_marginTop">60px</dimen>
<dimen name="module_services_panel_item_corner">12.5px</dimen>
<dimen name="module_services_panel_item_nickname_marginTop">3px</dimen>
<dimen name="module_services_panel_item_distance_tag_marginBottom">3px</dimen>
</resources>

View File

@@ -53,4 +53,6 @@
<dimen name="module_services_empty_tip_marginTop">28px</dimen>
<dimen name="module_services_panel_strategy_button_marginTop">108px</dimen>
<dimen name="module_services_panel_item_corner">12.5px</dimen>
<dimen name="module_services_panel_item_nickname_marginTop">3px</dimen>
<dimen name="module_services_panel_item_distance_tag_marginBottom">3px</dimen>
</resources>

View File

@@ -53,4 +53,6 @@
<dimen name="module_services_empty_tip_marginTop">17px</dimen>
<dimen name="module_services_panel_strategy_button_marginTop">108px</dimen>
<dimen name="module_services_panel_item_corner">22.5px</dimen>
<dimen name="module_services_panel_item_nickname_marginTop">6px</dimen>
<dimen name="module_services_panel_item_distance_tag_marginBottom">6px</dimen>
</resources>

View File

@@ -53,4 +53,6 @@
<dimen name="module_services_empty_tip_marginTop">28px</dimen>
<dimen name="module_services_panel_strategy_button_marginTop">60px</dimen>
<dimen name="module_services_panel_item_corner">22.5px</dimen>
<dimen name="module_services_panel_item_nickname_marginTop">6px</dimen>
<dimen name="module_services_panel_item_distance_tag_marginBottom">6px</dimen>
</resources>

View File

@@ -53,4 +53,6 @@
<dimen name="module_services_empty_tip_marginTop">17px</dimen>
<dimen name="module_services_panel_strategy_button_marginTop">60px</dimen>
<dimen name="module_services_panel_item_corner">12.5px</dimen>
<dimen name="module_services_panel_item_nickname_marginTop">3px</dimen>
<dimen name="module_services_panel_item_distance_tag_marginBottom">3px</dimen>
</resources>

View File

@@ -91,6 +91,8 @@ import static com.mogo.service.share.IMogoTanluProvider.TYPE_TRAFFIC_CHECK;
@Route(path = MogoServicePaths.PATH_SHARE)
public class ShareControl implements IMogoShareManager, Handler.Callback {
private static final String TAG = "ShareControl";
// private static final int MSG_REAL_QUERY_SHARE_CONFIG = 1001;
// private static final long QUERY_SHARE_CONFIG_DELAY = 3_000L;
private Context mContext;
// private LaucherShareDialog mShareDialog;
@@ -441,10 +443,13 @@ public class ShareControl implements IMogoShareManager, Handler.Callback {
}
private void queryShareButtonConfig() {
if (NetworkUtils.isConnected(mContext)) {
// 有网,直接请求
MogoLocation location =
ServiceApisManager.serviceApis.getMapServiceApi().getSingletonLocationClient(mContext).getLastKnowLocation();
if (handler.hasMessages(MSG_QUERY_SHARE_CONFIG_RETRY)) {
return;
}
MogoLocation location =
ServiceApisManager.serviceApis.getMapServiceApi().getSingletonLocationClient(mContext).getLastKnowLocation();
if (NetworkUtils.isConnected(mContext) && location != null && !location.getAdCode().isEmpty()) {
// 有网且有adcode直接请求
Map<String, String> params = new ArrayMap<>();
ShareConfigRequest request = new ShareConfigRequest(Utils.getSn(),
location.getAdCode());
@@ -498,6 +503,7 @@ public class ShareControl implements IMogoShareManager, Handler.Callback {
private static final int QUERY_SHARE_CONFIG_RETRY_TIME_THRESHOLD = 10;
private void retryQueryShareConfig() {
Logger.d(TAG, "retryQueryShareConfig====" + queryShareConfigRetryTime);
if (queryShareConfigRetryTime > QUERY_SHARE_CONFIG_RETRY_TIME_THRESHOLD) {
// 重试次数超过QUERY_SHARE_CONFIG_RETRY_TIME_THRESHOLD不再重试
return;

View File

@@ -1,3 +1,5 @@
@file:Suppress("DEPRECATION")
package com.mogo.module.share
import android.content.Context

View File

@@ -134,34 +134,6 @@ public class TanluManager implements IMogoMarkerClickListener,
initListener();
}
// @Override
// public void init(Context context) {
//
// }
// @Override
// public void searchRoadCondition(String intentStr, String data, String city, String keywords) {
// Disposable disposable = Single.create((SingleOnSubscribe<Intent>) emitter -> {
// Logger.d(TAG, "searchRoadCondition---> intentStr: " + intentStr + " data: " + data + " " +
// "city: " + city + " keywords: " + keywords);
// Intent intent = new Intent(intentStr);
// intent.putExtra("data", data);
// intent.putExtra("city", city);
// intent.putExtra("keywords", keywords);
// Thread.sleep(3000);
// emitter.onSuccess(intent);
// }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(intent -> {
// Logger.d(TAG, "searchRoadCondition---go real share");
// realShare(intentStr, intent);
// });
// }
//
// @Override
// public void shareSuccess(String poiType, MogoLatLng location) {
// MarkerInfo markerInfo = new MarkerInfo(poiType, "", location.lon, location.lat, true, "1");
// EventBus.getDefault().post(markerInfo);
// }
private void initInterface() {
//地图marker地图操作
mMarkerManager = TanluServiceManager.getMapService().getMarkerManager(mContext);
@@ -318,7 +290,11 @@ public class TanluManager implements IMogoMarkerClickListener,
@Override
public void onQueryRoadInfoSuccess(@NotNull List<? extends MarkerExploreWay> roadInfoList) {
if (roadInfoList == null || (roadInfoList != null && roadInfoList.size() <= 0)) {
speakFailVoice("未发现" + mKeywords + "附近的特殊路况");
if (mKeywords.equals("附近")) {
speakFailVoice("未发现附近的特殊路况");
} else {
speakFailVoice("未发现" + mKeywords + "附近的特殊路况");
}
moveToMarcker(currentLat, currentLon);
return;
}
@@ -335,7 +311,11 @@ public class TanluManager implements IMogoMarkerClickListener,
public void onQueryRoadInfoFail(@NotNull String msg, int code) {
Logger.e(TAG, "onQueryRoadInfoFail ----- msg = " + msg);
// speakFailVoice(searchfaileVoiceStrings[1]);
speakFailVoice("未发现" + mKeywords + "附近的特殊路况");
if (mKeywords.equals("附近")) {
speakFailVoice("未发现附近的特殊路况");
} else {
speakFailVoice("未发现" + mKeywords + "附近的特殊路况");
}
moveToMarcker(currentLat, currentLon);
}

View File

@@ -38,6 +38,7 @@ object UploadHelper {
// }
// } else {
if (ServiceApisManager.serviceApis.statusManagerApi.isUploading) {
Logger.d("UploadHelper", "upload is going -- ")
// 上报即成功,当前还有正在上报的事件,仅做界面展示,不做具体操作
ServiceApisManager.serviceApis.tanluUiApi.shareSuccess(type.eventType, type.location)
} else {
@@ -58,7 +59,9 @@ object UploadHelper {
} else {
// 没网就直接提示失败
Logger.e("UploadHelper", "upload not net ")
AIAssist.getInstance(context).speakTTSVoice("分享失败,请检查网络")
@Suppress("DEPRECATION")
TipToast.tip("分享失败,请检查网络", TipDrawable(context.resources.getDrawable(R.drawable.module_share_upload_fail)))
}
}
@@ -69,9 +72,8 @@ object UploadHelper {
var shareItemSum = SharedPrefsMgr.getInstance(context).getInt(KEY_CLICK_SHARE_ITEM_BUTTON, 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")
Log.d("UploadHelper", "shareItemSum = $shareItemSum --- intervalTime = $intervalTime --type = ${type}")
val time = System.currentTimeMillis()
Log.d("UploadHelper", "time = $time ")
if (intervalTime == 0.toLong()) {
SharedPrefsMgr.getInstance(context).putLong(KEY_CLICK_SHARE_ITEM_TIME, time)
SharedPrefsMgr.getInstance(context).putInt(KEY_CLICK_SHARE_ITEM_BUTTON, ++shareItemSum)

View File

@@ -126,6 +126,8 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService
} else {
// 记录行进距离
tripDistance += com.mogo.module.service.Utils.calculateLineDistance(lastLon, lastLat, lon, lat).toInt()
lastLon = lon
lastLat = lat
val current = SystemClock.uptimeMillis()
if (startRecordDistanceTime == 0L) {
startRecordDistanceTime = current
@@ -134,16 +136,20 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService
if (current - startRecordDistanceTime >= DISTANCE_RECORD_TIME) {
// 超过阈值,准备判断是否拥堵
startRecordDistanceTime = 0L
if (tripDistance < 1000 && isClose() && currentSpeed < 40) {
Logger.d(TAG, "根据距离,判定为拥堵,准备上报")
if (tripDistance in 30..1000 && isClose() && currentSpeed < 40) {
Logger.d(TAG, "根据距离,判定为拥堵,准备上报, tripDistance: $tripDistance, frontDistance: $frontDistance, currentSpeed: $currentSpeed")
val p = TanluUploadParams(IMogoTanluProvider.TYPE_BLOCK, IMogoTanluProvider.UPLOAD_FROM_STRATEGY_BLOCK_AUTO)
val latLon = MogoLatLng(lat, lon)
p.location = latLon
// 疑似拥堵埋点上报
apis.analyticsApi.track("v2x_share_autoUpload", mapOf("type" to 1))
apis.tanluApi.uploadRoadCondition(p)
} else {
Logger.d(TAG, "根据距离,没有判定为拥堵, tripDistance: $tripDistance, frontDistance: $frontDistance, currentSpeed: $currentSpeed")
}
tripDistance = 0
lastLat = 0.0
lastLon = 0.0
}
}
}
@@ -152,7 +158,9 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService
* 没有有效前车距离或者前车距离小于5m
*/
private fun isClose(): Boolean {
return frontDistance in 1..4
val r = (frontDistance in 1..4) || (frontDistance == -1)
Logger.d(TAG,"r: $r")
return r
}
private fun uploadAverageSpeed(average: Float) {

View File

@@ -1,3 +1,5 @@
@file:Suppress("DEPRECATION")
package com.zhidao.mogo.module.splash
import android.content.Context

View File

@@ -22,7 +22,7 @@ android {
}
}
ndk {
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a"
abiFilters "armeabi-v7a"
}
}

View File

@@ -1,6 +1,5 @@
package com.mogo.module.v2x.adapter.holder;
import android.content.Intent;
import android.util.Log;
import android.view.View;
@@ -16,19 +15,20 @@ import com.mogo.map.navi.MogoTraffic;
import com.mogo.module.carchattingprovider.ICarsChattingProvider;
import com.mogo.module.common.entity.MarkerExploreWay;
import com.mogo.module.common.entity.MarkerLocation;
import com.mogo.module.common.entity.V2XEventZanData;
import com.mogo.module.v2x.V2XConst;
import com.mogo.module.v2x.V2XServiceManager;
import com.mogo.module.v2x.utils.ChartingUtil;
import com.mogo.module.v2x.utils.RoadConditionUtils;
import com.mogo.module.v2x.utils.TimeUtils;
import com.mogo.module.v2x.utils.TrackUtils;
import com.mogo.module.v2x.utils.V2XSQLiteUtils;
import com.mogo.module.v2x.utils.V2XUtils;
import com.mogo.utils.TipToast;
import com.mogo.utils.logger.Logger;
import com.zhidao.carchattingprovider.CallChattingProviderConstant;
import com.zhidao.carchattingprovider.MogoDriverInfo;
import java.util.HashMap;
import static com.mogo.module.v2x.V2XConst.MODULE_NAME;
/**
@@ -68,10 +68,18 @@ public abstract class V2XBaseViewHolder<T>
AIAssist.getInstance(V2XUtils.getApp()).speakTTSVoice("已点赞", null);
showTip("已点赞");
if (noveltyInfo != null) {
// 调用网络API接口
V2XServiceManager.getV2XMarkerService()
.getV2XRefreshModel()
.giveLikeLiveVideo(null, noveltyInfo.getSn());
V2XEventZanData v2XEventZanData = new V2XEventZanData();
v2XEventZanData.setEventId(noveltyInfo.getInfoId());
v2XEventZanData.setTriggerTime(TimeUtils.getNowMills());
V2XSQLiteUtils.saveEventZanLocalStory(v2XEventZanData);
// 上报数据统计
TrackUtils.trackV2xRoadEvent(
noveltyInfo.getInfoId(),
noveltyInfo.getSn(),
@@ -84,23 +92,23 @@ public abstract class V2XBaseViewHolder<T>
}
public void triggerIVReportHead(MarkerExploreWay noveltyInfo) {
Log.d(TAG,"点击头像"+mCarsChattingProvider);
Log.d(TAG, "点击头像" + mCarsChattingProvider);
try {
mCarsChattingProvider = (ICarsChattingProvider) ARouter.getInstance().build(CallChattingProviderConstant.CAR_CALL_PROVIDER).navigation();
MogoDriverInfo mogoDriverInfo = new MogoDriverInfo();
int ageNumber = noveltyInfo.getUserInfo().getAgeNumber();
mogoDriverInfo.setAge(ageNumber);
String gender = noveltyInfo.getUserInfo().getGender();
mogoDriverInfo.setGender(gender != null ? gender:null);
mogoDriverInfo.setGender(gender != null ? gender : null);
String sn = noveltyInfo.getUserInfo().getSn();
mogoDriverInfo.setSn(sn != null ? sn:"");
mogoDriverInfo.setSn(sn != null ? sn : "");
String name = noveltyInfo.getUserInfo().getUserName();
mogoDriverInfo.setUserName(name != null ? name:"");
mogoDriverInfo.setUserName(name != null ? name : "");
mogoDriverInfo.setUserHead(noveltyInfo.getUserInfo().getUserHead());
mCarsChattingProvider.showUserWindow(MODULE_NAME, mogoDriverInfo, this.itemView.getContext());
} catch (Exception e) {
Log.d(TAG,"点击头像发生错误--triggerIVReportHead"+e);
Log.d(TAG, "点击头像发生错误--triggerIVReportHead" + e);
e.printStackTrace();
}
}

View File

@@ -147,7 +147,7 @@ public class V2XEventUgcVH extends V2XBaseViewHolder<V2XEventShowEntity> {
* 对道路事件进行反馈
*/
void manualMarkingTrafficJam(int status) {
AIAssist.getInstance(V2XUtils.getApp()).speakTTSVoice("已反馈", null);
AIAssist.getInstance(V2XUtils.getApp()).speakTTSVoice("谢谢,您的反馈将帮助更多车友。", null);
V2XServiceManager
.getV2XRefreshModel()
.manualMarkingTrafficJam(

View File

@@ -24,10 +24,9 @@ import com.mogo.module.v2x.scenario.scene.livecar.V2XRoadLiveCarScenario;
import com.mogo.module.v2x.scenario.scene.road.V2XRoadEventScenario;
import com.mogo.module.v2x.scenario.scene.road.V2XRoadEventWindow;
import com.mogo.module.v2x.scenario.scene.road.V2XRoadVideoCarScenario;
import com.mogo.module.v2x.scenario.scene.road.V2XRoadVideoWindow;
import com.mogo.module.v2x.utils.ChartingUtil;
import com.mogo.module.v2x.utils.EventTypeUtils;
import com.mogo.module.v2x.utils.SpanUtils;
import com.mogo.module.v2x.utils.V2XSQLiteUtils;
import com.mogo.module.v2x.view.HeartLikeView;
import com.mogo.module.v2x.voice.V2XVoiceCallbackListener;
import com.mogo.module.v2x.voice.V2XVoiceConstants;
@@ -256,7 +255,12 @@ public class V2XRoadEventVH extends V2XBaseViewHolder<V2XEventShowEntity> {
ivEventReportTrue.setVisibility(GONE);
ivEventReportErr.setVisibility(GONE);
ivEventZan.setVisibility(VISIBLE);
if (V2XSQLiteUtils.isZanEvent(mNoveltyInfo.getInfoId())) {
ivEventZan.setVisibility(GONE);
} else {
ivEventZan.setVisibility(VISIBLE);
}
// 用户上报的才会展示拨打电话
if (!TextUtils.isEmpty(mNoveltyInfo.getUploadType())

View File

@@ -54,7 +54,7 @@ public class V2XSeekHelpButton implements IV2XButton {
tv = V2XServiceManager.getMogoEntranceButtonController().getButton(ButtonIndex.BUTTON2);
tv.setText("取消\n求助");
tv.setVisibility(View.VISIBLE);
tv.setBackgroundResource(R.drawable.bg_v2x_event_live_show);
tv.setBackgroundResource(R.drawable.bg_v2x_cancel_help);
tv.setOnClickListener(v -> {
//调用取消求助接口
// TODO: 2020/5/18 回调,显示对话框

View File

@@ -1,5 +1,6 @@
package com.mogo.module.v2x.utils;
import com.mogo.module.common.entity.V2XEventZanData;
import com.mogo.module.common.entity.V2XHistoryScenarioData;
import com.mogo.module.v2x.V2XConst;
import com.mogo.module.v2x.fragment.V2XEventPanelFragment;
@@ -21,6 +22,11 @@ public class V2XSQLiteUtils {
*/
private static SQLIDao<V2XHistoryScenarioData> mScenarioHistoryDao;
/**
* 点赞数据管理
*/
private static SQLIDao<V2XEventZanData> mV2XEventZanDao;
/**
* 场景数据管理
*/
@@ -36,6 +42,21 @@ public class V2XSQLiteUtils {
return mScenarioHistoryDao;
}
/**
* 点赞数据管理
*/
public static SQLIDao<V2XEventZanData> getV2XEventZanDao() {
if (mV2XEventZanDao == null) {
synchronized (V2XSQLiteUtils.class) {
if (mV2XEventZanDao == null) {
mV2XEventZanDao = SQLDaoFactory.Companion.getInstance()
.getBaseDao(V2XUtils.getApp(), V2XEventZanData.class);
}
}
}
return mV2XEventZanDao;
}
/**
* 删除数据库中存储的昨天的数据
*/
@@ -153,4 +174,48 @@ public class V2XSQLiteUtils {
e.printStackTrace();
}
}
/**
* 存储本地数据
*
* @param v2XEventZanData 要存储的场景
*/
public static void saveEventZanLocalStory(V2XEventZanData v2XEventZanData) {
try {
if (!isZanEvent(v2XEventZanData.eventId)) {
// 进行数据库存储
V2XSQLiteUtils.getV2XEventZanDao().insert(v2XEventZanData);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 判断是否已经存在
*
* @param eventId 要判断的事件ID
* @return true-已存在false-没存在
*/
public static boolean isZanEvent(String eventId) {
try {
// 查询数据库,判断是否存在
for (V2XEventZanData eventZanDatum : getEventZanData()) {
if (eventZanDatum.eventId.equals(eventId)) {
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 查询当天的V2X数据
*/
public static List<V2XEventZanData> getEventZanData() {
return getV2XEventZanDao().query(new V2XEventZanData());
}
}

View File

@@ -18,7 +18,7 @@ import com.mogo.module.v2x.R;
*
* @author donghongyu
*/
public class HeartLikeView extends LinearLayout {
public class HeartLikeView extends LinearLayout implements Animator.AnimatorListener {
private ImageView mIllegalParkingLike;
private AnimatorSet mAnimatorSet;
@@ -46,36 +46,36 @@ public class HeartLikeView extends LinearLayout {
mAnimatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(getContext(),
R.anim.v2x_like_heart_animation);
mAnimatorSet.setTarget(mIllegalParkingLike);
mAnimatorSet.addListener(this);
}
mAnimatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
isAnimator = false;
if (mOnClickCallListener != null) {
mOnClickCallListener.onClicked(HeartLikeView.this);
}
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
mAnimatorSet.start();
}
});
}
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
isAnimator = false;
if (mOnClickCallListener != null) {
mOnClickCallListener.onClicked(HeartLikeView.this);
}
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
public interface OnClickCallListener {
/**
* 点击回调

View File

@@ -18,7 +18,7 @@ import com.mogo.module.v2x.R;
*
* @author donghongyu
*/
public class HeartUnLikeView extends LinearLayout {
public class HeartUnLikeView extends LinearLayout implements Animator.AnimatorListener {
private ImageView mIllegalParkingUnLike;
private AnimatorSet mAnimatorSet;
@@ -46,36 +46,36 @@ public class HeartUnLikeView extends LinearLayout {
mAnimatorSet = (AnimatorSet) AnimatorInflater.loadAnimator(getContext(),
R.anim.v2x_unlike_heart_animation);
mAnimatorSet.setTarget(mIllegalParkingUnLike);
mAnimatorSet.addListener(this);
}
mAnimatorSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
isAnimator = false;
if (mOnClickCallListener != null) {
mOnClickCallListener.onClicked(HeartUnLikeView.this);
}
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
mAnimatorSet.start();
}
});
}
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
isAnimator = false;
if (mOnClickCallListener != null) {
mOnClickCallListener.onClicked(HeartUnLikeView.this);
}
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
public interface OnClickCallListener {
/**
* 点击回调

View File

@@ -159,7 +159,7 @@ class SimpleCoverVideoPlayer : StandardGSYVideoPlayer {
override fun onClick(v: View?) {
super.onClick(v)
Log.d("kl", "onClick160 : $mCurrentState")
Log.d("kl", "onClick160" + mCurrentState)
if (mCurrentState == CURRENT_STATE_PAUSE) {
onVideoResume()
} else if (mCurrentState == CURRENT_STATE_PLAYING) {

View File

@@ -239,10 +239,10 @@ public class V2XVoiceConstants {
// 封路
public static final String COMMAND_ZHIDAO_V2X_FEEDBACK_FENG_LU_YES_UN_WAKEUP = "COMMAND_ZHIDAO_V2X_FEEDBACK_FENG_LU_YES_UN_WAKEUP";
public static final String[] COMMAND_ZHIDAO_V2X_FEEDBACK_FENG_LU_YES_UN_WAKEUP_WORDS = {"封路了", "封了", "有封路", "确定"};
public static final String[] COMMAND_ZHIDAO_V2X_FEEDBACK_FENG_LU_YES_UN_WAKEUP_WORDS = {"封路了", "封了", "封路", "有封路", "确定"};
public static final String COMMAND_ZHIDAO_V2X_FEEDBACK_FENG_LU_NO_UN_WAKEUP = "COMMAND_ZHIDAO_V2X_FEEDBACK_FENG_LU_NO_UN_WAKEUP";
public static final String[] COMMAND_ZHIDAO_V2X_FEEDBACK_FENG_LU_NO_UN_WAKEUP_WORDS = {"没注意", "没看到", "没有", "没封路", "取消", "关闭"};
public static final String[] COMMAND_ZHIDAO_V2X_FEEDBACK_FENG_LU_NO_UN_WAKEUP_WORDS = {"不封路","没注意", "没看到", "没有", "没封路","无封路", "取消", "关闭"};
// 事故
@@ -250,7 +250,7 @@ public class V2XVoiceConstants {
public static final String[] COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GU_YES_UN_WAKEUP_WORDS = {"有事故", "存在交通事故", "确定"};
public static final String COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GU_NO_UN_WAKEUP = "COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GU_NO_UN_WAKEUP";
public static final String[] COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GU_NO_UN_WAKEUP_WORDS = {"没注意", "没有事故", "没看到", "没有", "取消", "关闭"};
public static final String[] COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GU_NO_UN_WAKEUP_WORDS = {"没注意", "没有事故", "无事故", "没看到", "没有", "取消", "关闭"};
// 道路施工
@@ -258,7 +258,7 @@ public class V2XVoiceConstants {
public static final String[] COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_YES_UN_WAKEUP_WORDS = {"", "在施工", "有施工", "确定"};
public static final String COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_NO_UN_WAKEUP = "COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_NO_UN_WAKEUP";
public static final String[] COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_NO_UN_WAKEUP_WORDS = {"没注意", "没看到", "没有施工", "很正常", "取消", "关闭"};
public static final String[] COMMAND_ZHIDAO_V2X_FEEDBACK_SHI_GONG_NO_UN_WAKEUP_WORDS = {"没注意", "没看到", "没有施工","无施工", "很正常", "取消", "关闭"};
static {

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<gradient android:angle="135" android:endColor="#3A435E" android:startColor="#525B7B" android:type="linear" />
<corners android:radius="@dimen/dp_26" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<gradient android:angle="135" android:endColor="#3A435E" android:startColor="#525B7B" android:type="linear" />
<corners android:radius="@dimen/dp_26" />
</shape>
</item>
</selector>

View File

@@ -161,7 +161,7 @@
android:layout_width="@dimen/module_v2x_event_button_size_detail"
android:layout_height="@dimen/module_v2x_event_button_size_detail"
android:padding="@dimen/dp_15"
android:src="@drawable/v2x_selector_icon_report_err_light"
android:src="@drawable/v2x_selector_icon_report_err"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/ivEventLive"
app:layout_constraintStart_toEndOf="@id/ivEventReportTrue"

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

@@ -33,7 +33,7 @@
android:layout_alignTop="@+id/road_case_style"
android:paddingRight="@dimen/dp_28"
android:text="100"
android:textColor="#FFFFFF"
android:textColor="@color/v2x_FFF_333"
android:textSize="@dimen/dp_26" />
<ImageView
@@ -56,7 +56,7 @@
android:gravity="left"
android:paddingRight="@dimen/dp_28"
android:text="100"
android:textColor="#FFFFFF"
android:textColor="@color/v2x_FFF_333"
android:textSize="@dimen/dp_26" />
<ImageView

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

@@ -100,8 +100,8 @@
<dimen name="module_v2x_event_parking_text_size">19px</dimen>
<!--适配 V2X 弹窗 UI-->
<dimen name="module_v2x_event_panel_btn_x">574px</dimen>
<dimen name="module_v2x_event_panel_in_launcher_btn_x">480px</dimen>
<dimen name="module_v2x_event_panel_btn_x">572px</dimen>
<dimen name="module_v2x_event_panel_in_launcher_btn_x">486px</dimen>
<dimen name="module_v2x_event_panel_btn_y">384px</dimen>
<!---->

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 822 B

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 771 B

After

Width:  |  Height:  |  Size: 486 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="module_commons_FFF_333_light">#333333</color>
</resources>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<gradient android:angle="135" android:endColor="#E6DEDEDE" android:startColor="#E6DEDEDE" android:type="linear" />
<corners android:radius="@dimen/dp_26" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<gradient android:angle="135" android:endColor="#E6DEDEDE" android:startColor="#E6DEDEDE" android:type="linear" />
<corners android:radius="@dimen/dp_26" />
</shape>
</item>
</selector>

View File

@@ -4,8 +4,8 @@
<corners android:radius="@dimen/dp_21"/>
<gradient
android:startColor="#B31F7EFF"
android:endColor="#B31E57A4"
android:startColor="#579EFF"
android:endColor="#357BDA"
android:type="linear"
android:angle="180"/>

View File

@@ -1,4 +1,4 @@
#!/bin/bash
!/bin/bash
./gradlew :foudations:mogo-utils:clean :foudations:mogo-utils:uploadArchives
if [ $? -ne 0 ];then exit; fi
@@ -6,14 +6,14 @@ if [ $? -ne 0 ];then exit; fi
if [ $? -ne 0 ]; then exit; fi
./gradlew :tts:tts-base:clean :tts:tts-base:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :foudations:mogo-commons:clean :foudations:mogo-commons:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :tts:tts-zhi:clean :tts:tts-zhi:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :tts:tts-di:clean :tts:tts-di:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :tts:tts-noop:clean :tts:tts-noop:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :foudations:mogo-commons:clean :foudations:mogo-commons:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :libraries:mogo-map-api:clean :libraries:mogo-map-api:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :skin:skin-support:clean :skin:skin-support:uploadArchives
@@ -102,15 +102,11 @@ if [ $? -ne 0 ]; then exit; fi
if [ $? -ne 0 ]; then exit; fi
./gradlew :libraries:tanlulib:clean :libraries:tanlulib:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :libraries:mogo-tanlu-api:clean :libraries:mogo-tanlu-api:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :modules:mogo-module-monitor:clean :modules:mogo-module-monitor:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :modules:mogo-module-splash:clean :modules:mogo-module-splash:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :modules:mogo-module-splash-noop:clean :modules:mogo-module-splash-noop:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :modules:mogo-module-tanlu:clean :modules:mogo-module-tanlu:uploadArchives
if [ $? -ne 0 ]; then exit; fi
./gradlew :modules:mogo-module-widgets:clean :modules:mogo-module-widgets:uploadArchives
if [ $? -ne 0 ]; then exit; fi