This commit is contained in:
zhongchao
2022-03-22 10:07:10 +08:00
parent 3a14b5e37d
commit a39f310331
42 changed files with 1317 additions and 201 deletions

View File

@@ -5,10 +5,10 @@ import com.mogo.commons.context.ContextHolderUtil;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.eagle.core.function.autopilot.entity.AutonomousDriveStatusBean;
import com.mogo.eagle.core.function.autopilot.entity.ReportSiteBean;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
import com.mogo.eagle.core.network.RequestOptions;
import com.mogo.eagle.core.network.SubscribeImpl;
import com.mogo.eagle.core.network.utils.GsonUtil;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.constants.HostConst;
import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -30,7 +30,7 @@ public class AdasServiceModel {
private final IAdasApiService mAdasApiService;
private AdasServiceModel() {
this.mAdasApiService = MogoApisHandler.getInstance().getApis().getNetworkApi().create(IAdasApiService.class, HostConst.DATA_SERVICE_HOST);
this.mAdasApiService = MoGoRetrofitFactory.getInstance(HostConst.DATA_SERVICE_HOST).create(IAdasApiService.class);
}
public static AdasServiceModel getInstance() {

View File

@@ -60,7 +60,7 @@ class VehicleMonitoringManager : ICheckProvider, IMogoStatusChangedListener {
}
override fun checkMonitor(context: Context) {
checkNetWork(context, object : ICheckResultCallBack {
checkNetWork( context, object : ICheckResultCallBack {
override fun callBackWithCheckData(data: CheckResultData) {
updateMonitoringStatus(MogoReceiver.ACTION_CHECK_VEHICLE_MONITORING, data.data.vehicle.state)
if (data.data.vehicle.state == 1) {

View File

@@ -1,11 +1,7 @@
package com.mogo.eagle.core.function.check.net;
import android.content.Context;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.eagle.core.data.constants.MogoServicePaths;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
import com.mogo.module.common.constants.HostConst;
import com.mogo.service.network.IMogoNetwork;
/**
* @author liujing
@@ -18,18 +14,15 @@ public class CheckApiServiceFactory {
/**
* 获取指定域名下的 API 服务
*/
public static CheckApiServices getApiService(Context context, String netHost) {
IMogoNetwork network = (IMogoNetwork) ARouter.getInstance()
.build(MogoServicePaths.PATH_SERVICES_NETWORK)
.navigation(context);
return network.create(CheckApiServices.class, netHost);
public static CheckApiServices getApiService(String netHost) {
return MoGoRetrofitFactory.getInstance(netHost).create(CheckApiServices.class);
}
public static CheckApiServices getDataApiService(Context context) {
public static CheckApiServices getDataApiService() {
if (mDataApiService == null) {
synchronized (CheckApiServiceFactory.class) {
if (mDataApiService == null) {
mDataApiService = getApiService(context, HostConst.DATA_SERVICE_HOST);
mDataApiService = getApiService(HostConst.DATA_SERVICE_HOST);
}
}
}

View File

@@ -21,23 +21,23 @@ object CheckNetWork {
//网络请求,获取自车检测结果(工控机上报云端)
fun checkNetWork(context: Context, callbackFlow: ICheckResultCallBack) {
val params = ParamsBuilder.of(false)
.append("sn", MoGoAiCloudClientConfig.getInstance().sn)
.build()
.append("sn", MoGoAiCloudClientConfig.getInstance().sn)
.build()
CheckApiServiceFactory.getDataApiService(context).loadMonitorDetail(params)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : SubscribeImpl<CheckResultData>(RequestOptions.create(context)) {
override fun onSuccess(o: CheckResultData) {
super.onSuccess(o)
ThreadUtils.runOnUiThread { callbackFlow?.callBackWithCheckData(o) }
}
CheckApiServiceFactory.getDataApiService().loadMonitorDetail(params)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : SubscribeImpl<CheckResultData>(RequestOptions.create(context)) {
override fun onSuccess(o: CheckResultData) {
super.onSuccess(o)
ThreadUtils.runOnUiThread { callbackFlow?.callBackWithCheckData(o) }
}
override fun onError(message: String, code: Int) {
super.onError(message, code)
ThreadUtils.runOnUiThread { callbackFlow?.callBackWithError(message,code) }
}
})
override fun onError(message: String, code: Int) {
super.onError(message, code)
ThreadUtils.runOnUiThread { callbackFlow?.callBackWithError(message, code) }
}
})
}
}

View File

@@ -14,6 +14,7 @@ import com.zhjt.mogo_core_function_devatools.feedback.FeedbackManager
import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager
import com.zhjt.mogo_core_function_devatools.scene.SceneManager.Companion.sceneManager
import com.zhjt.mogo_core_function_devatools.trace.TraceManager.Companion.traceManager
import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeManager.Companion.upgradeManager
import record_cache.RecordPanelOuterClass
@Route(path = MogoServicePaths.PATH_DEVA_TOOLS)
@@ -23,10 +24,13 @@ class DevaToolsProvider : IDevaToolsProvider {
const val MODULE_NAME = "DevaTools"
}
private var mContext: Context? = null
override val functionName: String
get() = "DevaToolsProvider"
override fun init(context: Context) {
mContext = context
traceManager.init(context)
MogoLogCatchManager.init(context)
}
@@ -80,6 +84,14 @@ class DevaToolsProvider : IDevaToolsProvider {
FeedbackManager.showFeedbackWindow(ctx)
}
override fun getUpgradeVersionUrls(versionName: String) {
upgradeManager.getPackageUrls(versionName)
}
override fun downLoadPackage(downLoadKey: String) {
// upgradeManager.downLoadPackage(mContext!!, downLoadKey)
}
override fun onDestroy() {
MogoLogCatchManager.onDestroy()
}

View File

@@ -0,0 +1,49 @@
package com.zhjt.mogo_core_function_devatools.upgrade
import android.content.Context
import com.mogo.commons.context.ContextHolderUtil
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.utilcode.breakpoint.Config
import com.mogo.eagle.core.utilcode.breakpoint.utils.DownloadUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA
import com.zhjt.mogo_core_function_devatools.upgrade.network.UpgradeVersionNetWorkModel
class UpgradeManager {
companion object {
const val TAG = "UpgradeManager"
val upgradeManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
UpgradeManager()
}
}
private val upgradeVersionNetWorkModel = UpgradeVersionNetWorkModel()
private var map: Map<String, String>? = null
private var version: String? = null
fun getPackageUrls(version: String) {
this.version = version
upgradeVersionNetWorkModel.requestUpgradeVersionUrls(version, onSuccess = {
map = it
CallerDevaToolsListenerManager.invokeDevaToolsUpgradeVersionUrls(map)
}, onError = {
CallerLogger.e("$M_DEVA$TAG", " getPackageUrls error: $it")
})
}
fun downLoadPackage(context: Context, downLoadKey: String) {
// val downLoadUrl = map?.get(downLoadKey)
// downLoadUrl?.let {
DownloadUtils.downLoad(
context,
"https://scm-1255510688.cos.ap-beijing.myqcloud.com/test/com.mogo.launcher.f/2.5.1.1009/IntelligentPilot_v2.5.1.1009_20220216_[fPadLenovoOchTaxi-launcher-online]_debug.apk",
Config.downLoadPath,
downLoadKey,
5
)
// }
}
}

View File

@@ -0,0 +1,22 @@
package com.zhjt.mogo_core_function_devatools.upgrade.network
import com.mogo.commons.debug.DebugConfig
class HostConst {
companion object {
private const val HOST_DEV = "http://myflow.ee-private-dev.myghost.zhidaoauto.com"
private const val HOST_RELEASE = "https://myflow.zhidaoauto.com"
fun getBaseUrl(): String {
return when (DebugConfig.getNetMode()) {
DebugConfig.NET_MODE_DEV -> HOST_DEV
DebugConfig.NET_MODE_QA -> HOST_DEV
DebugConfig.NET_MODE_DEMO -> HOST_RELEASE
DebugConfig.NET_MODE_RELEASE -> HOST_RELEASE
else -> HOST_RELEASE
}
}
}
}

View File

@@ -0,0 +1,12 @@
package com.zhjt.mogo_core_function_devatools.upgrade.network
import com.mogo.eagle.core.data.Response
import retrofit2.http.GET
import retrofit2.http.Query
interface UpgradeVersionApiService {
@GET("/backend/app/getApkInfo")
suspend fun getUpgradeVersion(@Query("fileName") versionName: String): Response<Any>
}

View File

@@ -0,0 +1,49 @@
package com.zhjt.mogo_core_function_devatools.upgrade.network
import com.mogo.eagle.core.data.Response
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.network.apiResponseCall
import com.mogo.eagle.core.network.request
import com.mogo.module.common.constants.HostConst
import com.zhjt.mogo_core_function_devatools.upgrade.network.HostConst.Companion.getBaseUrl
class UpgradeVersionNetWorkModel {
private fun getNetWorkApi(baseUrl: String = HostConst.CITY_HOST): UpgradeVersionApiService {
return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl)
.create(UpgradeVersionApiService::class.java)
}
fun requestUpgradeVersionUrls(
versionName: String,
onSuccess: ((Map<String, String>) -> Unit),
onError: ((String) -> Unit)
) {
request<Response<Any?>> {
loader {
apiResponseCall {
getNetWorkApi(getBaseUrl()).getUpgradeVersion(
versionName
)
}
}
onSuccess {
if (it.data != null) {
val jsonData = it.data.toString()
val map = mutableMapOf<String, String>()
jsonData.split(",").forEach { data ->
val array = data.split("=")
map[array[0]] = array[1]
}
onSuccess.invoke(map)
} else {
onError.invoke("没有获取到最新版本信息")
}
}
onError {
onError.invoke(it.message ?: "获取最新版本信息失败")
}
}
}
}

View File

@@ -9,6 +9,7 @@ import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo;
import com.mogo.eagle.core.data.autopilot.AutopilotStatus;
import com.mogo.eagle.core.data.dispatch.ReportDispatchResult;
import com.mogo.eagle.core.data.dispatch.ReportedRoute;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
import com.mogo.eagle.core.network.RequestOptions;
import com.mogo.eagle.core.network.SubscribeImpl;
import com.mogo.eagle.core.network.utils.GsonUtil;
@@ -34,7 +35,7 @@ public class DispatchServiceModel {
private final IDispatchAdasApiService mAdasApiService;
private DispatchServiceModel() {
mAdasApiService = MogoApisHandler.getInstance().getApis().getNetworkApi().create(IDispatchAdasApiService.class, DATA_SERVICE_HOST);
mAdasApiService = MoGoRetrofitFactory.getInstance(DATA_SERVICE_HOST).create(IDispatchAdasApiService.class);
}
public static DispatchServiceModel getInstance() {

View File

@@ -3,10 +3,12 @@ package com.mogo.eagle.core.function.hmi.ui.setting
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Color
import android.os.Build
import android.text.Html
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.annotation.RequiresApi
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.mogo.cloud.passport.MoGoAiCloudClient
@@ -145,6 +147,8 @@ class DebugSettingView @JvmOverloads constructor(
CallerAutopilotIdentifyListenerManager.addListener(TAG, this)
// 添加 规划路径相关回调 监听
CallerAutopilotPlanningListenerManager.addListener(TAG, this)
// 添加 工控机基础信息回调 监听
CallerAutopilotCarConfigListenerManager.addListener(TAG, this)
if (logInfoView != null) {
logInfoView!!.onEnterForeground()
}
@@ -890,6 +894,10 @@ class DebugSettingView @JvmOverloads constructor(
override fun moduleLogChanged(moduleTag: MutableMap<String, SceneModule>) {
//todo 模块日志 tag 发生变化,需要更新对应 UI
}
override fun upgradeVersionUrls(urls: Map<String, String>?) {
//todo 版本信息更新
}
})
/**
@@ -1145,6 +1153,7 @@ class DebugSettingView @JvmOverloads constructor(
mGnssInfo = gnssInfo
}
@RequiresApi(Build.VERSION_CODES.N)
override fun onAutopilotIdentifyDataUpdate(trafficData: List<MessagePad.TrackedObject>?) {
// 重制数据
mIdentifyDataSize = 0

View File

@@ -10,12 +10,12 @@ import com.mogo.commons.AbsMogoApplication;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
import com.mogo.eagle.core.network.RequestOptions;
import com.mogo.eagle.core.network.SubscribeImpl;
import com.mogo.eagle.core.network.utils.GsonUtil;
import com.mogo.eagle.core.utilcode.util.NetworkUtils;
import com.mogo.map.location.IMogoLocationClient;
import com.mogo.module.common.MogoApisHandler;
import io.reactivex.schedulers.Schedulers;
import okhttp3.MediaType;
@@ -79,8 +79,7 @@ public class DelayCheckUtil implements Handler.Callback {
private void startEmptyRequest() {
requestTime = SystemClock.elapsedRealtime();
requestStartSystemTime = System.currentTimeMillis();
MogoApisHandler.getInstance().getApis().getNetworkApi()
.create(DelayCheckApiServices.class, DelayCheckHttpConstant.getBaseUrl())
MoGoRetrofitFactory.getInstance(DelayCheckHttpConstant.getBaseUrl()).create(DelayCheckApiServices.class)
.emptyInterface().subscribeOn(Schedulers.io()).observeOn(Schedulers.io())
.subscribe(new SubscribeImpl<BaseData>(RequestOptions.create(context)) {
@Override
@@ -128,8 +127,7 @@ public class DelayCheckUtil implements Handler.Callback {
RequestBody params = RequestBody.create(MediaType.get("application/json"), GsonUtil.jsonFromObject(request));
MogoApisHandler.getInstance().getApis().getNetworkApi()
.create(DelayCheckApiServices.class, DelayCheckHttpConstant.getBaseUrl())
MoGoRetrofitFactory.getInstance(DelayCheckHttpConstant.getBaseUrl()).create(DelayCheckApiServices.class)
.uploadDelayCheckData(params).observeOn(Schedulers.io()).subscribeOn(Schedulers.io())
.subscribe(new SubscribeImpl<DelayCheckResponse>(RequestOptions.create(context)) {
@Override

View File

@@ -6,10 +6,11 @@ import android.os.Looper
import android.os.Message
import com.mogo.eagle.core.data.camera.CameraEntity
import com.mogo.eagle.core.data.camera.ReqLiveCarBean
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MONITOR
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.function.monitoring.net.CameraListServices
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MONITOR
import com.mogo.map.MogoLocationClient
import com.mogo.module.common.MogoApisHandler
import com.mogo.module.common.constants.HostConst
@@ -58,7 +59,8 @@ class CronTaskManager(private var context: Context?) {
@Deprecated("已废弃", ReplaceWith("requestDeviceList()"), DeprecationLevel.WARNING)
private fun requestCameraList() {
// 衡阳可直播的摄像头有限先写死roadId便于调试
disposable = netWork.create(CameraListServices::class.java, HostConst.CAMERA_STREAM_HOST)
disposable = MoGoRetrofitFactory.getInstance(HostConst.CAMERA_STREAM_HOST)
.create(CameraListServices::class.java)
.getCameraList("10849")
.subscribeOn(Schedulers.io())
.map { cameraListInfo ->
@@ -88,7 +90,8 @@ class CronTaskManager(private var context: Context?) {
*/
private fun requestDeviceList() {
MogoLocationClient.getInstance(context).lastKnowLocation?.let { location ->
disposable = netWork.create(CameraListServices::class.java, HostConst.CITY_HOST)
disposable = MoGoRetrofitFactory.getInstance(HostConst.CITY_HOST)
.create(CameraListServices::class.java)
.getDeviceList(location.longitude, location.latitude, 500)
.subscribeOn(Schedulers.io())
.map { cameraListInfo ->
@@ -121,32 +124,32 @@ class CronTaskManager(private var context: Context?) {
private fun requestCarCameraList() {
MogoLocationClient.getInstance(context).lastKnowLocation?.let { location ->
carDisposable =
netWork.create(CameraListServices::class.java, HostConst.CITY_HOST)
.getCarCameraList(ReqLiveCarBean(location.longitude, location.latitude))
.subscribeOn(Schedulers.io())
.map { liveCarCameraInfo ->
liveCarCameraInfo.result?.liveCamera?.filter { liveCarCamera ->
!liveCarCamera.videoSn.isNullOrEmpty()
}?.map { cameraInfo ->
CameraEntity(
sn = cameraInfo.videoSn,
street = cameraInfo.street,
township = cameraInfo.township
)
} ?: ArrayList()
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
carCameraList = it
// CallerLogger.d("$M_MONITOR$TAG", "requestCarCameraList返回结果为$it")
}, {
CallerLogger.e(
"$M_MONITOR$TAG",
"message is:${it.message}, cause is:${it.cause}"
carDisposable = MoGoRetrofitFactory.getInstance(HostConst.CITY_HOST)
.create(CameraListServices::class.java)
.getCarCameraList(ReqLiveCarBean(location.longitude, location.latitude))
.subscribeOn(Schedulers.io())
.map { liveCarCameraInfo ->
liveCarCameraInfo.result?.liveCamera?.filter { liveCarCamera ->
!liveCarCamera.videoSn.isNullOrEmpty()
}?.map { cameraInfo ->
CameraEntity(
sn = cameraInfo.videoSn,
street = cameraInfo.street,
township = cameraInfo.township
)
it.printStackTrace()
})
} ?: ArrayList()
}
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
carCameraList = it
// CallerLogger.d("$M_MONITOR$TAG", "requestCarCameraList返回结果为$it")
}, {
CallerLogger.e(
"$M_MONITOR$TAG",
"message is:${it.message}, cause is:${it.cause}"
)
it.printStackTrace()
})
} ?: run {
CallerLogger.e("$M_MONITOR$TAG", "CurrentLocation is null!")
}
@@ -160,26 +163,26 @@ class CronTaskManager(private var context: Context?) {
streamDisposable?.let {
if (!it.isDisposed) it.dispose()
}
streamDisposable =
netWork.create(CameraListServices::class.java, HostConst.OPEN_CAMERA_STREAM_HOST)
.openCameraStream(cameraIp)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
CallerLogger.d("$M_MONITOR$TAG", "openCameraStream返回结果为$it")
it.result?.let { streamResult ->
if (!streamResult.flvUrl.isNullOrEmpty()) CallerHmiManager.startRoadCameraLive(
streamResult.flvUrl!!
)
}
}, {
CallerLogger.e(
"$M_MONITOR$TAG",
"openCameraStream&message is:${it.message}, cause is:${it.cause}"
streamDisposable = MoGoRetrofitFactory.getInstance(HostConst.OPEN_CAMERA_STREAM_HOST)
.create(CameraListServices::class.java)
.openCameraStream(cameraIp)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
CallerLogger.d("$M_MONITOR$TAG", "openCameraStream返回结果为$it")
it.result?.let { streamResult ->
if (!streamResult.flvUrl.isNullOrEmpty()) CallerHmiManager.startRoadCameraLive(
streamResult.flvUrl!!
)
CallerHmiManager.showNoSignalView()
it.printStackTrace()
})
}
}, {
CallerLogger.e(
"$M_MONITOR$TAG",
"openCameraStream&message is:${it.message}, cause is:${it.cause}"
)
CallerHmiManager.showNoSignalView()
it.printStackTrace()
})
}
/**
@@ -189,7 +192,8 @@ class CronTaskManager(private var context: Context?) {
streamDisposable?.let {
if (!it.isDisposed) it.dispose()
}
streamDisposable = netWork.create(CameraListServices::class.java, HostConst.CITY_HOST)
streamDisposable = MoGoRetrofitFactory.getInstance(HostConst.CITY_HOST)
.create(CameraListServices::class.java)
.reqOpenCameraStream(cameraIp)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

View File

@@ -1,11 +1,7 @@
package com.mogo.eagle.core.function.v2x.events.network;
import android.content.Context;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.eagle.core.data.constants.MogoServicePaths;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
import com.mogo.module.common.constants.HostConst;
import com.mogo.service.network.IMogoNetwork;
/**
* 应对不同接口对应不同服务域名的工厂累
@@ -16,54 +12,52 @@ public class V2XApiServiceFactory {
private static V2XApiService mGeoFenceCarServiceApiService;
private static V2XApiService mRealtimeLocationApiService;
private static V2XApiService mDataServiceApiService;
/**
* 获取指定域名下的 API 服务
*/
public static V2XApiService getApiService(Context context, String netHost) {
IMogoNetwork network = (IMogoNetwork) ARouter.getInstance()
.build(MogoServicePaths.PATH_SERVICES_NETWORK)
.navigation(context);
return network.create(V2XApiService.class, netHost);
public static V2XApiService getApiService(String netHost) {
return MoGoRetrofitFactory.getInstance(netHost).create(V2XApiService.class);
}
public static V2XApiService getDevaApiService(Context context) {
public static V2XApiService getDevaApiService() {
if (mDevaApiService == null) {
synchronized (V2XApiServiceFactory.class) {
if (mDevaApiService == null) {
mDevaApiService = getApiService(context, HostConst.DEVA_HOST);
mDevaApiService = getApiService(HostConst.DEVA_HOST);
}
}
}
return mDevaApiService;
}
public static V2XApiService getGeoFenceCarServiceApiService(Context context) {
public static V2XApiService getGeoFenceCarServiceApiService() {
if (mGeoFenceCarServiceApiService == null) {
synchronized (V2XApiServiceFactory.class) {
if (mGeoFenceCarServiceApiService == null) {
mGeoFenceCarServiceApiService = getApiService(context, HostConst.GEOFENCE_HOST);
mGeoFenceCarServiceApiService = getApiService(HostConst.GEOFENCE_HOST);
}
}
}
return mGeoFenceCarServiceApiService;
}
public static V2XApiService getRealtimeLocationApiService(Context context) {
public static V2XApiService getRealtimeLocationApiService() {
if (mRealtimeLocationApiService == null) {
synchronized (V2XApiServiceFactory.class) {
if (mRealtimeLocationApiService == null) {
mRealtimeLocationApiService = getApiService(context, HostConst.REALTIME_LOCATION_HOST);
mRealtimeLocationApiService = getApiService(HostConst.REALTIME_LOCATION_HOST);
}
}
}
return mRealtimeLocationApiService;
}
public static V2XApiService getStrategyPushApiService(Context context) {
public static V2XApiService getStrategyPushApiService() {
if (mDataServiceApiService == null) {
synchronized (V2XApiServiceFactory.class) {
if (mDataServiceApiService == null) {
mDataServiceApiService = getApiService(context, HostConst.STRATEGY_PUSH_HOST);
mDataServiceApiService = getApiService(HostConst.STRATEGY_PUSH_HOST);
}
}
}

View File

@@ -57,7 +57,7 @@ public class V2XRefreshModel {
public void giveLikeLiveVideo(final V2XRefreshCallback callback, String snStr) {
final Map<String, Object> query = new ParamsProvider.Builder(mContext).build();
query.put("data", "{\"sn\":" + snStr + "}");
V2XApiServiceFactory.getGeoFenceCarServiceApiService(mContext).giveLikeLiveVideo(query)
V2XApiServiceFactory.getGeoFenceCarServiceApiService().giveLikeLiveVideo(query)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<BaseData>(RequestOptions.create(mContext)) {
@@ -92,7 +92,7 @@ public class V2XRefreshModel {
okhttp3.MediaType.parse("application/json; charset=utf-8"),
"{\"sn\":\"" + sn + "\"}");
V2XApiServiceFactory.getRealtimeLocationApiService(mContext).queryUserInfoBySn(body)
V2XApiServiceFactory.getRealtimeLocationApiService().queryUserInfoBySn(body)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<V2XUserInfoRes>(RequestOptions.create(mContext)) {
@@ -142,7 +142,7 @@ public class V2XRefreshModel {
dataStr.append("}");
query.put("data", dataStr.toString());
V2XApiServiceFactory.getRealtimeLocationApiService(mContext).queryNearbyVehicleLiveByLocation(query)
V2XApiServiceFactory.getRealtimeLocationApiService().queryNearbyVehicleLiveByLocation(query)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<V2XLiveCarRes>(RequestOptions.create(mContext)) {
@@ -182,7 +182,7 @@ public class V2XRefreshModel {
.append(0)
.append("}").toString();
map.put("data", json);
V2XApiServiceFactory.getRealtimeLocationApiService(mContext).sendHelpSignal(map).subscribeOn(Schedulers.io())
V2XApiServiceFactory.getRealtimeLocationApiService().sendHelpSignal(map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<BaseData>(RequestOptions.create(mContext)) {
@Override
@@ -225,7 +225,7 @@ public class V2XRefreshModel {
.append("\"sn\":").append(MoGoAiCloudClientConfig.getInstance().getSn())
.append("}").toString();
map.put("data", json);
V2XApiServiceFactory.getDevaApiService(mContext).addPoiInfoFabulous(map).subscribeOn(Schedulers.io())
V2XApiServiceFactory.getDevaApiService().addPoiInfoFabulous(map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<BaseData>(RequestOptions.create(mContext)) {
@Override
@@ -263,7 +263,7 @@ public class V2XRefreshModel {
.append("\"enthusiasticSn\":").append(MoGoAiCloudClientConfig.getInstance().getSn())
.append("}").toString();
map.put("data", json);
V2XApiServiceFactory.getDevaApiService(mContext).respondingToHelp(map).subscribeOn(Schedulers.io())
V2XApiServiceFactory.getDevaApiService().respondingToHelp(map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<BaseData>(RequestOptions.create(mContext)) {
@Override
@@ -290,7 +290,7 @@ public class V2XRefreshModel {
final Map<String, Object> map = new ParamsProvider.Builder(mContext).build();
String json = "{" + "\"id\":\"" + id + "\"," + "\"sn\":\"" + MoGoAiCloudClientConfig.getInstance().getSn() + "\"," + "\"status\":" + status + "," + "\"helpId\":\"" + helpId + "\"}";
map.put("data", json);
V2XApiServiceFactory.getDevaApiService(mContext).manualMarkingTrafficJam(map).subscribeOn(Schedulers.io())
V2XApiServiceFactory.getDevaApiService().manualMarkingTrafficJam(map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<BaseData>(RequestOptions.create(mContext)) {
@Override
@@ -309,7 +309,7 @@ public class V2XRefreshModel {
* 根据名称获取策略详情
*/
public void getStrategyPush(V2XRefreshCallback<V2XStrategyPushRes> callback) {
V2XApiServiceFactory.getStrategyPushApiService(mContext).getStrategyPush().subscribeOn(Schedulers.io())
V2XApiServiceFactory.getStrategyPushApiService().getStrategyPush().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<V2XStrategyPushRes>(RequestOptions.create(mContext)) {
@Override
@@ -341,7 +341,7 @@ public class V2XRefreshModel {
public void getHelpSignal(V2XRefreshCallback<V2XSeekHelpRes> callback) {
final Map<String, Object> map = new ParamsProvider.Builder(mContext).build();
map.put("sn", MoGoAiCloudClientConfig.getInstance().getSn());
V2XApiServiceFactory.getRealtimeLocationApiService(mContext).queryHelpSignal(map).subscribeOn(Schedulers.io())
V2XApiServiceFactory.getRealtimeLocationApiService().queryHelpSignal(map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<V2XSeekHelpRes>(RequestOptions.create(mContext)) {
@Override

View File

@@ -104,7 +104,7 @@ public class V2XShareNetworkModel {
builder.append("data", GsonUtil.jsonFromObject(hashMap));
Map<String, Object> parameters = builder.build();
//热心指数
V2XApiServiceFactory.getDevaApiService(mContext).getEnthusiasmIndex(parameters)
V2XApiServiceFactory.getDevaApiService().getEnthusiasmIndex(parameters)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<BaseData>(RequestOptions.create((mContext))) {
@@ -148,7 +148,7 @@ public class V2XShareNetworkModel {
builder.append("data", GsonUtil.jsonFromObject(hashMap));
Map<String, Object> parameters = builder.build();
V2XApiServiceFactory.getDevaApiService(mContext).getShareEventList(parameters)
V2XApiServiceFactory.getDevaApiService().getShareEventList(parameters)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<BaseData>(RequestOptions.create(mContext)) {

View File

@@ -4,19 +4,17 @@ import com.google.gson.Gson
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.trafficlight.*
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.network.apiCall
import com.mogo.eagle.core.network.cancel
import com.mogo.eagle.core.network.request
import com.mogo.module.common.MogoApisHandler
import com.mogo.module.common.constants.HostConst.CITY_HOST
class TrafficLightNetWorkModel {
private fun getNetWorkApi(baseUrl: String = CITY_HOST): TrafficLightApiService {
return MogoApisHandler.getInstance().apis.networkApi.createNoCallAdapter(
TrafficLightApiService::class.java, baseUrl
)
return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl)
.create(TrafficLightApiService::class.java)
}
fun requestRoadID(
@@ -86,10 +84,10 @@ class TrafficLightNetWorkModel {
}
}
onSuccess {
if(it.result!=null){
if (it.result != null) {
onSuccess.invoke(it.result)
}else{
onError.invoke(it.msg?:"返回result数据为null")
} else {
onError.invoke(it.msg ?: "返回result数据为null")
}
}
onError {
@@ -115,7 +113,8 @@ class TrafficLightNetWorkModel {
request<BaseResponse<Any>> {
val map = hashMapOf<String, String>()
start {
val trafficLightRequestData = ChangeLightRequestData(lightId, crossingNo, heading, controlTime)
val trafficLightRequestData =
ChangeLightRequestData(lightId, crossingNo, heading, controlTime)
map["sn"] = MoGoAiCloudClientConfig.getInstance().sn
map["data"] = Gson().toJson(trafficLightRequestData)
}

View File

@@ -3,18 +3,17 @@ package com.mogo.eagle.core.function.v2x.vip.network
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.v2x.VipRequest
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.network.apiCall
import com.mogo.eagle.core.network.request
import com.mogo.module.common.MogoApisHandler
import com.mogo.module.common.constants.HostConst.DATA_SERVICE_HOST
class VipNetWorkModel {
private fun getNetWorkApi(baseUrl: String = DATA_SERVICE_HOST): VipApiService {
return MogoApisHandler.getInstance().apis.networkApi.createNoCallAdapter(
VipApiService::class.java, baseUrl
)
return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl)
.create(VipApiService::class.java)
}
fun requestVip(onSuccess: ((VipRequest) -> Unit), onError: ((String) -> Unit)) {

View File

@@ -1,3 +1,5 @@
package com.mogo.eagle.core.data
class BaseResponse<out T>(val code: Int, val msg: String, val result: T)
class Response<out T>(val code: Int, val msg: String, val data: T)

View File

@@ -79,4 +79,14 @@ interface IDevaToolsProvider : IMoGoFunctionServerProvider {
* 展示反馈页面
*/
fun showFeedbackWindow(ctx: Context)
/**
* 获取升级版本Urls
*/
fun getUpgradeVersionUrls(versionName: String)
/**
* 下载指定包
*/
fun downLoadPackage(downLoadKey:String)
}

View File

@@ -24,4 +24,9 @@ interface IMoGoDevaToolsListener {
* 模块TAG更新回调
*/
fun moduleLogChanged(moduleTag: MutableMap<String, SceneModule>)
/**
* 版本升级Urls
*/
fun upgradeVersionUrls(urls: Map<String, String>?)
}

View File

@@ -65,11 +65,18 @@ object CallerDevaToolsListenerManager {
}
}
fun invokeDevaToolsModuleLogChanges(moduleTag: MutableMap<String, SceneModule>){
fun invokeDevaToolsModuleLogChanges(moduleTag: MutableMap<String, SceneModule>) {
M_DEVA_TOOLS_LISTENER.forEach {
val listener = it.value
listener.moduleLogChanged(moduleTag)
}
}
fun invokeDevaToolsUpgradeVersionUrls(urls: Map<String, String>?) {
M_DEVA_TOOLS_LISTENER.forEach {
val listener = it.value
listener.upgradeVersionUrls(urls)
}
}
}

View File

@@ -103,4 +103,18 @@ object CallerDevaToolsManager {
fun showFeedbackView(ctx: Context) {
devaToolsProviderApi?.showFeedbackWindow(ctx)
}
/**
* 获取升级版本Urls
*/
fun getUpgradeVersionUrls(versionName: String) {
devaToolsProviderApi?.getUpgradeVersionUrls(versionName)
}
/**
* 下载指定包
*/
fun downLoadPackage(downLoadKey: String) {
devaToolsProviderApi?.downLoadPackage(downLoadKey)
}
}

View File

@@ -2,6 +2,7 @@ package com.mogo.eagle.core.network
import androidx.lifecycle.LifecycleOwner
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.Response
import com.mogo.eagle.core.network.exception.ApiException
import com.mogo.eagle.core.network.exception.CommonException.Companion.NETWORK_EXCEPTION
import com.mogo.eagle.core.network.exception.CommonException.Companion.NULL_EXCEPTION
@@ -65,7 +66,13 @@ class Request<T> {
}
val result = deferred.await()
if (result != null && result is BaseResponse<*>) {
if (result != null && (result is BaseResponse<*>)) {
if (result.code == 0 || result.code == 200) {
onSuccess?.invoke(result)
} else {
throw ApiException(result.code, result.msg)
}
} else if (result is Response<*>) {
if (result.code == 0 || result.code == 200) {
onSuccess?.invoke(result)
} else {
@@ -114,3 +121,8 @@ fun cancel(requestKey: String) {
suspend fun <T : Any> apiCall(call: suspend () -> BaseResponse<T>): BaseResponse<T> {
return call.invoke()
}
suspend fun <T : Any> apiResponseCall(call: suspend () -> Response<T>): Response<T> {
return call.invoke()
}

View File

@@ -2,6 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mogo.eagle.core.utilcode.util">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
<application>
@@ -35,5 +36,9 @@
<action android:name="${applicationId}.messenger" />
</intent-filter>
</service>
<service android:name="com.mogo.eagle.core.utilcode.breakpoint.services.DownloadService"/>
<receiver android:name=".NetworkUtils$NetworkChangedReceiver"/>
</application>
</manifest>

View File

@@ -0,0 +1,17 @@
package com.mogo.eagle.core.utilcode.breakpoint;
import android.os.Environment;
/**
* Created by kun on 2016/11/10.
* 配置类
*/
public class Config {
/**
* 文件下载地址
*/
public final static String downLoadPath = Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/downloads/";
public final static String DOWN_LOAD_TAG = "Package-DownLoad";
}

View File

@@ -0,0 +1,100 @@
package com.mogo.eagle.core.utilcode.breakpoint.bean;
import java.io.Serializable;
public class FileBean implements Serializable {
private int id;
private String savePath;
private String fileName;
private String url;
private int length;
private int finished;
private int threadCount;
public FileBean() {
}
public FileBean(int id, String fileName, String url, int finished) {
this.id = id;
this.fileName = fileName;
this.url = url;
this.finished = finished;
}
public FileBean(int id, String savePath,String fileName, String url, int finished) {
this.id = id;
this.savePath = savePath;
this.fileName = fileName;
this.url = url;
this.finished = finished;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getFinished() {
return finished;
}
public void setFinished(int finished) {
this.finished = finished;
}
public int getThreadCount() {
return threadCount;
}
public void setThreadCount(int threadCount) {
this.threadCount = threadCount;
}
@Override
public String toString() {
int progress = (int) (finished*1.0f/length *100);
return "FileBean{" +
"id=" + id +
", fileName='" + fileName + '\'' +
", length=" + length +
", finished=" + finished +
"progress="+progress+
'}';
}
}

View File

@@ -0,0 +1,77 @@
package com.mogo.eagle.core.utilcode.breakpoint.bean;
import java.io.Serializable;
/**
* Created by kun on 2016/11/10.
*/
public class ThreadBean implements Serializable{
private int id;
private String url;
private int start;
private int end;
private int finished;
public ThreadBean() {
}
public ThreadBean(int id, String url, int start, int end, int finished) {
this.id = id;
this.url = url;
this.start = start;
this.end = end;
this.finished = finished;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public int getFinished() {
return finished;
}
public void setFinished(int finished) {
this.finished = finished;
}
@Override
public String toString() {
return "ThreadBean{" +
"id=" + id +
", url='" + url + '\'' +
", start=" + start +
", end=" + end +
", finished=" + finished +
'}';
}
}

View File

@@ -0,0 +1,27 @@
package com.mogo.eagle.core.utilcode.breakpoint.callback;
import com.mogo.eagle.core.utilcode.breakpoint.bean.ThreadBean;
/**
* Created by kun on 2016/11/11.
* 下载进度回调
*/
public interface DownloadCallBack {
/**
* 暂停回调
* @param threadBean
*/
void pauseCallBack(ThreadBean threadBean);
/**
* 下载进度
* @param length
*/
void progressCallBack(int length);
/**
* 线程下载完毕
* @param threadBean
*/
void threadDownLoadFinished(ThreadBean threadBean);
}

View File

@@ -0,0 +1,35 @@
package com.mogo.eagle.core.utilcode.breakpoint.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by kun on 2016/11/10.
*/
public class DBHelper extends SQLiteOpenHelper{
private static final String DB_NAME = "download.db";
private static DBHelper dbHelper = null;
public static DBHelper getInstance(Context context){
if(dbHelper==null) dbHelper = new DBHelper(context);
return dbHelper;
}
private DBHelper(Context context) {
super(context, DB_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table thread_info (_id integer primary key autoincrement," +
"thread_id integer,url text,start integer,ends integer,finished integer)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}

View File

@@ -0,0 +1,43 @@
package com.mogo.eagle.core.utilcode.breakpoint.db.dao;
import com.mogo.eagle.core.utilcode.breakpoint.bean.ThreadBean;
import java.util.List;
public interface ThreadDao {
/**
* 插入下载线程信息
* @param threadBean
*/
void insertThread(ThreadBean threadBean);
/**
* 更新下载线程信息
* @param url
* @param thread_id
* @param finished
*/
void updateThread(String url, int thread_id, int finished);
/**
* 删除下载线程
* @param url
*/
void deleteThread(String url);
/**
* 获取下载线程
* @param url
* @return
*/
List<ThreadBean> getThreads(String url);
/**
* 判断下载线程是否存在
* @param url
* @param thread_id
* @return
*/
boolean isExists(String url, int thread_id);
}

View File

@@ -0,0 +1,73 @@
package com.mogo.eagle.core.utilcode.breakpoint.db.impl;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.mogo.eagle.core.utilcode.breakpoint.bean.ThreadBean;
import com.mogo.eagle.core.utilcode.breakpoint.db.DBHelper;
import com.mogo.eagle.core.utilcode.breakpoint.db.dao.ThreadDao;
import java.util.ArrayList;
import java.util.List;
public class ThreadDaoImpl implements ThreadDao {
private DBHelper dbHelper;
public ThreadDaoImpl(Context context){
dbHelper = DBHelper.getInstance(context);
}
@Override
public synchronized void insertThread(ThreadBean threadBean) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("insert into thread_info ( thread_id, url, start, ends, finished) values (?,?,?,?,?)"
,new Object[]{threadBean.getId(),threadBean.getUrl(),threadBean.getStart(),threadBean.getEnd(),threadBean.getFinished()});
db.close();
}
@Override
public synchronized void updateThread(String url, int thread_id, int finished) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("update thread_info set finished = ? where url = ? and thread_id = ?"
,new Object[]{finished,url,thread_id});
db.close();
}
@Override
public void deleteThread(String url) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("delete from thread_info where url = ?",new Object[]{url});
db.close();
}
@Override
public List<ThreadBean> getThreads(String url) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from thread_info where url = ?",new String[]{url});
List<ThreadBean> threadBeanList = new ArrayList<>();
while (cursor.moveToNext()){
ThreadBean bean = new ThreadBean();
bean.setId(cursor.getInt(cursor.getColumnIndex("thread_id")));
bean.setUrl(cursor.getString(cursor.getColumnIndex("url")));
bean.setStart(cursor.getInt(cursor.getColumnIndex("start")));
bean.setEnd(cursor.getInt(cursor.getColumnIndex("ends")));
bean.setFinished(cursor.getInt(cursor.getColumnIndex("finished")));
threadBeanList.add(bean);
}
cursor.close();
db.close();
return threadBeanList;
}
@Override
public boolean isExists(String url, int thread_id) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from thread_info where url = ? and thread_id = ?", new String[]{url,thread_id+""});
boolean exists = cursor.moveToNext();
cursor.close();
db.close();
return exists;
}
}

View File

@@ -0,0 +1,52 @@
package com.mogo.eagle.core.utilcode.breakpoint.event;
/**
* Created by G40-70M on 2016/11/16.
*/
public class DownloadData {
private String url;
private int progress;
private int length;
private String msg;
private String filePath;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getProgress() {
return progress;
}
public void setProgress(int progress) {
this.progress = progress;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
}

View File

@@ -0,0 +1,171 @@
package com.mogo.eagle.core.utilcode.breakpoint.services;
import static com.mogo.eagle.core.utilcode.breakpoint.Config.DOWN_LOAD_TAG;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;
import com.mogo.eagle.core.utilcode.breakpoint.bean.FileBean;
import com.mogo.eagle.core.utilcode.breakpoint.event.DownloadData;
import com.mogo.eagle.core.utilcode.breakpoint.thread.DownloadTask;
import com.mogo.eagle.core.utilcode.breakpoint.thread.InitThread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 下载服务
*/
public class DownloadService extends Service implements InitThread.InitCallBack {
public static final String ACTION_START = "ACTION_START";
public static final String ACTION_PAUSE = "ACTION_PAUSE";
/**
* 下载任务集合
*/
private final List<DownloadTask> downloadTasks = new ArrayList<>();
public static ExecutorService executorService = Executors.newCachedThreadPool();
private NetConnectionReceiver netConnectionReceiver;
@Override
public void onCreate() {
super.onCreate();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
netConnectionReceiver = new NetConnectionReceiver();
registerReceiver(netConnectionReceiver, filter);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent == null) {
Log.e(DOWN_LOAD_TAG, "onStartCommand intent is null");
return Service.START_NOT_STICKY;
}
String action = intent.getAction();
if (action == null) {
Log.e(DOWN_LOAD_TAG, "onStartCommand action is null");
return Service.START_NOT_STICKY;
}
if (action.equals(ACTION_START)) {
Log.d(DOWN_LOAD_TAG, "ACTION_START");
FileBean fileBean = (FileBean) intent.getSerializableExtra("FileBean");
if (downloadTasks.size() > 0) {
for (DownloadTask downloadTask : downloadTasks) {
if (downloadTask.getFileBean().getUrl().equals(fileBean.getUrl())) {
//如果下载任务中以后该文件的下载任务 则直接返回
DownloadData downloadData = new DownloadData();
downloadData.setUrl(fileBean.getUrl());
downloadData.setMsg("下载任务已存在");
// EventMessage eventMessage = new EventMessage(EventMessage.TYPE_ERROR, downloadData);
// EventBus.getDefault().post(eventMessage);
return super.onStartCommand(intent, flags, startId);
}
}
}
executorService.execute(new InitThread(fileBean, this));
} else if (intent.getAction().equals(ACTION_PAUSE)) {
FileBean fileBean = (FileBean) intent.getSerializableExtra("FileBean");
DownloadTask pauseTask = null;
if (downloadTasks.size() > 0) {
for (DownloadTask downloadTask : downloadTasks) {
if (downloadTask.getFileBean().getUrl().equals(fileBean.getUrl())) {
downloadTask.pauseDownload();
pauseTask = downloadTask;
break;
}
}
//将下载任务移除
downloadTasks.remove(pauseTask);
}
}
return super.onStartCommand(intent, flags, startId);
}
//下载线程初始化完毕
@Override
public void initSuccess(FileBean fileBean) {
Log.d(DOWN_LOAD_TAG, "length:" + fileBean.getLength());
DownloadData downloadData = new DownloadData();
downloadData.setUrl(fileBean.getUrl());
downloadData.setMsg("开始下载");
downloadData.setLength(fileBean.getLength());
// EventMessage eventMsg = new EventMessage(EventMessage.TYPE_START, downloadData);
// EventBus.getDefault().post(eventMsg);
//开始下载
DownloadTask downloadTask = new DownloadTask(this, fileBean, fileBean.getThreadCount());
downloadTasks.add(downloadTask);
}
@Override
public void initFailed(DownloadData downloadData) {
Log.e(DOWN_LOAD_TAG, "initFailed : " + downloadData.getMsg());
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(netConnectionReceiver);
}
private class NetConnectionReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mobNetInfo == null || wifiNetInfo == null) {
return;
}
if (downloadTasks.size() == 0) {
return;
}
if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
//网络连接已断开
for (DownloadTask downloadTask : downloadTasks) {
downloadTask.pauseDownload();//暂停所有下载任务
//发送下载完成事件
DownloadData downloadData = new DownloadData();
downloadData.setUrl(downloadTask.getFileBean().getUrl());
downloadData.setLength(downloadTask.getFileBean().getLength());
downloadData.setMsg("网络断开暂停下载");
// EventMessage message = new EventMessage(EventMessage.TYPE_PAUSE, downloadData);
// EventBus.getDefault().post(message);
}
} else {
//网络连接已连接
for (DownloadTask downloadTask : downloadTasks) {
downloadTask.startDownload();//继续所有下载任务
DownloadData downloadData = new DownloadData();
downloadData.setUrl(downloadTask.getFileBean().getUrl());
downloadData.setLength(downloadTask.getFileBean().getLength());
downloadData.setMsg("网络恢复继续下载");
// EventMessage message = new EventMessage(EventMessage.TYPE_START, downloadData);
// EventBus.getDefault().post(message);
}
}
}
}
}

View File

@@ -0,0 +1,149 @@
package com.mogo.eagle.core.utilcode.breakpoint.thread;
import static com.mogo.eagle.core.utilcode.breakpoint.Config.DOWN_LOAD_TAG;
import android.content.Context;
import android.util.Log;
import com.mogo.eagle.core.utilcode.breakpoint.bean.FileBean;
import com.mogo.eagle.core.utilcode.breakpoint.bean.ThreadBean;
import com.mogo.eagle.core.utilcode.breakpoint.callback.DownloadCallBack;
import com.mogo.eagle.core.utilcode.breakpoint.db.dao.ThreadDao;
import com.mogo.eagle.core.utilcode.breakpoint.db.impl.ThreadDaoImpl;
import com.mogo.eagle.core.utilcode.breakpoint.event.DownloadData;
import com.mogo.eagle.core.utilcode.breakpoint.services.DownloadService;
import java.util.ArrayList;
import java.util.List;
/**
* 下载任务
*/
public class DownloadTask implements DownloadCallBack {
private FileBean fileBean;
private int downloadThreadCount;
private ThreadDao dao;
/**
* 总下载完成进度
*/
private int finishedProgress = 0;
/**
* 下载线程信息集合
*/
private List<ThreadBean> threads;
/**
* 下载线程集合
*/
private final List<DownloadThread> downloadThreads = new ArrayList<>();
public DownloadTask(Context context, FileBean fileBean, int downloadThreadCount) {
this.fileBean = fileBean;
this.downloadThreadCount = downloadThreadCount;
dao = new ThreadDaoImpl(context);
//初始化下载线程
initDownThreads();
}
private void initDownThreads() {
//查询数据库中的下载线程信息
threads = dao.getThreads(fileBean.getUrl());
if(threads.size()==0){//如果列表没有数据 则为第一次下载
Log.w(DOWN_LOAD_TAG,"第一次下载");
//根据下载的线程总数平分各自下载的文件长度
int length = fileBean.getLength()/downloadThreadCount;
for(int i = 0; i<downloadThreadCount; i++){
ThreadBean thread = new ThreadBean(i,fileBean.getUrl(),i * length,
(i + 1) * length -1,0);
if(i == downloadThreadCount-1){
thread.setEnd(fileBean.getLength());
}
//将下载线程保存到数据库
dao.insertThread(thread);
threads.add(thread);
}
}
//创建下载线程开始下载
for(ThreadBean thread : threads){
finishedProgress+= thread.getFinished();
DownloadThread downloadThread = new DownloadThread(fileBean, thread, this);
DownloadService.executorService.execute(downloadThread);
downloadThreads.add(downloadThread);
}
Log.w(DOWN_LOAD_TAG," 开始下载:"+finishedProgress);
}
/**
* 开始下载
*/
public void startDownload() {
finishedProgress = 0;
threads.clear();
downloadThreads.clear();
initDownThreads();
}
/**
* 暂停下载
*/
public void pauseDownload(){
for(DownloadThread downloadThread : downloadThreads){
if (downloadThread!=null) {
downloadThread.setPause(true);
}
}
}
@Override
public void pauseCallBack(ThreadBean threadBean) {
//保存下载进度到数据库
Log.w(DOWN_LOAD_TAG,"保存数据:"+threadBean.toString());
dao.updateThread(threadBean.getUrl(),threadBean.getId(),threadBean.getFinished());
}
private long curTime = 0;
@Override
public void progressCallBack(int length) {
finishedProgress += length;
//每500毫秒发送刷新进度事件
if(System.currentTimeMillis() - curTime >500 || finishedProgress==fileBean.getLength()){
fileBean.setFinished(finishedProgress);
DownloadData downloadData = new DownloadData();
downloadData.setUrl(fileBean.getUrl());
downloadData.setProgress((int) (finishedProgress*1.0/fileBean.getLength()*100));
downloadData.setLength(fileBean.getLength());
downloadData.setMsg("下载进度回调");
// EventMessage message = new EventMessage(EventMessage.TYPE_PROGRESS,downloadData);
// EventBus.getDefault().post(message);
curTime = System.currentTimeMillis();
}
}
@Override
public synchronized void threadDownLoadFinished(ThreadBean threadBean) {
for(ThreadBean bean:threads){
if(bean.getId() == threadBean.getId()){
//从列表中将已下载完成的线程信息移除
threads.remove(bean);
break;
}
}
if(threads.size()==0){//如果列表size为0 则所有线程已下载完成
//删除数据库中的信息
dao.deleteThread(fileBean.getUrl());
//发送下载完成事件
DownloadData downloadData = new DownloadData();
downloadData.setUrl(fileBean.getUrl());
downloadData.setMsg("下载完成");
downloadData.setFilePath(fileBean.getSavePath()+fileBean.getFileName());
// EventMessage message = new EventMessage(EventMessage.TYPE_FINISHED,downloadData);
// EventBus.getDefault().post(message);
}
}
public FileBean getFileBean() {
return fileBean;
}
}

View File

@@ -0,0 +1,96 @@
package com.mogo.eagle.core.utilcode.breakpoint.thread;
import com.mogo.eagle.core.utilcode.breakpoint.Config;
import com.mogo.eagle.core.utilcode.breakpoint.bean.FileBean;
import com.mogo.eagle.core.utilcode.breakpoint.bean.ThreadBean;
import com.mogo.eagle.core.utilcode.breakpoint.callback.DownloadCallBack;
import com.mogo.eagle.core.utilcode.breakpoint.event.DownloadData;
import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 下载线程
*/
public class DownloadThread extends Thread {
private FileBean fileBean;
private ThreadBean threadBean;
private DownloadCallBack callback;
private Boolean isPause = false;
public DownloadThread(FileBean fileBean, ThreadBean threadBean, DownloadCallBack callback) {
this.fileBean = fileBean;
this.threadBean = threadBean;
this.callback = callback;
}
public void setPause(Boolean pause) {
isPause = pause;
}
@Override
public void run() {
HttpURLConnection connection = null;
RandomAccessFile raf = null;
InputStream inputStream = null;
try {
URL url = new URL(threadBean.getUrl());
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(10000);
connection.setRequestMethod("GET");
//设置下载起始位置
int start = threadBean.getStart() + threadBean.getFinished();
connection.setRequestProperty("Range","bytes="+start+"-"+threadBean.getEnd());
//设置写入位置
File file = new File(Config.downLoadPath,fileBean.getFileName());
raf = new RandomAccessFile(file,"rwd");
raf.seek(start);
//开始下载
if(connection.getResponseCode() == HttpURLConnection.HTTP_PARTIAL){
inputStream = connection.getInputStream();
byte[] bytes = new byte[1024];
int len = -1;
while ((len = inputStream.read(bytes))!=-1){
raf.write(bytes,0,len);
//将加载的进度回调出去
callback.progressCallBack(len);
//保存进度
threadBean.setFinished(threadBean.getFinished()+len);
//在下载暂停的时候将下载进度保存到数据库
if(isPause){
callback.pauseCallBack(threadBean);
return;
}
}
//下载完成
callback.threadDownLoadFinished(threadBean);
}
} catch (Exception e) {
e.printStackTrace();
DownloadData downloadData = new DownloadData();
downloadData.setUrl(fileBean.getUrl());
downloadData.setMsg(e.getMessage());
// EventMessage eventMessage = new EventMessage(EventMessage.TYPE_ERROR,downloadData);
// EventBus.getDefault().post(eventMessage);
} finally {
try {
inputStream.close();
raf.close();
connection.disconnect();
}catch (Exception e){
e.printStackTrace();
DownloadData downloadData = new DownloadData();
downloadData.setUrl(fileBean.getUrl());
downloadData.setMsg(e.getMessage());
// EventMessage eventMessage = new EventMessage(EventMessage.TYPE_ERROR,downloadData);
// EventBus.getDefault().post(eventMessage);
}
}
}
}

View File

@@ -0,0 +1,66 @@
package com.mogo.eagle.core.utilcode.breakpoint.thread;
import static com.mogo.eagle.core.utilcode.breakpoint.Config.DOWN_LOAD_TAG;
import android.util.Log;
import com.mogo.eagle.core.utilcode.breakpoint.bean.FileBean;
import com.mogo.eagle.core.utilcode.breakpoint.event.DownloadData;
import java.io.File;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* 初始化线程
*/
public class InitThread extends Thread{
private final FileBean fileBean;
private InitCallBack initCallBack;
public InitThread(FileBean fileBean,InitCallBack initCallBack) {
this.fileBean = fileBean;
this.initCallBack = initCallBack;
}
public interface InitCallBack{
void initSuccess(FileBean fileBean);
void initFailed(DownloadData downloadData);
}
@Override
public void run() {
HttpURLConnection connection ;
RandomAccessFile randomAccessFile ;
try {
URL url = new URL(fileBean.getUrl());
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(10000);
connection.setRequestMethod("GET");
int fileLength = -1;
if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
fileLength = connection.getContentLength();
}
if(fileLength<=0) return;
File dir = new File(fileBean.getSavePath());
if(!dir.exists()){
dir.mkdir();
}
File file = new File(dir,fileBean.getFileName());
randomAccessFile = new RandomAccessFile(file,"rwd");
randomAccessFile.setLength(fileLength);
fileBean.setLength(fileLength);
this.initCallBack.initSuccess(fileBean);
}catch (Exception e){
DownloadData downloadData = new DownloadData();
downloadData.setUrl(fileBean.getUrl());
downloadData.setMsg(e.getMessage());
this.initCallBack.initFailed(downloadData);
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,28 @@
package com.mogo.eagle.core.utilcode.breakpoint.utils;
import android.content.Context;
import android.content.Intent;
import com.mogo.eagle.core.utilcode.breakpoint.bean.FileBean;
import com.mogo.eagle.core.utilcode.breakpoint.services.DownloadService;
public class DownloadUtils {
public static void downLoad(Context context,String url,String savePath,String fileName,int downloadThreadCount){
FileBean fileBean = new FileBean(0,savePath,fileName,url,0);
fileBean.setThreadCount(downloadThreadCount);
Intent startIntent = new Intent(context, DownloadService.class);
startIntent.setAction(DownloadService.ACTION_START);
startIntent.putExtra("FileBean", fileBean);
context.startService(startIntent);
}
public static void pauseDownLoad(Context context,String url){
FileBean fileBean = new FileBean(0,null,null,url,0);
Intent pauseIntent = new Intent(context, DownloadService.class);
pauseIntent.setAction(DownloadService.ACTION_PAUSE);
pauseIntent.putExtra("FileBean", fileBean);
context.startService(pauseIntent);
}
}

View File

@@ -5,10 +5,10 @@ import android.content.Context;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.commons.network.ParamsProvider;
import com.mogo.eagle.core.data.map.MogoLatLng;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
import com.mogo.eagle.core.network.RequestOptions;
import com.mogo.eagle.core.network.SubscribeImpl;
import com.mogo.eagle.core.network.utils.GsonUtil;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.constants.HostConst;
import com.mogo.module.common.entity.MarkerResponse;
import com.mogo.module.service.ServiceConst;
@@ -32,56 +32,56 @@ public class RefreshModel {
private final Context mContext;
private final RefreshApiService mRefreshApiService;
public RefreshModel( Context context ) {
public RefreshModel(Context context) {
this.mContext = context;
this.mRefreshApiService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( RefreshApiService.class, HostConst.LAUNCHER_SNAPSHOT_HOST);
this.mRefreshApiService = MoGoRetrofitFactory.getInstance(HostConst.LAUNCHER_SNAPSHOT_HOST).create(RefreshApiService.class);
}
public RefreshApiService getRefreshApiService() {
return mRefreshApiService;
}
public void refreshExplorerWayData( MogoLatLng latLng, int radius, int limit, final RefreshCallback callback ) {
if ( mRefreshApiService != null ) {
final Map< String, Object > query = new ParamsProvider.Builder( mContext ).build();
public void refreshExplorerWayData(MogoLatLng latLng, int radius, int limit, final RefreshCallback callback) {
if (mRefreshApiService != null) {
final Map<String, Object> query = new ParamsProvider.Builder(mContext).build();
final RefreshBody refreshBody = new RefreshBody();
refreshBody.limit = limit;
refreshBody.location = new RefreshBody.LatLon( latLng.lat, latLng.lon );
refreshBody.location = new RefreshBody.LatLon(latLng.lat, latLng.lon);
refreshBody.radius = radius;
refreshBody.viewPush = true;
refreshBody.dataType.add( ServiceConst.CARD_TYPE_ROAD_CONDITION );
refreshBody.dataType.add(ServiceConst.CARD_TYPE_ROAD_CONDITION);
String data = GsonUtil.jsonFromObject( refreshBody );
query.put( "data", data );
String data = GsonUtil.jsonFromObject(refreshBody);
query.put("data", data);
mRefreshApiService.refreshDataSync( query )
.subscribeOn( Schedulers.io() )
.observeOn( AndroidSchedulers.mainThread() )
.subscribe( new SubscribeImpl< MarkerResponse >( RequestOptions.create( mContext ) ) {
mRefreshApiService.refreshDataSync(query)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<MarkerResponse>(RequestOptions.create(mContext)) {
@Override
public void onSuccess( MarkerResponse o ) {
super.onSuccess( o );
if ( callback != null ) {
callback.onSuccess( o );
public void onSuccess(MarkerResponse o) {
super.onSuccess(o);
if (callback != null) {
callback.onSuccess(o);
}
}
@Override
public void onError( Throwable e ) {
super.onError( e );
if ( callback != null ) {
public void onError(Throwable e) {
super.onError(e);
if (callback != null) {
callback.onFail();
}
}
@Override
public void onError( String message, int code ) {
super.onError( message, code );
if ( callback != null ) {
public void onError(String message, int code) {
super.onError(message, code);
if (callback != null) {
callback.onFail();
}
}
} );
});
}
}
@@ -95,56 +95,56 @@ public class RefreshModel {
* @param callback
* @param onlyRealUser 是否只查询真实用户
*/
public void queryOnLineCarWithRoute( MogoLatLng latLng,
boolean onlyFocus,
boolean onlySameCity,
int radius,
int limit,
boolean onlyRealUser,
final RefreshCallback callback ) {
if ( mRefreshApiService != null ) {
final Map< String, Object > query = new ParamsProvider.Builder( mContext ).build();
public void queryOnLineCarWithRoute(MogoLatLng latLng,
boolean onlyFocus,
boolean onlySameCity,
int radius,
int limit,
boolean onlyRealUser,
final RefreshCallback callback) {
if (mRefreshApiService != null) {
final Map<String, Object> query = new ParamsProvider.Builder(mContext).build();
final RefreshBody refreshBody = new RefreshBody();
refreshBody.sn = MoGoAiCloudClientConfig.getInstance().getSn();
if ( limit > 0 ) {
if (limit > 0) {
refreshBody.limit = limit;
}
refreshBody.radius = radius;
refreshBody.location = new RefreshBody.LatLon( latLng.lat, latLng.lon );
refreshBody.location = new RefreshBody.LatLon(latLng.lat, latLng.lon);
refreshBody.onlyFocus = onlyFocus;
refreshBody.onlySameCity = onlySameCity;
refreshBody.onlyRealUser = onlyRealUser;
refreshBody.dataType.add( ServiceConst.CARD_TYPE_USER_DATA );
refreshBody.dataType.add(ServiceConst.CARD_TYPE_USER_DATA);
query.put( "data", GsonUtil.jsonFromObject( refreshBody ) );
mRefreshApiService.queryOnLineCarWithRoute( query )
.subscribeOn( Schedulers.io() )
.observeOn( AndroidSchedulers.mainThread() )
.subscribe( new SubscribeImpl< MarkerResponse >( RequestOptions.create( mContext ) ) {
query.put("data", GsonUtil.jsonFromObject(refreshBody));
mRefreshApiService.queryOnLineCarWithRoute(query)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SubscribeImpl<MarkerResponse>(RequestOptions.create(mContext)) {
@Override
public void onSuccess( MarkerResponse o ) {
super.onSuccess( o );
if ( callback != null ) {
callback.onSuccess( o );
public void onSuccess(MarkerResponse o) {
super.onSuccess(o);
if (callback != null) {
callback.onSuccess(o);
}
}
@Override
public void onError( Throwable e ) {
super.onError( e );
if ( callback != null ) {
public void onError(Throwable e) {
super.onError(e);
if (callback != null) {
callback.onFail();
}
}
@Override
public void onError( String message, int code ) {
super.onError( message, code );
if ( callback != null ) {
public void onError(String message, int code) {
super.onError(message, code);
if (callback != null) {
callback.onFail();
}
}
} );
});
}
}

View File

@@ -3,8 +3,9 @@ package com.mogo.module.service.network;
import android.content.Context;
import com.alibaba.android.arouter.launcher.ARouter;
import com.mogo.module.common.constants.HostConst;
import com.mogo.eagle.core.data.constants.MogoServicePaths;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
import com.mogo.module.common.constants.HostConst;
import com.mogo.service.network.IMogoNetwork;
@@ -20,9 +21,9 @@ public class ZhidaoRefreshModel {
private final ZhidaoApiService mRefreshApiService;
public ZhidaoRefreshModel( Context context ) {
IMogoNetwork network = ( IMogoNetwork ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICES_NETWORK ).navigation( context );
this.mRefreshApiService = network.create( ZhidaoApiService.class, HostConst.CARLIFE_HOST);
public ZhidaoRefreshModel(Context context) {
IMogoNetwork network = (IMogoNetwork) ARouter.getInstance().build(MogoServicePaths.PATH_SERVICES_NETWORK).navigation(context);
this.mRefreshApiService = MoGoRetrofitFactory.getInstance(HostConst.CARLIFE_HOST).create(ZhidaoApiService.class);
}
public ZhidaoApiService getRefreshApiService() {

View File

@@ -23,14 +23,4 @@ public interface IMogoNetwork extends IProvider {
@Keep
<T> T create(final Class<T> service, String baseUrl);
/**
* 返回无CallAdapter Retrofit代理对象
*
* @param service 业务类
* @param baseUrl url
* @param <T>
* @return 业务类动态代理
*/
@Keep
<T> T createNoCallAdapter(final Class<T> service, String baseUrl);
}

View File

@@ -26,9 +26,4 @@ public class MogoNetWorkService implements IMogoNetwork {
return MoGoRetrofitFactory.getInstance(baseUrl).create(service);
}
@Override
public <T> T createNoCallAdapter(Class<T> service, String baseUrl) {
return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl).create(service);
}
}