[fix]
[offline]
[完成任务、检测网络 去登录]
This commit is contained in:
yangyakun
2024-12-27 16:29:37 +08:00
parent 386c1190b9
commit 108aa9a789
11 changed files with 749 additions and 3 deletions

View File

@@ -22,6 +22,8 @@ class TimeProvider : TimeService {
private var diffTime = 0L
private var diffTimeGetTime = 0L
override fun loadNewTime() {
OchChainLogManager.writeChainLogTime("时间同步", "开始时间同步")
d(TAG, "时间同步_开始时间同步")
@@ -36,6 +38,7 @@ class TimeProvider : TimeService {
val netTime = (endTime - startTime) / 2
val currentServerTime = serverTime + netTime
diffTime = currentServerTime - endTime
diffTimeGetTime = endTime
}
OchChainLogManager.writeChainLogTime(
@@ -78,6 +81,14 @@ class TimeProvider : TimeService {
return System.currentTimeMillis() + diffTime
}
override fun getSynServerTime(): Long {
return diffTimeGetTime
}
override fun getTimeStampDiff(): Long {
return diffTime
}
override fun init(context: Context?) {
this.context = context

View File

@@ -13,7 +13,7 @@ object TimeManager {
private const val TAG = M_OCHCOMMON+"TimeManager"
private var skinService: TimeService? =
private var timeService: TimeService? =
ARouter.getInstance().build(OchCommonConst.BIZ_TIME).navigation() as TimeService
@@ -24,11 +24,21 @@ object TimeManager {
}
fun loadNewTime(){
skinService?.loadNewTime()
timeService?.loadNewTime()
}
fun getCurrentTimeStamp():Long{
return skinService?.getCurrentTimeStamp()?:System.currentTimeMillis()
return timeService?.getCurrentTimeStamp()?:System.currentTimeMillis()
}
fun getSynServerTime():Long{
return timeService?.getSynServerTime()?:0L
}
fun getTimeStampDiff():Long{
return timeService?.getTimeStampDiff()?:0L
}
}

View File

@@ -11,4 +11,8 @@ interface TimeService : IProvider {
fun getCurrentTimeStamp():Long
fun getSynServerTime():Long
fun getTimeStampDiff():Long
}

View File

@@ -0,0 +1,475 @@
{
"formatVersion": 1,
"database": {
"version": 6,
"identityHash": "01269591615dbf16e01fcf0281ea117b",
"entities": [
{
"tableName": "contrail_data_table",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `csv_file_url` TEXT, `csv_file_md5` TEXT, `txt_file_url` TEXT, `txt_file_md5` TEXT, `contrail_save_time` INTEGER, `md5` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lineId",
"columnName": "line_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "csvFileUrl",
"columnName": "csv_file_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "csvFileMd5",
"columnName": "csv_file_md5",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "txtFileUrl",
"columnName": "txt_file_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "txtFileMd5",
"columnName": "txt_file_md5",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "contrailSaveTime",
"columnName": "contrail_save_time",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "md5",
"columnName": "md5",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_contrail_data_table_line_id",
"unique": false,
"columnNames": [
"line_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_contrail_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)"
},
{
"name": "index_contrail_data_table_md5",
"unique": false,
"columnNames": [
"md5"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_contrail_data_table_md5` ON `${TABLE_NAME}` (`md5`)"
}
],
"foreignKeys": []
},
{
"tableName": "line_data_table",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `line_name` TEXT, `end_station_name` TEXT, `line_get_time` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "lineId",
"columnName": "line_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lineName",
"columnName": "line_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "endStationName",
"columnName": "end_station_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "linegetTime",
"columnName": "line_get_time",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_line_data_table_line_id",
"unique": false,
"columnNames": [
"line_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_line_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)"
}
],
"foreignKeys": []
},
{
"tableName": "site_data_table",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `site_id` INTEGER, `line_id` INTEGER, `name` TEXT, `name_kr` TEXT, `seq` INTEGER, `gcj_lon` REAL, `gcj_lat` REAL, `lon` REAL, `lat` REAL, `introduction` TEXT, `is_play_tts` INTEGER, `md5` TEXT, `videoList` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "siteId",
"columnName": "site_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lineId",
"columnName": "line_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "nameKr",
"columnName": "name_kr",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "seq",
"columnName": "seq",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "gcjLon",
"columnName": "gcj_lon",
"affinity": "REAL",
"notNull": false
},
{
"fieldPath": "gcjLat",
"columnName": "gcj_lat",
"affinity": "REAL",
"notNull": false
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": false
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": false
},
{
"fieldPath": "introduction",
"columnName": "introduction",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isPlayTts",
"columnName": "is_play_tts",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "md5",
"columnName": "md5",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "videoListDB",
"columnName": "videoList",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_site_data_table_site_id",
"unique": false,
"columnNames": [
"site_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_site_data_table_site_id` ON `${TABLE_NAME}` (`site_id`)"
},
{
"name": "index_site_data_table_line_id",
"unique": false,
"columnNames": [
"line_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_site_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)"
}
],
"foreignKeys": []
},
{
"tableName": "used_line_data_table",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task_id` INTEGER, `line_id` INTEGER, `site_id` INTEGER, `line_name` TEXT, `name` TEXT, `name_kr` TEXT, `seq` INTEGER, `gcj_lon` REAL, `gcj_lat` REAL, `lon` REAL, `lat` REAL, `driving_status` INTEGER, `leaving` INTEGER, `arrived_time` INTEGER, `leave_time` INTEGER, `introduction` TEXT, `is_play_tts` INTEGER, `event_save_time` INTEGER NOT NULL, `videoList` TEXT)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "taskId",
"columnName": "task_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lineId",
"columnName": "line_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "siteId",
"columnName": "site_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lineName",
"columnName": "line_name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "name",
"columnName": "name",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "nameKr",
"columnName": "name_kr",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "seq",
"columnName": "seq",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "gcjLon",
"columnName": "gcj_lon",
"affinity": "REAL",
"notNull": false
},
{
"fieldPath": "gcjLat",
"columnName": "gcj_lat",
"affinity": "REAL",
"notNull": false
},
{
"fieldPath": "lon",
"columnName": "lon",
"affinity": "REAL",
"notNull": false
},
{
"fieldPath": "lat",
"columnName": "lat",
"affinity": "REAL",
"notNull": false
},
{
"fieldPath": "drivingStatus",
"columnName": "driving_status",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "leaving",
"columnName": "leaving",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "arrivedTime",
"columnName": "arrived_time",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "leaveTime",
"columnName": "leave_time",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "introduction",
"columnName": "introduction",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "isPlayTts",
"columnName": "is_play_tts",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "eventSaveTime",
"columnName": "event_save_time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "videoList",
"columnName": "videoList",
"affinity": "TEXT",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [],
"foreignKeys": []
},
{
"tableName": "temp_task_data_table",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task_id` INTEGER, `line_id` INTEGER, `start_time` INTEGER NOT NULL, `end_time` INTEGER, `task_get_time` INTEGER NOT NULL, `status` INTEGER)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "taskId",
"columnName": "task_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "lineId",
"columnName": "line_id",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "startTime",
"columnName": "start_time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "endtime",
"columnName": "end_time",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "taskgetTime",
"columnName": "task_get_time",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "status",
"columnName": "status",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
"columnNames": [
"id"
],
"autoGenerate": true
},
"indices": [
{
"name": "index_temp_task_data_table_task_id",
"unique": false,
"columnNames": [
"task_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_temp_task_data_table_task_id` ON `${TABLE_NAME}` (`task_id`)"
},
{
"name": "index_temp_task_data_table_line_id",
"unique": false,
"columnNames": [
"line_id"
],
"orders": [],
"createSql": "CREATE INDEX IF NOT EXISTS `index_temp_task_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)"
}
],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '01269591615dbf16e01fcf0281ea117b')"
]
}
}

View File

@@ -0,0 +1,83 @@
package com.mogo.och.offline.ui.go2login
import androidx.lifecycle.ViewModel
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OFFLINE
import com.mogo.och.common.module.biz.time.TimeManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.offline.callback.IBusLinesCallback
import com.mogo.och.offline.model.LineModel
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.util.concurrent.TimeUnit
/**
* @author XuXinChao
* @description BadCase录包管理页面
* @since: 2022/12/15
*/
class GoLoginModel : ViewModel(), IBusLinesCallback {
private val TAG = M_OFFLINE+ GoLoginModel::class.java.simpleName
private var viewCallback: GoLoginViewCallback?=null
private var countDownDisposable: Disposable? = null
override fun onCleared() {
d(TAG,"onCleared")
LineModel.setBusLinesCallback(TAG,null)
}
fun setDistanceCallback(viewCallback: GoLoginViewCallback){
this.viewCallback = viewCallback
LineModel.setBusLinesCallback(TAG, this)
}
fun startCountDown(){
val countDownSeconds = 5L;
countDownDisposable = Observable.intervalRange(0, countDownSeconds, 0, 1, TimeUnit.SECONDS)
.map { aLong -> countDownSeconds - aLong }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
this.viewCallback?.setCountDownText("${it}s",false)
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "倒计时:$it")
}, {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "倒计时onError:${it}")
it.printStackTrace()
this.viewCallback ?.setCountDownText("0",true)
}, {
RxUtils.createSubscribe(1_000) {
this.viewCallback ?.setCountDownText("0s",true)
}
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "倒计时onComplete")
})
}
override fun onCompleteTask() {
super.onCompleteTask()
if(FunctionBuildConfig.isOffLine){
if(System.currentTimeMillis()-TimeManager.getSynServerTime()<60*2*1000
&& TimeManager.getTimeStampDiff()!=0L
){
BizLoopManager.runInMainThread{
this.viewCallback?.showView()
}
}
}
}
interface GoLoginViewCallback{
fun setCountDownText(s: String, b: Boolean)
fun showView()
}
}

