merge
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) }
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
// }
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
}
|
||||
@@ -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 ?: "获取最新版本信息失败")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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)
|
||||
@@ -79,4 +79,14 @@ interface IDevaToolsProvider : IMoGoFunctionServerProvider {
|
||||
* 展示反馈页面
|
||||
*/
|
||||
fun showFeedbackWindow(ctx: Context)
|
||||
|
||||
/**
|
||||
* 获取升级版本Urls
|
||||
*/
|
||||
fun getUpgradeVersionUrls(versionName: String)
|
||||
|
||||
/**
|
||||
* 下载指定包
|
||||
*/
|
||||
fun downLoadPackage(downLoadKey:String)
|
||||
}
|
||||
@@ -24,4 +24,9 @@ interface IMoGoDevaToolsListener {
|
||||
* 模块TAG更新回调
|
||||
*/
|
||||
fun moduleLogChanged(moduleTag: MutableMap<String, SceneModule>)
|
||||
|
||||
/**
|
||||
* 版本升级Urls
|
||||
*/
|
||||
fun upgradeVersionUrls(urls: Map<String, String>?)
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -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";
|
||||
}
|
||||
@@ -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+
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -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 +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
} );
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user