This commit is contained in:
unknown
2020-11-25 23:40:35 +08:00
165 changed files with 384 additions and 350 deletions

1
.idea/gradle.xml generated
View File

@@ -77,6 +77,7 @@
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
<option name="useQualifiedModuleNames" value="true" />
</GradleProjectSettings>
</option>
</component>

View File

@@ -425,7 +425,7 @@ dependencies {
apply from: "./functions/perform.gradle"
apply from: "./functions/baseservices.gradle"
apply from: "./functions/socketpush.gradle"
apply from: "./functions/gpssimulator.gradle"
// apply from: "./functions/gpssimulator.gradle"
apply from: "./functions/leftpanel.gradle"
apply from: "./functions/skin.gradle"
apply from: "./functions/crashreport.gradle"

View File

@@ -2,10 +2,10 @@
project.dependencies {
if (Boolean.valueOf(RELEASE)) {
debugImplementation rootProject.ext.dependencies.gpssimulatordebug
debugImplementation rootProject.ext.dependencies.gpssimulatornoop
releaseImplementation rootProject.ext.dependencies.gpssimulatornoop
} else {
debugImplementation project(':modules:mogo-module-gps-simulator-debug')
debugImplementation project(':modules:mogo-module-gps-simulator-noop')
releaseImplementation project(':modules:mogo-module-gps-simulator-noop')
}
}

View File

@@ -86,7 +86,6 @@ public class MogoApplication extends AbsMogoApplication {
MogoModulePaths.addBaseModule( new MogoModule( V2XConst.PATH_V2X_UI, V2XConst.MODULE_NAME ) );
MogoModulePaths.addBaseModule( new MogoModule( MogoServicePaths.PATH_STRATEGY_SHARE, "StrategyShare" ) );
MogoModulePaths.addBaseModule( new MogoModule( MogoServicePaths.PATH_GAODE_AIMLESS_SHARE, "GaoDeAimlessShare" ) );
MogoModulePaths.addBaseModule( new MogoModule( MogoServicePaths.PATH_EVENT_PANEL, "EventPanel" ) );
MogoModulePaths.addBaseModule( new MogoModule( MogoServicePaths.PATH_MOGO_MONITOR, "MogoMonitor" ) );
MogoModulePaths.addModule( new MogoModule( PushUIConstants.PATH, PushUIConstants.NAME ) );

View File

@@ -154,7 +154,7 @@ ext {
gpssimulatornoop : "com.mogo.module:module-gps-simulator-noop:${MOGO_MODULE_GPS_SIMULATOR_NOOP_VERSION}",
adasapi : "com.zhidao.autopilot.support:adas:1.0.6.5",
adasconfigapi : "com.zhidao.adasconfig:adasconfig:1.1.5",
adasconfigapi : "com.zhidao.adasconfig:adasconfig:1.1.5.2",
// 个人中心的SDK
personalsdk : "com.zhidaoauto.person.info:data:1.0.1",

View File

@@ -460,9 +460,11 @@ public class AMapNaviViewWrapper implements IMogoMapView,
break;
case Type_Light:
options.setNaviNight( false );
options.setAutoNaviViewNightMode( false );
break;
case Type_Night:
options.setNaviNight( true );
options.setAutoNaviViewNightMode( false );
break;
case Type_AUTO_LIGHT_Night:
options.setNaviNight( false );
@@ -875,6 +877,12 @@ public class AMapNaviViewWrapper implements IMogoMapView,
try {
LatLngBounds latLngBounds = MogoMapUtils.getLatLngBounds( carPosition, lonLats, lockCarPosition );
if ( !lockCarPosition ) {
changeMyLocationType2UnFollow();
try {
bnHooker.clearAllMessages();
} catch ( Exception e ) {
e.printStackTrace();
}
loseLockMode();
}
mMapView.getMap().moveCamera( CameraUpdateFactory.newLatLngBoundsRect( latLngBounds, bound.left, bound.right, bound.top, bound.bottom ) );

View File

@@ -1,14 +1,8 @@
package com.zhidao.roadcondition.model
class CityStrategy {
var video: Video
var pic: Pic
constructor(video: Video, pic: Pic) {
this.video = video
this.pic = pic
}
class CityStrategy(video: Video, pic: Pic) {
var video: Video? = video
var pic: Pic? = pic
}
fun Video.getMaxSpeed(): Int {

View File

@@ -3,6 +3,4 @@ package com.zhidao.roadcondition.model
/**
* 城市策略实体
*/
class Results(var cityStrategy: CityStrategy) {
}
class Results(var cityStrategy: CityStrategy)

View File

@@ -18,7 +18,7 @@ class ResponseFunction<T> : Function<BaseResponse<T>, T> {
}
override fun apply(t: BaseResponse<T>): T {
if (t == null || !t.isSuccess(baseUrl)) {
if (!t.isSuccess(baseUrl)) {
throw ApiException(t.code, t.msg)
}
return t.result

View File

@@ -45,7 +45,7 @@ object CosCallbackMapController : CosStatusCallback {
fun unregisterCallbacks(paths: Map<String, String>?) {
paths?.let {
it?.keys?.let { keys ->
it.keys.let { keys ->
keys.forEach { path ->
unregisterCallback(path)
}
@@ -54,9 +54,7 @@ object CosCallbackMapController : CosStatusCallback {
}
override fun onStartUpload(eventId: String?, localPath: String?) {
map[localPath]?.let {
it.onStartUpload(eventId, localPath)
}
map[localPath]?.onStartUpload(eventId, localPath)
}
override fun uploadCosFailed(cosPath: String?, eventId: String?, localPath: String?) {

View File

@@ -75,7 +75,7 @@ class CosStatusController : CosStatusCallback {
private fun sendGetInfoFailedReceiver(type: String) {
Log.d(CarCorderController.TAG, "sendGetInfoFailedReceiver ------>")
var intent = Intent()
val intent = Intent()
intent.action = "com.zhidao.roadcondition.getinfo.failed"
intent.putExtra("type", type)
AbsMogoApplication.getApp().applicationContext.sendBroadcast(intent)
@@ -95,11 +95,11 @@ class CosStatusController : CosStatusCallback {
// }
// }
} else {
if (localPath!!.endsWith("mp4") || localPath!!.contains("Thumbnail")) {
if (localPath!!.endsWith("mp4") || localPath.contains("Thumbnail")) {
CosCallbackMapController.uploadFailed?.invoke()
}
CosCallbackMapController.unregisterCallback(localPath)
InformationUploadController.release(entity?.id)
InformationUploadController.release(entity.id)
// deletePicFile(localPath)
}
}
@@ -114,7 +114,7 @@ class CosStatusController : CosStatusCallback {
Log.d(TAG, "uploadCosCompleted downloadUrl = $downloadUrl")
Log.d(TAG, "uploadCosCompleted cosPath = $cosPath")
trackUploadCos(1)
if (localPath!!.endsWith("mp4") || localPath!!.contains("Thumbnail")) {
if (localPath!!.endsWith("mp4") || localPath.contains("Thumbnail")) {
//如果是视频文件或者缩略图文件
if (localPath.endsWith("mp4")) {
videoAndThumbMap["video"] = downloadUrl!!
@@ -127,7 +127,7 @@ class CosStatusController : CosStatusCallback {
if (videoAndThumbMap.size == 2) {
trackUploadCos(4)
Log.d(TAG, "videoAndThumbMap.size == 2 ")
var locationInfo = LocationUtil.getInstance().getLocationInfo()
val locationInfo = LocationUtil.getInstance().getLocationInfo()
val locationStr: String = Gson().toJson(locationInfo)
Log.d(TAG, "locationStr = $locationStr")
//上传录像以及缩略图成功
@@ -155,7 +155,7 @@ class CosStatusController : CosStatusCallback {
}
private fun sendInformation(type: Int, map: Map<String, String>) {
Log.d(TAG, "isCustomSend = ${entity?.isCustom}")
Log.d(TAG, "isCustomSend = ${entity.isCustom}")
// if (entity?.isCustom) {
// InformationUploadController.cosResourceReady(type, map, entity?.isCustom, entity?.id) {
// CosCallbackMapController.mainService?.sendCustomResult(it)

View File

@@ -75,7 +75,7 @@ object InformationUploadController {
}
}
private fun tryUploadInformation(ir: InformationResource?) {
// private fun tryUploadInformation(ir: InformationResource?) {
// synchronized(locker) {
// ir?.let {
// if (!it.isReady()) {
@@ -106,7 +106,7 @@ object InformationUploadController {
// }
// }
// }
}
// }
fun release(id: Long) {
val target = informationCache.remove(id)

View File

@@ -132,11 +132,10 @@ class MainService : Service() {
if (p1.action == alarmBroadAction) {
if (p1.getIntExtra("AlarmType", 1) == AlarmTypePic) {
//拍照
var number = p1.getLongExtra("number", 1)
takePhoto(number, true)
takePhoto(true)
} else {
//录像
var duration = p1.getIntExtra("duration", 3)
val duration = p1.getIntExtra("duration", 3)
takeVideo(duration, true)
}
}
@@ -211,7 +210,7 @@ class MainService : Service() {
// )
}
private fun sendMarkerInfoReceiver(lat: Double, lon: Double, imageUrl: String?, type: String?) {
// private fun sendMarkerInfoReceiver(lat: Double, lon: Double, imageUrl: String?, type: String?) {
// Log.e("MainService", "sendMarkerInfoReceiver ------> type = $type ")
// Log.e("MainService", "sendMarkerInfoReceiver ------> fromType = $fromType ")
// Log.e("MainService", "sendMarkerInfoReceiver ------> isCustom = $isCustom ")
@@ -224,7 +223,7 @@ class MainService : Service() {
// intent.putExtra("custom", isCustom)
// intent.putExtra("fromType", fromType)
// sendBroadcast(intent)
}
// }
/**
* 初始化定位监听
@@ -266,7 +265,7 @@ class MainService : Service() {
Log.d("MainService", "handleReportStrategy picType = $picType ---videoType = $videoType")
shareType = TANLU_ROAD_CURRENT
if (picType == 1) {
takePhoto(1)
takePhoto()
} else if (picType == 2) {
postPhotoAlarmTask(true)
}
@@ -291,7 +290,7 @@ class MainService : Service() {
}
//获取图片
private fun takePhoto(picNum: Long, isInterval: Boolean = false, isCustom: Boolean = false) {
private fun takePhoto( isInterval: Boolean = false, isCustom: Boolean = false) {
Log.d("MainService", "takePhoto -----1----->")
//判断是否授权
// if (isAuthorization(BaseApplication.getAppContext())) {

View File

@@ -18,7 +18,7 @@ import kotlinx.coroutines.runBlocking
class MainServiceController {
companion object {
var TAG = this.javaClass.name
var TAG = this::class.java.name
}
//逆地理编码是否重试
@@ -57,69 +57,69 @@ class MainServiceController {
}
//将数据同步到sharePreference中
fun syncStrategiesData(strategy: CityStrategy) {
if (strategy?.pic != null && strategy.video!=null) {
setStrategyType(AbsMogoApplication.getApp().applicationContext, strategy.pic.strategyType, "pic")
setStrategyType(AbsMogoApplication.getApp().applicationContext, strategy.video.strategyType, "video")
private fun syncStrategiesData(strategy: CityStrategy) {
if (strategy.pic != null && strategy.video!=null) {
setStrategyType(AbsMogoApplication.getApp().applicationContext, strategy.pic!!.strategyType, "pic")
setStrategyType(AbsMogoApplication.getApp().applicationContext, strategy.video!!.strategyType, "video")
setStrategyFrequency(
AbsMogoApplication.getApp().applicationContext,
strategy.pic.strategyType,
strategy.pic!!.strategyType,
"pic",
strategy.pic.reportType
strategy.pic!!.reportType
)
setStrategyFrequency(
AbsMogoApplication.getApp().applicationContext,
strategy.video.strategyType,
strategy.video!!.strategyType,
"video",
strategy.video.reportType
strategy.video!!.reportType
)
setStrategyInterval(
AbsMogoApplication.getApp().applicationContext,
strategy.pic.strategyType,
strategy.pic!!.strategyType,
"pic",
strategy.pic.reportTimeInterval * 60 * 1000L
strategy.pic!!.reportTimeInterval * 60 * 1000L
)
setStrategyInterval(
AbsMogoApplication.getApp().applicationContext,
strategy.video.strategyType,
strategy.video!!.strategyType,
"video",
strategy.video.reportTimeInterval * 60 * 1000L
strategy.video!!.reportTimeInterval * 60 * 1000L
)
setStrategyValidity(
AbsMogoApplication.getApp().applicationContext,
strategy.pic.strategyType,
strategy.pic!!.strategyType,
"pic",
strategy.pic.infoTimeout
strategy.pic!!.infoTimeout
)
setStrategyValidity(
AbsMogoApplication.getApp().applicationContext,
strategy.video.strategyType,
strategy.video!!.strategyType,
"video",
strategy.video.infoTimeout
strategy.video!!.infoTimeout
)
setStrategyMaxSpeed(
AbsMogoApplication.getApp().applicationContext,
strategy.pic.strategyType,
strategy.pic!!.strategyType,
"pic",
strategy.pic.getMaxSpeed()
strategy.pic!!.getMaxSpeed()
)
setStrategyMaxSpeed(
AbsMogoApplication.getApp().applicationContext,
strategy.video.strategyType,
strategy.video!!.strategyType,
"video",
strategy.video.getMaxSpeed()
strategy.video!!.getMaxSpeed()
)
setStrategyMinSpeed(
AbsMogoApplication.getApp().applicationContext,
strategy.pic.strategyType,
strategy.pic!!.strategyType,
"pic",
strategy.pic.minSpeed
strategy.pic!!.minSpeed
)
setStrategyMinSpeed(
AbsMogoApplication.getApp().applicationContext,
strategy.video.strategyType,
strategy.video!!.strategyType,
"video",
strategy.video.minSpeed
strategy.video!!.minSpeed
)
} else {
Log.d(TAG, "strategy Data is null")
@@ -145,8 +145,8 @@ class MainServiceController {
mFromType = fromType
mPoiType = poiType
var locationInfo = LocationUtil.getInstance().getLocationInfo()
if (locationInfo.address.isNullOrEmpty()) {
val locationInfo = LocationUtil.getInstance().getLocationInfo()
if (locationInfo.address.isEmpty()) {
Log.d(TAG, " sendInformationMessage locationInfo.address = $locationInfo.address")
trackUploadGeo(1)
geoLocation(type, url, locationInfo, isCustom,trafficInfoType, isShare, customSend,poiType,mainInfoId,speed, longitude,latitude)
@@ -210,11 +210,9 @@ class MainServiceController {
strategyeModel.uploadInformation(informationBody)
}
onSuccess {
if (it.result != null) {
Log.i(TAG, "upload success id = " + it.result.id)
if (mFromType == "6") {
sendUgcStatusReceiver(it.result.id, mPoiType, mFromType)
}
Log.i(TAG, "upload success id = " + it.result.id)
if (mFromType == "6") {
sendUgcStatusReceiver(it.result.id, mPoiType, mFromType)
}
trackUploadServer(1)
customSend?.invoke(true)

View File

@@ -39,8 +39,8 @@ const val CarNet_Geo:String = "CarNet_Geo_Location" //上传服务端, type=1开
const val CarNet_live_broadcast = "CarNet_live_broadcast" // 地图页面点击直播(在线可直播车机)
//自定义埋点
@DebugLog
fun trackNormalEvent(event: String, data: MutableMap<String, Any>?, context: Context = AbsMogoApplication.getApp().applicationContext) {
var data = data
fun trackNormalEvent(event: String, _data: MutableMap<String, Any>?, context: Context = AbsMogoApplication.getApp().applicationContext) {
var data = _data
if (data == null) {
data = HashMap()
}

View File

@@ -138,10 +138,10 @@ fun getCompressVideoPath(): String {
* 保存图片到本地
*/
fun saveImageToSdcard(bmp: Bitmap): Boolean {
var currentFile: File
lateinit var fos: FileOutputStream
val currentFile: File
var fos: FileOutputStream? = null
var picFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val picFile = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
picFile.mkdirs()
val builder = StringBuilder()
@@ -162,9 +162,7 @@ fun saveImageToSdcard(bmp: Bitmap): Boolean {
return false
} finally {
try {
if (fos != null) {
fos.close()
}
fos?.close()
} catch (e: IOException) {
e.printStackTrace()
return false

View File

@@ -72,7 +72,7 @@ class LocationUtil private constructor() {
private var locationClient: AMapLocationClient? = null
private var locationOption: AMapLocationClientOption? = null
private var speedListener: SpeedListener? = null
private var locationInfo: LocationInfo = LocationInfo()
private var locationInfo: LocationInfo? = null
private var speed: Float = 0.0f
fun initLocation() {
@@ -125,24 +125,21 @@ class LocationUtil private constructor() {
*/
private var locationListener: AMapLocationListener = AMapLocationListener { location ->
if (null != location) {
locationInfo.longitude = location.longitude
locationInfo.latitude = location.latitude
locationInfo.address = location.address
locationInfo.time = location.time
locationInfo.provinceName = location.province
locationInfo.cityName = location.city
locationInfo.cityCode = location.cityCode
locationInfo.areaName = location.district
locationInfo.areaCode = location.adCode
locationInfo.street = location.street
locationInfo.direction = location.bearing
listener?.let {
it.onChanged(locationInfo)
}
locationInfo = LocationInfo()
locationInfo!!.longitude = location.longitude
locationInfo!!.latitude = location.latitude
locationInfo!!.address = location.address
locationInfo!!.time = location.time
locationInfo!!.provinceName = location.province
locationInfo!!.cityName = location.city
locationInfo!!.cityCode = location.cityCode
locationInfo!!.areaName = location.district
locationInfo!!.areaCode = location.adCode
locationInfo!!.street = location.street
locationInfo!!.direction = location.bearing
listener?.onChanged(locationInfo!!)
speed = location.speed
speedListener?.let {
it.onSpeedGet(location.speed)
}
speedListener?.onSpeedGet(location.speed)
} else {
Log.d(TAG, "定位失败 -> location is null")
}
@@ -160,13 +157,12 @@ class LocationUtil private constructor() {
fun getLocationInfo(): LocationInfo {
return if (null != locationInfo) {
locationInfo
locationInfo!!
} else {
if (null == locationClient) {
locationClient = AMapLocationClient(mContext)
this.locationClient = locationClient
}
var location = locationClient!!.lastKnownLocation
val location = locationClient!!.lastKnownLocation
location.toLocInfo(location)
}
}

View File

@@ -2,6 +2,7 @@ package com.zhidao.roadcondition.util
import kotlinx.coroutines.*
@ObsoleteCoroutinesApi
@PublishedApi
internal var ThreadPool =
newFixedThreadPoolContext(Runtime.getRuntime().availableProcessors() * 2, "ThreadPool")
@@ -11,16 +12,17 @@ internal var ThreadPool =
* 在主线程中顺序执行,协程函数,一般用于最外层
* 该函数会阻塞代码继续执行
*/
inline fun taskBlockOnMainThread(delayTime: Long = 0, noinline job: suspend () -> Unit) = runBlocking {
delay(delayTime)
job()
}
//inline fun taskBlockOnMainThread(delayTime: Long = 0, noinline job: suspend () -> Unit) = runBlocking {
// delay(delayTime)
// job()
//}
/**
* 并发执行,常用于最外层
* 特点带返回值
*/
inline fun <T> taskAsync(delayTime: Long = 0, noinline job: suspend () -> T) = GlobalScope.async(ThreadPool) {
@ObsoleteCoroutinesApi
fun <T> taskAsync(delayTime: Long = 0, job: suspend () -> T) = GlobalScope.async(ThreadPool) {
delay(delayTime)
job()
}

View File

@@ -66,15 +66,15 @@ class CallChatApi {
driverInfo.setSn( onlineCar.getUserInfo().getSn() );
driverInfo.setUserHead( onlineCar.getUserInfo().getUserHead() );
driverInfo.setUserName( onlineCar.getUserInfo().getUserName() );
mApiProvider.showUserWindow( TAG, driverInfo, context );
if ( mApiProvider != null ) {
mApiProvider.showUserWindow( TAG, driverInfo, context );
}
}
public void hideUserWindow( Context context ) {
if ( mApiProvider != null ) {
if ( mApiProvider == null ) {
Logger.e( TAG, "no call chat api instance." );
return;
}
if ( mApiProvider == null ) {
Logger.e( TAG, "no call chat api instance." );
return;
}
mApiProvider.hideUserWindow( TAG, context, null );
}

View File

@@ -77,6 +77,11 @@ public class CustomRatingBar extends LinearLayout {
* */
private StepSize stepSize;
/*
*添加资源(空白心是白色还是灰色自定义属性)
* */
private boolean otherHeartImg;
@Override
public boolean isClickable() {
return mClickable;
@@ -159,14 +164,21 @@ public class CustomRatingBar extends LinearLayout {
context.getResources().getDimension(R.dimen.heart_ratingbar_height));
elementPadding = mTypedArray.getDimension(R.styleable.CustomRatingBar_elenmentPadding,
context.getResources().getDimension(R.dimen.ratingbar_padding));
/*
* 白天模式下 热心指数(白色)和个人中心(灰色)使用不同的资源
* 默认灰色
* */
otherHeartImg = mTypedArray.getBoolean(R.styleable.CustomRatingBar_OtherHeartImg, true);
elementStep = mTypedArray.getFloat(R.styleable.CustomRatingBar_elenmentStep, 1.0f);
stepSize = StepSize.fromStep(mTypedArray.getInt(R.styleable.CustomRatingBar_stepSize, 1));
elementCount = mTypedArray.getInteger(R.styleable.CustomRatingBar_elenmentCount, 5);
stepSize = StepSize.Half;
Drawable drawable_empty_default = ContextCompat.getDrawable(context, R.drawable.icon_heart_unchoose);
Drawable drawable_harf_default = ContextCompat.getDrawable(context, R.drawable.icon_heart_second);
Drawable drawable_empty_default = ContextCompat.getDrawable(context,
otherHeartImg == false ? R.drawable.icon_heart_unchoose : R.drawable.icon_heart_unchoose_other);
Drawable drawable_half_default = ContextCompat.getDrawable(context,
otherHeartImg == false ? R.drawable.icon_heart_second : R.drawable.icon_heart_second_other);
Drawable drawable_fill_default = ContextCompat.getDrawable(context, R.drawable.icon_heart_choose);
Drawable drawable_empty = mTypedArray.getDrawable(R.styleable.CustomRatingBar_elenmentEmpty);
@@ -175,7 +187,7 @@ public class CustomRatingBar extends LinearLayout {
elementEmptyDrawable = drawable_empty != null ? drawable_empty : drawable_empty_default;
elementFillDrawable = drawable_half != null ? drawable_half : drawable_fill_default;
elementHarfDrawable = drawable_fill != null ? drawable_fill : drawable_harf_default;
elementHarfDrawable = drawable_fill != null ? drawable_fill : drawable_half_default;
mClickable = mTypedArray.getBoolean(R.styleable.CustomRatingBar_clickable, false);
mTypedArray.recycle();
for (int i = 0; i < elementCount; ++i) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 822 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 B

View File

@@ -38,6 +38,7 @@
<enum name="Half" value="0" />
<enum name="Full" value="1" />
</attr>
<attr name="OtherHeartImg" format="boolean" />
</declare-styleable>
</resources>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="BaseFloatDialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowIsFloating">true</item>
<item name="android:windowFrame">@null</item>
@@ -15,8 +16,6 @@
<item name="android:borderlessButtonStyle">@android:color/transparent</item>
</style>
<style name="customHeartHeartRatingBarStyle" parent="@style/Widget.AppCompat.RatingBar">
<item name="android:maxWidth">@dimen/heart_ratingbar_width</item>
<item name="android:minWidth">@dimen/heart_ratingbar_width</item>
@@ -28,5 +27,4 @@
<item name="android:progressDrawable">@drawable/module_commons_heart_ratingbar_drawable</item>
</style>
</resources>

View File

@@ -112,7 +112,9 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
FloatingViewHandler.init( mFloatingLayout );
mServiceApis.getOnlineCarPanelApi().initContainer( R.id.module_main_id_message_history_fragment_container, this );
CallChatApi.getInstance().getApiProvider().initVehicleTeamContainer("init", R.id.module_main_id_message_history_fragment_container, this);
if ( CallChatApi.getInstance().getApiProvider() != null ) {
CallChatApi.getInstance().getApiProvider().initVehicleTeamContainer("init", R.id.module_main_id_message_history_fragment_container, this);
}
}
// 隐藏布局
@@ -368,7 +370,9 @@ public class MainActivity extends MvpActivity< MainView, MainPresenter > impleme
mServiceApis.getRefreshStrategyControllerApi().clearAllData();
AIAssist.getInstance( this ).release();
mServiceApis.getOnlineCarPanelApi().clear();
CallChatApi.getInstance().getApiProvider().initVehicleTeamContainer("init", 0, null);
if ( CallChatApi.getInstance().getApiProvider() != null ) {
CallChatApi.getInstance().getApiProvider().initVehicleTeamContainer("init", 0, null);
}
ContextHolderUtil.releaseContext();
MogoModulesManager.getInstance().onDestroy();
SchemeIntent.getInstance().clear();

View File

@@ -6,6 +6,7 @@ import android.content.Context;
import androidx.fragment.app.Fragment;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.MogoModule;
import com.mogo.module.common.MogoModulePaths;
import com.mogo.module.main.MainActivity;
@@ -127,9 +128,7 @@ public class MogoModulesManager implements MogoModulesHandler {
@Override
public void loadEventPanelModule( int containerId ) {
IMogoModuleProvider provider = ( IMogoModuleProvider ) ARouter.getInstance()
.build( MogoServicePaths.PATH_EVENT_PANEL )
.navigation( getContext() );
IMogoModuleProvider provider = MogoApisHandler.getInstance().getApis().getEventPanelManager();
addFragment( provider, containerId );
}

View File

@@ -101,7 +101,9 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener {
}
}
};
ServiceMediaHandler.getCarsChattingApis().registerCallWindowStatusListener( MediaConstants.MODULE_TYPE, mContext, mCallProviderResponse);
if ( ServiceMediaHandler.getCarsChattingApis() != null ) {
ServiceMediaHandler.getCarsChattingApis().registerCallWindowStatusListener( MediaConstants.MODULE_TYPE, mContext, mCallProviderResponse);
}
isFirstPlay = true;
}
@@ -344,7 +346,9 @@ public class MediaWindow2 implements IMusicView , IMogoStatusChangedListener {
public void onDestroy(){
Logger.d(TAG, "onDestroy");
ServiceMediaHandler.getCarsChattingApis().unRegisterCallWindowStatusListener( MediaConstants.MODULE_TYPE, mContext);
if ( ServiceMediaHandler.getCarsChattingApis() != null ) {
ServiceMediaHandler.getCarsChattingApis().unRegisterCallWindowStatusListener( MediaConstants.MODULE_TYPE, mContext);
}
ServiceMediaHandler.getIMogoStatusManager().unregisterStatusChangedListener(MediaConstants.MODULE_TYPE, StatusDescriptor.ACC_STATUS,this);
}
}

View File

@@ -58,14 +58,14 @@ dependencies {
implementation rootProject.ext.dependencies.mogocommons
implementation rootProject.ext.dependencies.mogoserviceapi
implementation rootProject.ext.dependencies.modulecommon
implementation rootProject.ext.dependencies.gpssimulator
// implementation rootProject.ext.dependencies.gpssimulator
} else {
implementation project(":libraries:mogo-map-api")
implementation project(":foudations:mogo-utils")
implementation project(":foudations:mogo-commons")
implementation project(':services:mogo-service-api')
implementation project(':modules:mogo-module-common')
implementation project(':modules:mogo-module-gps-simulator')
// implementation project(':modules:mogo-module-gps-simulator')
}
implementation 'com.zhidaoauto.voice.controller:api:1.0.2'

View File

@@ -1,13 +1,11 @@
package com.mogo.module.navi.constants;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.map.location.IMogoLocationClient;
import com.mogo.map.marker.IMogoMarkerManager;
import com.mogo.map.navi.IMogoNavi;
import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.gps.simulator.IMogoGpsSimulatorManager;
import com.mogo.module.navi.cp.PersonalInfoManagerImpl;
import com.mogo.service.IMogoServiceApis;
import com.mogo.service.analytics.IMogoAnalytics;
@@ -31,7 +29,7 @@ public class SearchApisHolder {
private static final String TAG = "SearchApisHolder";
private static IMogoServiceApis sApis;
private static IMogoGpsSimulatorManager sGpsSimulatorManager;
// private static IMogoGpsSimulatorManager sGpsSimulatorManager;
private static PersonalInfoManagerImpl mPersonalInfoManager;
@@ -86,12 +84,12 @@ public class SearchApisHolder {
return getApis().getSettingManagerApi();
}
public static IMogoGpsSimulatorManager getGpsSimulatorManager() {
if ( sGpsSimulatorManager == null ) {
sGpsSimulatorManager = ARouter.getInstance().navigation( IMogoGpsSimulatorManager.class );
}
return sGpsSimulatorManager;
}
// public static IMogoGpsSimulatorManager getGpsSimulatorManager() {
// if ( sGpsSimulatorManager == null ) {
// sGpsSimulatorManager = ARouter.getInstance().navigation( IMogoGpsSimulatorManager.class );
// }
// return sGpsSimulatorManager;
// }
public static IMogoSearchManager getSearchManager() {
return getApis().getSearchManagerApi();

View File

@@ -221,11 +221,11 @@ class NaviSettingFragment : BaseFragment(), OnCheckedChangeListener {
SettingManager.setGpsSimulator(isChecked)
if (isChecked) {
SearchApisHolder.getGpsSimulatorManager().open()
} else {
SearchApisHolder.getGpsSimulatorManager().close()
}
// if (isChecked) {
// SearchApisHolder.getGpsSimulatorManager().open()
// } else {
// SearchApisHolder.getGpsSimulatorManager().close()
// }
}
tb_navi.isChecked = SettingManager.isMonitor()
tb_gps.isChecked = SettingManager.isGpsSimulator()

View File

@@ -60,7 +60,7 @@ dependencies {
api rootProject.ext.dependencies.mogocommons
api rootProject.ext.dependencies.mogoserviceapi
implementation rootProject.ext.dependencies.modulecommon
implementation rootProject.ext.dependencies.gpssimulator
// implementation rootProject.ext.dependencies.gpssimulator
} else {
api project(":libraries:mogo-map")
api project(":libraries:mogo-map-api")
@@ -68,7 +68,7 @@ dependencies {
api project(":foudations:mogo-commons")
api project(':services:mogo-service-api')
implementation project(':modules:mogo-module-common')
implementation project(':modules:mogo-module-gps-simulator')
// implementation project(':modules:mogo-module-gps-simulator')
}
}

View File

@@ -11,7 +11,6 @@ import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.entity.MarkerResponse;
import com.mogo.module.common.entity.MarkerShowEntity;
import com.mogo.module.gps.simulator.IMogoGpsSimulatorManager;
import com.mogo.module.service.marker.MapMarkerManager;
import com.mogo.service.IMogoServiceApis;
import com.mogo.service.adas.IMogoADASController;
@@ -59,11 +58,11 @@ public class MarkerServiceHandler {
private static IMogoLauncher sLauncher;
private static IMogoFragmentManager sFragmentManager;
private static ICarsChattingProvider sCarChatting;
private static IMogoGpsSimulatorManager sGpsSimulatorManager;
// private static IMogoGpsSimulatorManager sGpsSimulatorManager;
public static synchronized void init( final Context context ) {
if ( sGpsSimulatorManager != null ) {
if ( sCarChatting != null ) {
return;
}
@@ -89,7 +88,7 @@ public class MarkerServiceHandler {
MapMarkerManager.getInstance().init( context );
sGpsSimulatorManager = ARouter.getInstance().navigation( IMogoGpsSimulatorManager.class );
// sGpsSimulatorManager = ARouter.getInstance().navigation( IMogoGpsSimulatorManager.class );
}
public static IMogoServiceApis getApis() {
@@ -168,9 +167,9 @@ public class MarkerServiceHandler {
return sCarChatting;
}
public static IMogoGpsSimulatorManager getGpsSimulatorManager() {
return sGpsSimulatorManager;
}
// public static IMogoGpsSimulatorManager getGpsSimulatorManager() {
// return sGpsSimulatorManager;
// }
//TODO -------------以下方法是临时过度使用的后面统一使用getMapMarkerManager进行调用

View File

@@ -412,7 +412,9 @@ public class MogoServices implements IMogoMapListener,
MogoApisHandler.getInstance().getApis().getAdasControllerApi().setSettingStatus(false);
MogoApisHandler.getInstance().getApis().getEventPanelManager().hidePanel();
carsChattingProvider = (ICarsChattingProvider) ARouter.getInstance().build(CallChattingProviderConstant.CAR_CALL_PROVIDER).navigation();
carsChattingProvider.hideUserWindow("MOGO_COMMON_SERVICE", mContext, mCallProviderResponse);
if ( carsChattingProvider != null ) {
carsChattingProvider.hideUserWindow("MOGO_COMMON_SERVICE", mContext, mCallProviderResponse);
}
}
public void init(Context context) {

View File

@@ -2,7 +2,6 @@ package com.mogo.module.service.intent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.net.Uri;
@@ -26,7 +25,6 @@ import com.mogo.map.search.geo.MogoRegeocodeResult;
import com.mogo.map.search.geo.query.MogoRegeocodeQuery;
import com.mogo.module.common.dialog.WMDialog;
import com.mogo.module.service.MarkerServiceHandler;
import com.mogo.module.service.MogoServiceProvider;
import com.mogo.module.service.R;
import com.mogo.service.entrance.ButtonIndex;
import com.mogo.utils.TipToast;
@@ -327,12 +325,12 @@ public class MockIntentHandler implements IntentHandler {
} );
}
break;
case 15:
MarkerServiceHandler.getGpsSimulatorManager().open();
break;
case 16:
MarkerServiceHandler.getGpsSimulatorManager().close();
break;
// case 15:
// MarkerServiceHandler.getGpsSimulatorManager().open();
// break;
// case 16:
// MarkerServiceHandler.getGpsSimulatorManager().close();
// break;
case 17:
DebugConfig.setRequestOnlineCarData( intent.getBooleanExtra( "status", true ) );
break;

View File

@@ -113,24 +113,26 @@ public class MapMarkerManager implements IMogoMarkerClickListener,
MarkerServiceHandler.getActionManager().registerBizActionDoneListener( this );
MarkerServiceHandler.getApis().getRegisterCenterApi().registerADASControlStatusChangedListener( TAG, this );
CallChatApi.getInstance().getApiProvider().registerUserWindowStatusListener( TAG, mContext, new ICallChatResponse() {
if ( CallChatApi.getInstance().getApiProvider() != null ) {
CallChatApi.getInstance().getApiProvider().registerUserWindowStatusListener( TAG, mContext, new ICallChatResponse() {
@Override
public void userWindowStatus( boolean show ) {
try {
if ( mLastCheckMarker == null ) {
return;
@Override
public void userWindowStatus( boolean show ) {
try {
if ( mLastCheckMarker == null ) {
return;
}
if ( TextUtils.equals( mLastCheckMarker.getOwner(), ModuleNames.CARD_TYPE_USER_DATA )
&& !show ) {
closeMarker( mLastCheckMarker );
}
} catch ( Exception e ) {
e.printStackTrace();
}
if ( TextUtils.equals( mLastCheckMarker.getOwner(), ModuleNames.CARD_TYPE_USER_DATA )
&& !show ) {
closeMarker( mLastCheckMarker );
}
} catch ( Exception e ) {
e.printStackTrace();
}
}
} );
} );
}
}
/**

View File

@@ -194,7 +194,9 @@ public class UserDataMarkerInfoWindowAdapter implements IMogoInfoWindowAdapter {
params.put( CallChattingProviderConstant.CCPROVIDER_LON, location.getLon() + "" );
}
Logger.d( TAG, "call parameters: %s", params );
MarkerServiceHandler.getCarChatting().call( params );
if ( MarkerServiceHandler.getCarChatting() != null ) {
MarkerServiceHandler.getCarChatting().call( params );
}
}
protected void loadImageHeader( final MarkerShowEntity markerShowEntity ) {

View File

@@ -78,7 +78,9 @@ class OnlineCarPanelAdapter extends RecyclerView.Adapter<OnlineCarPanelAdapter.V
params.put(CallChattingProviderConstant.CCPROVIDER_LAT, location.getLat() + "");
params.put(CallChattingProviderConstant.CCPROVIDER_LON, location.getLon() + "");
ICarsChattingProvider carChatting = MarkerServiceHandler.getCarChatting();
carChatting.call(params);
if ( carChatting != null ) {
carChatting.call(params);
}
});
}

View File

@@ -32,53 +32,53 @@ public class CarIconDisplayStrategy {
// F 系列才有这个帧动画
public static final int[] sFrame = {
R.drawable.v_to_x_warning_circle_orange_00000,
R.drawable.v_to_x_warning_circle_orange_00001,
R.drawable.v_to_x_warning_circle_orange_00002,
R.drawable.v_to_x_warning_circle_orange_00003,
R.drawable.v_to_x_warning_circle_orange_00004,
R.drawable.v_to_x_warning_circle_orange_00005,
R.drawable.v_to_x_warning_circle_orange_00006,
R.drawable.v_to_x_warning_circle_orange_00007,
R.drawable.v_to_x_warning_circle_orange_00008,
R.drawable.v_to_x_warning_circle_orange_00009,
R.drawable.v_to_x_warning_circle_orange_00010,
R.drawable.v_to_x_warning_circle_orange_00011,
R.drawable.v_to_x_warning_circle_orange_00012,
R.drawable.v_to_x_warning_circle_orange_00013,
R.drawable.v_to_x_warning_circle_orange_00014,
R.drawable.v_to_x_warning_circle_orange_00015,
R.drawable.v_to_x_warning_circle_orange_00016,
R.drawable.v_to_x_warning_circle_orange_00017,
R.drawable.v_to_x_warning_circle_orange_00018,
R.drawable.v_to_x_warning_circle_orange_00019,
R.drawable.v_to_x_warning_circle_orange_00020,
R.drawable.v_to_x_warning_circle_orange_00023,
R.drawable.v_to_x_warning_circle_orange_00024,
R.drawable.v_to_x_warning_circle_orange_00025,
R.drawable.v_to_x_warning_circle_orange_00026,
R.drawable.v_to_x_warning_circle_orange_00027,
R.drawable.v_to_x_warning_circle_orange_00028,
R.drawable.v_to_x_warning_circle_orange_00029,
R.drawable.v_to_x_warning_circle_orange_00030,
R.drawable.v_to_x_warning_circle_orange_00031,
R.drawable.v_to_x_warning_circle_orange_00032,
R.drawable.v_to_x_warning_circle_orange_00033,
R.drawable.v_to_x_warning_circle_orange_00034,
R.drawable.v_to_x_warning_circle_orange_00035,
R.drawable.v_to_x_warning_circle_orange_00036,
R.drawable.v_to_x_warning_circle_orange_00037,
R.drawable.v_to_x_warning_circle_orange_00038,
R.drawable.v_to_x_warning_circle_orange_00039,
R.drawable.v_to_x_warning_circle_orange_00040,
R.drawable.v_to_x_warning_circle_orange_00041,
R.drawable.v_to_x_warning_circle_orange_00042,
R.drawable.v_to_x_warning_circle_orange_00043,
R.drawable.v_to_x_warning_circle_orange_00044,
R.drawable.v_to_x_warning_circle_orange_00045,
R.drawable.v_to_x_warning_circle_orange_00046,
R.drawable.v_to_x_warning_circle_orange_00047,
R.drawable.v_to_x_warning_circle_orange_00048
R.drawable.module_service_ic_warning_circle_orange_00000,
R.drawable.module_service_ic_warning_circle_orange_00001,
R.drawable.module_service_ic_warning_circle_orange_00002,
R.drawable.module_service_ic_warning_circle_orange_00003,
R.drawable.module_service_ic_warning_circle_orange_00004,
R.drawable.module_service_ic_warning_circle_orange_00005,
R.drawable.module_service_ic_warning_circle_orange_00006,
R.drawable.module_service_ic_warning_circle_orange_00007,
R.drawable.module_service_ic_warning_circle_orange_00008,
R.drawable.module_service_ic_warning_circle_orange_00009,
R.drawable.module_service_ic_warning_circle_orange_00010,
R.drawable.module_service_ic_warning_circle_orange_00011,
R.drawable.module_service_ic_warning_circle_orange_00012,
R.drawable.module_service_ic_warning_circle_orange_00013,
R.drawable.module_service_ic_warning_circle_orange_00014,
R.drawable.module_service_ic_warning_circle_orange_00015,
R.drawable.module_service_ic_warning_circle_orange_00016,
R.drawable.module_service_ic_warning_circle_orange_00017,
R.drawable.module_service_ic_warning_circle_orange_00018,
R.drawable.module_service_ic_warning_circle_orange_00019,
R.drawable.module_service_ic_warning_circle_orange_00020,
R.drawable.module_service_ic_warning_circle_orange_00021,
R.drawable.module_service_ic_warning_circle_orange_00022,
R.drawable.module_service_ic_warning_circle_orange_00023,
R.drawable.module_service_ic_warning_circle_orange_00024,
R.drawable.module_service_ic_warning_circle_orange_00025,
R.drawable.module_service_ic_warning_circle_orange_00026,
R.drawable.module_service_ic_warning_circle_orange_00027,
R.drawable.module_service_ic_warning_circle_orange_00028,
R.drawable.module_service_ic_warning_circle_orange_00029,
R.drawable.module_service_ic_warning_circle_orange_00030,
R.drawable.module_service_ic_warning_circle_orange_00031,
R.drawable.module_service_ic_warning_circle_orange_00032,
R.drawable.module_service_ic_warning_circle_orange_00033,
R.drawable.module_service_ic_warning_circle_orange_00034,
R.drawable.module_service_ic_warning_circle_orange_00035,
R.drawable.module_service_ic_warning_circle_orange_00036,
R.drawable.module_service_ic_warning_circle_orange_00037,
R.drawable.module_service_ic_warning_circle_orange_00038,
R.drawable.module_service_ic_warning_circle_orange_00039,
R.drawable.module_service_ic_warning_circle_orange_00040,
R.drawable.module_service_ic_warning_circle_orange_00041,
R.drawable.module_service_ic_warning_circle_orange_00042,
R.drawable.module_service_ic_warning_circle_orange_00043,
R.drawable.module_service_ic_warning_circle_orange_00044,
R.drawable.module_service_ic_warning_circle_orange_00045,
R.drawable.module_service_ic_warning_circle_orange_00046
};
private static volatile CarIconDisplayStrategy sInstance;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

Some files were not shown because too many files have changed in this diff Show More