View File

@@ -0,0 +1,92 @@
package com.mogo.och.offline.ui.go2login
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.findViewTreeViewModelStoreOwner
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OFFLINE
import com.mogo.och.common.module.utils.ResourcesUtils
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.offline.R
import com.mogo.och.offline.model.OrderModel
import com.mogo.och.offline.ui.bizswitch.SwtichBizModel
import kotlinx.android.synthetic.main.offline_go_login.view.actv_code_download
import kotlinx.android.synthetic.main.offline_go_login.view.actv_go2login
class GoLoginView: ConstraintLayout, GoLoginModel.GoLoginViewCallback {
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
companion object {
const val TAG = "${M_OFFLINE}SwitchLineView"
}
private var viewModel: GoLoginModel?=null
private var viewbizModel: SwtichBizModel?=null
init {
LayoutInflater.from(context).inflate(R.layout.offline_go_login, this, true)
initView()
}
private fun initView(){
actv_go2login.onClick {
OrderModel.logoutInner()
}
}
override fun onVisibilityAggregated(isVisible: Boolean) {
super.onVisibilityAggregated(isVisible)
if(isVisible){
viewModel?.startCountDown()
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
viewModel = findViewTreeViewModelStoreOwner()?.let {
ViewModelProvider(it).get(GoLoginModel::class.java)
}
viewModel?.setDistanceCallback(this)
CallerLogger.d(TAG,"onAttachedToWindow")
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerLogger.d(TAG,"onDetachedFromWindow")
}
override fun setCountDownText(s: String, show: Boolean) {
if(show){
actv_code_download.text = ResourcesUtils.getString(R.string.go_login_count_down,s)
visibility = View.VISIBLE
RxUtils.createSubscribe(1_000) {
visibility = View.GONE
}
}else{
visibility = View.VISIBLE
actv_code_download.text = ResourcesUtils.getString(R.string.go_login_count_down,s)
}
}
override fun showView() {
visibility = View.VISIBLE
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -34,6 +34,14 @@
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.mogo.och.offline.ui.go2login.GoLoginView
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="-25dp"
android:layout_marginBottom="@dimen/dp_110"
android:layout_width="@dimen/dp_421"
android:layout_height="@dimen/dp_376"/>
<com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugViewTrigger
android:layout_width="@dimen/dp_400"
android:layout_height="@dimen/dp_100"

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="@dimen/dp_421"
android:layout_height="@dimen/dp_376"
android:background="@drawable/offline_go_login_bg"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/gl_horizontal_top"
android:orientation="horizontal"
app:layout_constraintGuide_begin="@dimen/dp_23"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/gl_vertical_left"
android:orientation="vertical"
app:layout_constraintGuide_begin="@dimen/dp_42"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/gl_vertical_right"
android:orientation="vertical"
app:layout_constraintGuide_end="@dimen/dp_42"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_code_download"
app:layout_constraintTop_toTopOf="@+id/gl_horizontal_top"
app:layout_constraintStart_toStartOf="@+id/gl_vertical_left"
app:layout_constraintEnd_toEndOf="@+id/gl_vertical_right"
android:layout_marginTop="@dimen/dp_46"
android:textSize="@dimen/dp_32"
android:textColor="@color/white"
android:text="当前网络良好(5s)"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_go2login"
app:layout_constraintTop_toTopOf="@+id/gl_horizontal_top"
app:layout_constraintStart_toStartOf="@+id/gl_vertical_left"
app:layout_constraintEnd_toEndOf="@+id/gl_vertical_right"
android:layout_marginTop="@dimen/dp_134"
android:gravity="center"
android:background="@drawable/offline_login_bg"
android:textSize="@dimen/dp_32"
android:textColor="@color/white"
android:layout_width="@dimen/dp_241"
android:layout_height="@dimen/dp_101"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -22,6 +22,10 @@
<string name="m2_voice_out_arrive_station">蘑菇小巴正在进站</string>
<string name="m2_voice_out_autopilot_start_in15m">蘑菇小巴出发咯</string>
<string name="go_login_count_down">当前网络良好(%1$s)</string>
<!-- region tts -->
<string name="offline_arrived_station_tip">已到达%1$s带好随身物品下车请注意安全。</string>