Commit 552c8ce0 authored by 马乐's avatar 马乐

1.完善单向可信数据源封装

parent 69f8a7a4
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
// id 'kotlin-kapt'
id 'com.google.dagger.hilt.android'
id 'kotlin-kapt'
}
android {
......@@ -16,6 +17,15 @@ android {
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
buildConfigField 'String','DEV_MAP_SOURCE_HOST','"http://192.168.9.152:9290/"'
buildConfigField 'String','TEST_MAP_SOURCE_HOST','"http://192.168.9.152:9290/"'
buildConfigField 'String','DEV_API_SERVER_HOST','"http://192.168.9.152:9290/"'
buildConfigField 'String','TEST_API_SERVER_HOST','"http://192.168.9.152:9290/"'
buildConfigField 'String','TEST_PLATFORM_ADDRESS','"http://192.168.9.152:9290/"'
buildConfigField 'String','DEV_PLATFORM_ADDRESS','"http://192.168.9.152:9290/"'
buildConfigField 'double','DEFAULT_LONGITUDE','119.7622539014'
buildConfigField 'double','DEFAULT_LATITUDE','49.3795031825'
}
buildTypes {
......@@ -42,29 +52,45 @@ android {
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1'
implementation 'androidx.navigation:navigation-ui-ktx:2.4.1'
implementation 'androidx.core:core-ktx:1.10.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.3'
implementation "androidx.room:room-runtime:2.5.0"
implementation "androidx.room:room-ktx:2.5.0"
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.moshi:moshi-kotlin:1.14.0'
implementation 'com.mapbox.maps:android:10.11.0'
implementation 'com.mapbox.mapboxsdk:mapbox-sdk-geojson:6.9.0'
implementation 'io.netty:netty-buffer:4.1.87.Final'
implementation 'io.github.toggery:jt808-codec:2.0.3'
implementation 'com.blankj:utilcodex:1.31.1'
implementation 'org.jetbrains.kotlin:kotlin-reflect:1.7.20'
implementation 'org.jetbrains.kotlin:kotlin-reflect:1.7.22'
implementation 'com.geyifeng.immersionbar:immersionbar:3.2.2'
implementation 'com.github.mik3y:usb-serial-for-android:3.5.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'io.github.razerdp:BasePopup:3.2.1'
// implementation 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1'
implementation 'com.google.android.exoplayer:exoplayer:2.17.1'
implementation 'com.afollestad.material-dialogs:core:3.2.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.0-RC'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.0-RC'
implementation 'com.squareup.retrofit2:converter-moshi:2.9.0'
implementation "com.google.dagger:hilt-android:2.44"
kapt "com.google.dagger:hilt-compiler:2.44"
kapt "androidx.room:room-compiler:2.5.0"
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
\ No newline at end of file
......@@ -16,12 +16,13 @@
<application
android:name=".MyApp"
android:name=".AntiCollisionApp"
android:allowBackup="true"
android:requestLegacyExternalStorage="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/waytous_logo"
android:networkSecurityConfig="@xml/network_security_config"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.HTAnticollision"
......
......@@ -5,13 +5,14 @@ import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.SPStaticUtils
import com.blankj.utilcode.util.SPUtils
import com.blankj.utilcode.util.Utils
import dagger.hilt.android.HiltAndroidApp
import kotlin.properties.Delegates
class MyApp: Application() {
@HiltAndroidApp
class AntiCollisionApp: Application(){
override fun onCreate() {
super.onCreate()
instance = this
Utils.init(this)
LogUtils.getConfig().globalTag = "Waytous"
SPStaticUtils.setDefaultSPUtils(SPUtils.getInstance("settings"))
......@@ -19,7 +20,7 @@ class MyApp: Application() {
companion object {
//情况一:声明可空的属性
private var instance: MyApp by Delegates.notNull()
private var instance: AntiCollisionApp by Delegates.notNull()
fun instance() = instance
}
}
\ No newline at end of file
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.waytous.anticollision
import android.os.Handler
import android.os.Looper
import java.util.concurrent.Executor
import java.util.concurrent.Executors
import javax.inject.Inject
import javax.inject.Singleton
/**
* Global executor pools for the whole application.
*
* Grouping tasks like this avoids the effects of task starvation (e.g. disk reads don't wait behind
* webservice requests).
*/
@Singleton
open class AppExecutors(
private val diskIO: Executor,
private val networkIO: Executor,
private val mainThread: Executor
) {
@Inject
constructor() : this(
Executors.newSingleThreadExecutor(),
Executors.newFixedThreadPool(3),
MainThreadExecutor()
)
fun diskIO(): Executor {
return diskIO
}
fun networkIO(): Executor {
return networkIO
}
fun mainThread(): Executor {
return mainThread
}
private class MainThreadExecutor : Executor {
private val mainThreadHandler = Handler(Looper.getMainLooper())
override fun execute(command: Runnable) {
mainThreadHandler.post(command)
}
}
}
package com.waytous.anticollision.api
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import com.waytous.anticollision.BuildConfig
import com.waytous.anticollision.bean.MapDataSource
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query
interface ApiService {
/**
* 获取障碍物图层数据
* @param version
* */
@GET("api/map/obstaclesversion")
suspend fun obstaclesVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取电子围栏图层数据
* @param version
* */
@GET("api/map/electronicFenceversion")
suspend fun electronicFenceVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取湿滑区域图层数据
* @param version
* */
@GET("api/map/wetAreaversion")
suspend fun wetAreaVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取车道节点图层数据
* @param version
* */
@GET("api/map/lanenodeversion")
suspend fun laneNodeVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取车道图层数据
* @param version
* */
@GET("api/map/laneversion")
suspend fun laneVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取可行使区域图层数据
* @param version
* */
@GET("api/map/runableareaversion")
suspend fun runnableAreaVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取卸载区图层数据
* @param version
* */
@GET("api/map/dumpareaversion")
suspend fun dumpAreaVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取装载区图层数据
* @param version
* */
@GET("api/map/diggingworkareaversion")
suspend fun diggingWorkAreaVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取挡墙图层数据
* @param version
* */
@GET("api/map/barricadeversion")
suspend fun barricadeVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取静态区域图层数据
* @param version
* */
@GET("api/map/stationareaversion")
suspend fun stationAreaVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取静态区域图层数据
* @param version
* */
@GET("api/map/staticobjsversion")
suspend fun staticObjectsVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取停车位图层数据
* @param version
* */
@GET("api/map/parkspotversion")
suspend fun parkSpotVersion(@Query("version") version:String = "-1"): MapDataSource?
companion object {
private val BASE_URL by lazy {
if (BuildConfig.DEBUG) BuildConfig.TEST_MAP_SOURCE_HOST else BuildConfig.DEV_MAP_SOURCE_HOST
}
private val moshi: Moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
fun create(): ApiService {
val logger = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BASIC }
val client = OkHttpClient.Builder()
.addInterceptor(logger)
.build()
return Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build()
.create(ApiService::class.java)
}
}
}
\ No newline at end of file
package com.waytous.anticollision.api
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import com.waytous.anticollision.BuildConfig
import com.waytous.anticollision.bean.MapDataSource
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query
interface MapSourceService {
/**
* 获取障碍物图层数据
* @param version
* */
@GET("api/map/obstaclesversion")
suspend fun obstaclesVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取电子围栏图层数据
* @param version
* */
@GET("api/map/electronicFenceversion")
suspend fun electronicFenceVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取湿滑区域图层数据
* @param version
* */
@GET("api/map/wetAreaversion")
suspend fun wetAreaVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取车道节点图层数据
* @param version
* */
@GET("api/map/lanenodeversion")
suspend fun laneNodeVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取车道图层数据
* @param version
* */
@GET("api/map/laneversion")
suspend fun laneVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取可行使区域图层数据
* @param version
* */
@GET("api/map/runableareaversion")
suspend fun runnableAreaVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取卸载区图层数据
* @param version
* */
@GET("api/map/dumpareaversion")
suspend fun dumpAreaVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取装载区图层数据
* @param version
* */
@GET("api/map/diggingworkareaversion")
suspend fun diggingWorkAreaVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取挡墙图层数据
* @param version
* */
@GET("api/map/barricadeversion")
suspend fun barricadeVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取静态区域图层数据
* @param version
* */
@GET("api/map/stationareaversion")
suspend fun stationAreaVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取静态区域图层数据
* @param version
* */
@GET("api/map/staticobjsversion")
suspend fun staticObjectsVersion(@Query("version") version:String = "-1"): MapDataSource?
/**
* 获取停车位图层数据
* @param version
* */
@GET("api/map/parkspotversion")
suspend fun parkSpotVersion(@Query("version") version:String = "-1"): MapDataSource?
companion object {
private val BASE_URL by lazy {
if (BuildConfig.DEBUG) BuildConfig.TEST_MAP_SOURCE_HOST else BuildConfig.DEV_MAP_SOURCE_HOST
}
private val moshi: Moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
fun create(): MapSourceService {
val logger = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BASIC }
val client = OkHttpClient.Builder()
.addInterceptor(logger)
.build()
return Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build()
.create(MapSourceService::class.java)
}
}
}
\ No newline at end of file
package com.waytous.anticollision.bean
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.squareup.moshi.Json
/**
* 地图数据源
* @author male
* */
@Entity(tableName = "map_source")
data class MapDataSource(
/**数据源ID*/
@PrimaryKey
@ColumnInfo(name = "sourceId")
@Json(ignore = true)
var sourceId:String = "",
/**地图geojson数据*/
@ColumnInfo(name = "geojson")
@Json(name = "geojson")
val geojson: String = "",
/**地图geojson数据版本*/
@ColumnInfo(name = "version")
@Json(name = "version")
val version: Int = -1
)
\ No newline at end of file
package com.waytous.anticollision.bean
data class MapDataSourceWrapper(val mapDataSource: MapDataSource, val abort:Boolean)
\ No newline at end of file
package com.waytous.anticollision.database
import androidx.room.Database
import androidx.room.RoomDatabase
import com.waytous.anticollision.bean.MapDataSource
@Database(entities = [MapDataSource::class], version = 1, exportSchema = false)
abstract class AppDatabase: RoomDatabase() {
abstract fun mapDataSourceDao():MapDataDao
}
\ No newline at end of file
package com.waytous.anticollision.database
import androidx.room.*
import com.waytous.anticollision.bean.MapDataSource
@Dao
interface MapDataDao {
@Query("SELECT * FROM map_source WHERE sourceId = :sourceId")
suspend fun findById(sourceId:String):MapDataSource
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertAll(vararg sources: MapDataSource)
@Delete
suspend fun deleteSource(source: MapDataSource)
}
\ No newline at end of file
package com.waytous.anticollision.location
import com.mapbox.common.LifecycleMonitoringState
import com.mapbox.common.LifecycleObserver
import com.mapbox.common.LifecycleState
import com.mapbox.maps.plugin.locationcomponent.LocationConsumer
import com.mapbox.maps.plugin.locationcomponent.LocationProvider
class MyLocationProvider:LocationProvider {
class MyLocationProvider:LocationProvider,LifecycleObserver{
override fun registerLocationConsumer(locationConsumer: LocationConsumer) {
TODO("Not yet implemented")
}
......@@ -11,4 +14,12 @@ class MyLocationProvider:LocationProvider {
override fun unRegisterLocationConsumer(locationConsumer: LocationConsumer) {
TODO("Not yet implemented")
}
override fun onMonitoringStateChanged(state: LifecycleMonitoringState, error: String?) {
TODO("Not yet implemented")
}
override fun onLifecycleStateChanged(state: LifecycleState) {
TODO("Not yet implemented")
}
}
\ No newline at end of file
This diff is collapsed.
......@@ -2,16 +2,22 @@ package com.waytous.anticollision.ui
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.ViewModelProvider
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.ColorUtils
import com.gyf.immersionbar.ImmersionBar
import com.waytous.anticollision.R
import com.waytous.anticollision.databinding.ActivityMainBinding
import com.waytous.anticollision.repository.MainRepository
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private val viewModel by lazy {
ViewModelProvider(this,MainViewModel.MainViewModelFactory(MainRepository(this)))[MainViewModel::class.java]
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//设置下布局向上移动状态栏的高度
......
package com.waytous.anticollision.ui
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewmodel.CreationExtras
import com.mapbox.geojson.Point
import com.waytous.anticollision.repository.MainRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.*
import java.math.BigDecimal
import javax.inject.Inject
class MainViewModel @Inject constructor(private val mainRepository: MainRepository) : ViewModel() {
val zoom: MutableLiveData<BigDecimal> by lazy {
MutableLiveData(BigDecimal(16.0))
}
val center: MutableLiveData<Point> by lazy {
MutableLiveData(Point.fromLngLat(LONGITUDE, LATITUDE))
}
fun obstaclesSource() =
flowOf(mainRepository.localObstaclesVersion(), mainRepository.remoteObstaclesVersion())
.flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
fun electronicFenceSource() = flowOf(
mainRepository.localElectronicFenceVersion(),
mainRepository.remoteElectronicFenceVersion()
)
.flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
fun wetAreaSource() =
flowOf(mainRepository.localWetAreaVersion(), mainRepository.remoteWetAreaVersion())
.flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
fun laneNodeSource() =
flowOf(mainRepository.localLaneNodeVersion(), mainRepository.remoteLaneNodeVersion())
.flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
fun laneSource() = flowOf(mainRepository.localLaneVersion(), mainRepository.remoteLaneVersion())
.flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
fun runnableAreaSource() = flowOf(
mainRepository.localRunnableAreaVersion(),
mainRepository.remoteRunnableAreaVersion()
).flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
fun dumpAreaSource() =
flowOf(mainRepository.localDumpAreaVersion(), mainRepository.remoteDumpAreaVersion())
.flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
fun diggingWorkAreaSource() = flowOf(
mainRepository.localDiggingAreaVersion(),
mainRepository.remoteDiggingWorkAreaVersion()
).flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
fun barricadeSource() =
flowOf(mainRepository.localBarricadeVersion(), mainRepository.remoteBarricadeVersion())
.flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
fun stationAreaSource() =
flowOf(mainRepository.localStationAreaVersion(), mainRepository.remoteStationAreaVersion())
.flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
fun parkSpotSource() =
flowOf(mainRepository.localParkSpotVersion(), mainRepository.remoteParkSpotVersion())
.flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
fun staticObjectsSource() = flowOf(
mainRepository.localStaticObjectsVersion(),
mainRepository.remoteStaticObjectsVersion()
).flattenMerge()
.transformWhile {
emit(it.mapDataSource)
!it.abort
}.map {
it.geojson
}.flowOn(Dispatchers.IO)
.catch {
emit("")
}
companion object {
const val MY_MAP_BOX_STYLE = "asset://style.json"
const val DUMP_AREA_SOURCE = "dumpAreaSource"
const val DUMP_AREA_LAYER = "dumpAreaLayer"
const val DUMP_AREA_TEXT_LAYER = "dumpAreaTextLayer"
const val OBSTACLES_SOURCE = "obstaclesSource"
const val OBSTACLES_LAYER = "obstaclesLayer"
const val OBSTACLES_TEXT_LAYER = "obstaclesTextLayer"
const val ELECTRONIC_FENCE_SOURCE = "electronicFenceSource"
const val ELECTRONIC_FENCE_LAYER = "electronicFenceLayer"
const val ELECTRONIC_FENCE_TEXT_LAYER = "electronicFenceTextLayer"
const val WET_AREA_SOURCE = "wetAreaSource"
const val WET_AREA_LAYER = "wetAreaLayer"
const val WET_AREA_TEXT_LAYER = "wetAreaTextLayer"
const val LANE_NODE_SOURCE = "laneNodeSource"
const val LANE_NODE_LAYER = "laneNodeLayer"
const val LANE_NODE_TEXT_LAYER = "laneNodeTextLayer"
const val LANE_SOURCE = "laneSource"
const val LANE_LAYER = "laneLayer"
const val LANE_TEXT_LAYER = "laneTextLayer"
const val RUNNABLE_AREA_SOURCE = "runnableAreaSource"
const val RUNNABLE_AREA_LAYER = "runnableAreaLayer"
const val RUNNABLE_AREA_TEXT_LAYER = "runnableAreaTextLayer"
const val DIGGING_WORK_AREA_SOURCE = "diggingWorkAreaSource"
const val DIGGING_WORK_AREA_LAYER = "diggingWorkAreaLayer"
const val DIGGING_WORK_AREA_TEXT_LAYER = "diggingWorkAreaTextLayer"
const val BARRICADE_SOURCE = "barricadeSource"
const val BARRICADE_LAYER = "barricadeLayer"
const val BARRICADE_TEXT_LAYER = "barricadeTextLayer"
const val STATION_AREA_SOURCE = "stationAreaSource"
const val STATION_AREA_LAYER = "stationAreaLayer"
const val STATION_AREA_TEXT_LAYER = "stationAreaTextLayer"
const val STATIC_OBJECTS_SOURCE = "staticObjectsSource"
const val STATIC_OBJECTS_LAYER = "staticObjectsLayer"
const val STATIC_OBJECTS_TEXT_LAYER = "staticObjectsTextLayer"
const val PARK_SPOT_SOURCE = "parkSpotSource"
const val PARK_SPOT_LAYER = "parkSpotLayer"
const val PARK_SPOT_TEXT_LAYER = "parkSpotTextLayer"
const val LONGITUDE = 119.7622539014
const val LATITUDE = 49.3795031825
const val ZOOM = 16.0
}
class MainViewModelFactory(private val mainRepository: MainRepository) :
ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
return MainViewModel(mainRepository) as T
}
}
}
\ No newline at end of file
This diff is collapsed.
......@@ -6,6 +6,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import com.afollestad.materialdialogs.MaterialDialog
import com.blankj.utilcode.util.LogUtils
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
......@@ -23,13 +24,18 @@ class CollectFragment : Fragment() {
private val binding get() = _binding!!
private lateinit var dialogFaultCause:MaterialDialog
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
): View {
_binding = FragmentCollectBinding.inflate(inflater, container, false)
context?:return binding.root
initTablayout()
MaterialDialog(context!!).show {
setContentView(R.layout.dialog_fault_cause_select)
}
return binding.root
}
......
......@@ -6,41 +6,56 @@ import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.fragment.app.viewModels
import androidx.lifecycle.*
import com.blankj.utilcode.util.LogUtils
import com.mapbox.geojson.Point
import com.mapbox.maps.CameraOptions
import com.mapbox.maps.MapView
import com.mapbox.maps.MapboxMap
import com.mapbox.maps.Style
import com.mapbox.maps.extension.observable.eventdata.MapLoadingErrorEventData
import com.mapbox.maps.extension.style.sources.generated.geoJsonSource
import com.mapbox.maps.extension.style.style
import com.mapbox.maps.plugin.Plugin
import com.mapbox.maps.plugin.annotation.annotations
import com.mapbox.maps.plugin.annotation.generated.CircleAnnotationOptions
import com.mapbox.maps.plugin.annotation.generated.createCircleAnnotationManager
import com.mapbox.maps.plugin.delegates.listeners.OnMapLoadErrorListener
import com.mapbox.maps.plugin.logo.LogoPlugin
import com.mapbox.maps.plugin.annotation.generated.PointAnnotation
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager
import com.mapbox.maps.plugin.attribution.attribution
import com.mapbox.maps.plugin.compass.compass
import com.mapbox.maps.plugin.logo.logo
import com.mapbox.maps.viewannotation.ViewAnnotationManager
import com.waytous.anticollision.R
import com.waytous.anticollision.databinding.FragmentHomeBinding
import com.waytous.anticollision.repository.MainRepository
import com.waytous.anticollision.ui.BaseFragment
import com.waytous.anticollision.ui.MainViewModel
import com.waytous.anticollision.ui.view.MoreFeaturesPopup
import com.waytous.anticollision.ui.view.WorkStatusEditPopup
import com.waytous.anticollision.utils.setTextSize
import kotlinx.coroutines.launch
class HomeFragment : Fragment() {
class HomeFragment : BaseFragment() {
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!!
private lateinit var mapView: MapView
private lateinit var mapBox:MapboxMap
private lateinit var viewAnnotationManager: ViewAnnotationManager
private lateinit var pointAnnotationManager: PointAnnotationManager
private lateinit var pointAnnotation: PointAnnotation
private lateinit var moreFeaturesPopup: MoreFeaturesPopup
private lateinit var workStatusEditPopup: WorkStatusEditPopup
private val mapModel: MainViewModel by viewModels{
MainViewModel.MainViewModelFactory(MainRepository(requireContext()))
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
......@@ -48,7 +63,6 @@ class HomeFragment : Fragment() {
): View {
val homeViewModel =
ViewModelProvider(this)[HomeViewModel::class.java]
_binding = FragmentHomeBinding.inflate(inflater, container, false)
context?:return binding.root
workStatusEditPopup = WorkStatusEditPopup(context).also {
......@@ -62,27 +76,13 @@ class HomeFragment : Fragment() {
it.maskOffsetY = 20
it.setBackgroundColor(R.color.color_99000000)
}
val mapView: MapView = binding.defaultMapLayout.mapView
val logoPlugin = mapView.getPlugin<LogoPlugin>(Plugin.MAPBOX_LOGO_PLUGIN_ID)
logoPlugin?.enabled = false
mapBox = mapView.getMapboxMap().also {
logoPlugin?.enabled = false
}
mapBox.setCamera(
CameraOptions.Builder()
.center(
Point.fromLngLat(
LATITUDE,
LONGITUDE
))
.zoom(ZOOM).build()
)
mapView.getMapboxMap().addOnMapLoadErrorListener(object :OnMapLoadErrorListener{
override fun onMapLoadError(eventData: MapLoadingErrorEventData) {
LogUtils.e("OnMapLoadErrorListener:${eventData.message}")
mapView = binding.root.findViewById<MapView?>(R.id.mapView).also {
it.logo.enabled = false
it.compass.enabled = false
it.attribution.enabled = false
}
})
viewAnnotationManager = mapView.viewAnnotationManager
updateMapBox(mapView)
mapView.addRendererSetupErrorListener {
error -> LogUtils.e("RendererSetupErrorListener:${error}")
}
......@@ -94,9 +94,27 @@ class HomeFragment : Fragment() {
binding.defaultToggleMore.setOnClickListener {
moreFeaturesPopup.showPopupWindow(binding.defaultToggleMore)
}
viewLifecycleOwner.lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED){
mapModel.obstaclesSource().collect{binding.defaultMapLayout.addObstaclesSource(it)}
mapModel.runnableAreaSource().collect{binding.defaultMapLayout.addRunnableAreaSource(it)}
mapModel.laneSource().collect{binding.defaultMapLayout.addLaneSource(it)}
mapModel.laneNodeSource().collect{binding.defaultMapLayout.addLaneNodeSource(it)}
mapModel.staticObjectsSource().collect{binding.defaultMapLayout.addStaticObjectsSource(it)}
mapModel.diggingWorkAreaSource().collect{binding.defaultMapLayout.addDiggingWorkAreaSource(it)}
mapModel.barricadeSource().collect{binding.defaultMapLayout.addBarricadeSource(it)}
mapModel.stationAreaSource().collect{binding.defaultMapLayout.addStationAreaSource(it)}
mapModel.parkSpotSource().collect{binding.defaultMapLayout.addParkSpotSource(it)}
mapModel.electronicFenceSource().collect{binding.defaultMapLayout.addElectronicFenceSource(it)}
mapModel.wetAreaSource().collect{binding.defaultMapLayout.addWetAreaSource(it)}
mapModel.dumpAreaSource().collect{binding.defaultMapLayout.addDumpAreaSource(it)}
}
}
return binding.root
}
private fun setTodayCarriedNum(num:Int){
val templateString = getString(R.string.today_carried_text, num)
val spannableString = SpannableString(templateString)
......@@ -114,10 +132,4 @@ class HomeFragment : Fragment() {
_binding = null
}
companion object {
private const val GEOJSON_SOURCE_ID = "tile"
private const val LATITUDE = 108.926593
private const val LONGITUDE = 34.213389
private const val ZOOM = 14.0
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package com.waytous.anticollision.ui.video
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.text.SpannableString
......@@ -9,50 +10,50 @@ import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.content.res.AppCompatResources
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.graphics.scale
import androidx.core.view.get
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.findNavController
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
import com.blankj.utilcode.util.LogUtils
import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.MediaItem
import com.mapbox.geojson.FeatureCollection
import com.mapbox.geojson.Point
import com.mapbox.maps.CameraOptions
import com.mapbox.maps.MapView
import com.mapbox.maps.MapboxMap
import com.mapbox.maps.Style
import com.mapbox.maps.ViewAnnotationOptions
import com.mapbox.maps.extension.style.expressions.dsl.generated.interpolate
import com.mapbox.maps.extension.style.expressions.dsl.generated.get
import com.mapbox.maps.extension.style.image.image
import com.mapbox.maps.extension.style.layers.generated.fillLayer
import com.mapbox.maps.extension.style.layers.generated.symbolLayer
import com.mapbox.maps.extension.style.layers.properties.generated.IconAnchor
import com.mapbox.maps.extension.style.layers.properties.generated.TextAnchor
import com.mapbox.maps.extension.style.layers.properties.generated.TextRotationAlignment
import com.mapbox.maps.extension.style.layers.properties.generated.Visibility
import com.mapbox.maps.extension.style.sources.generated.geoJsonSource
import com.mapbox.maps.extension.style.sources.generated.rasterDemSource
import com.mapbox.maps.extension.style.style
import com.mapbox.maps.extension.style.terrain.generated.terrain
import com.mapbox.maps.plugin.LocationPuck2D
import com.mapbox.maps.plugin.Plugin
import com.mapbox.maps.plugin.annotation.annotations
import com.mapbox.maps.plugin.annotation.generated.PointAnnotation
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationManager
import com.mapbox.maps.plugin.annotation.generated.PointAnnotationOptions
import com.mapbox.maps.plugin.annotation.generated.createPointAnnotationManager
import com.mapbox.maps.plugin.gestures.gestures
import com.mapbox.maps.plugin.locationcomponent.OnIndicatorBearingChangedListener
import com.mapbox.maps.plugin.locationcomponent.OnIndicatorPositionChangedListener
import com.mapbox.maps.plugin.attribution.attribution
import com.mapbox.maps.plugin.compass.compass
import com.mapbox.maps.plugin.locationcomponent.location
import com.mapbox.maps.plugin.logo.logo
import com.mapbox.maps.viewannotation.ViewAnnotationManager
import com.waytous.anticollision.R
import com.waytous.anticollision.api.ApiService
import com.waytous.anticollision.databinding.FragmentVideoHomeBinding
import com.waytous.anticollision.ui.MainViewModel
import com.waytous.anticollision.ui.view.MoreFeaturesPopup
import com.waytous.anticollision.ui.view.WorkStatusEditPopup
import com.waytous.anticollision.utils.getBitmapFromVectorDrawable
import com.waytous.anticollision.utils.setTextSize
import kotlinx.coroutines.launch
import java.io.File
class VideoHomeFragment : Fragment() {
......@@ -82,10 +83,16 @@ class VideoHomeFragment : Fragment() {
const val MY_VEHICLE_NORMAL = "my_vehicle_normal"
private const val GEOJSON_SOURCE_ID = "tile"
private const val LATITUDE = 108.926593
private const val LONGITUDE = 34.213389
private const val ZOOM = 14.0
private const val DUMP_AREA_SOURCE = "dumpareasource"
private const val DUMP_AREA_LAYER = "dumparealayer"
private const val DUMP_AREA_TEXT_LAYER = "dumpareatextlayer"
private const val RUNNABLE_AREA_SOURCE = "runableareasource"
private const val RUNNABLE_AREA_LAYER = "runablearealayer"
private const val LATITUDE = 119.7622539014
private const val LONGITUDE = 49.3795031825
// private const val LATITUDE = 108.926593
// private const val LONGITUDE = 34.213389
private const val ZOOM = 16.0
}
private val viewModel: VideoHomeViewModel by viewModels()
......@@ -119,6 +126,8 @@ class VideoHomeFragment : Fragment() {
binding.speedText.setTextSize(spannableString, templateString)
mapView = binding.root.findViewById<MapView?>(R.id.mapView).also {
it.logo.enabled = false
it.compass.enabled = false
it.attribution.enabled = false
}
mapboxMap = mapView.getMapboxMap()
viewAnnotationManager = mapView.viewAnnotationManager
......@@ -132,11 +141,33 @@ class VideoHomeFragment : Fragment() {
private fun initLocationComponent() {
val locationComponentPlugin = mapView.location
lifecycleScope.launch {
val mapData = ApiService.create().dumpAreaVersion("-1")
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED){
mapView.getMapboxMap().loadStyle(
style(styleUri = Style.MAPBOX_STREETS) {
+geoJsonSource(GEOJSON_SOURCE_ID) {
url("asset://xian.geojson")
style(styleUri = MainViewModel.MY_MAP_BOX_STYLE) {
+geoJsonSource(DUMP_AREA_SOURCE) {
data(mapData?.geojson!!)
LogUtils.d(get("name").literalValue)
}
+fillLayer(DUMP_AREA_LAYER,DUMP_AREA_SOURCE){
fillColor("#886e26")
fillOpacity(0.85)
fillAntialias(false)
visibility(Visibility.VISIBLE)
}
+symbolLayer(DUMP_AREA_TEXT_LAYER, DUMP_AREA_SOURCE){
textColor(Color.BLACK)
textField(get("name"))
textFont(listOf("DIN Offc Pro Italic", "Arial Unicode MS Regular"))
textLineHeight(1.0)
textPadding(1.0)
textOffset(listOf(0.5,2.0))
textRotationAlignment(TextRotationAlignment.MAP)
textAnchor(TextAnchor.TOP)
textSize(16.0)
textMaxAngle(10.0)
visibility(Visibility.VISIBLE)
}
}
) {
......@@ -146,8 +177,8 @@ class VideoHomeFragment : Fragment() {
val pointAnnotationOptions: PointAnnotationOptions = PointAnnotationOptions()
.withPoint(
Point.fromLngLat(
LATITUDE,
LONGITUDE
LONGITUDE,
LATITUDE
)
)
.withIconImage(bitmap!!.apply {
......@@ -166,6 +197,8 @@ class VideoHomeFragment : Fragment() {
)
).zoom(ZOOM).build()
)
}
}
// locationComponentPlugin.locationPuck = LocationPuck2D(
// bearingImage = VectorDrawableCompat.create(
// resources,
......@@ -199,7 +232,7 @@ class VideoHomeFragment : Fragment() {
}
private fun initPlayer() {
val uri1 = Uri.fromFile(File(activity!!.filesDir, "飞书20230420-181456.mp4"))
val uri1 = Uri.fromFile(File(requireActivity().filesDir, "飞书20230420-181456.mp4"))
player1 = activity?.let {
ExoPlayer.Builder(it).build().apply {
setMediaItem(MediaItem.Builder().setUri(uri1).build())
......@@ -207,7 +240,7 @@ class VideoHomeFragment : Fragment() {
}
binding.videoView1.player = player1
player1?.prepare()
val uri2 = Uri.fromFile(File(activity!!.filesDir, "飞书20230420-181512.mp4"))
val uri2 = Uri.fromFile(File(requireActivity().filesDir, "飞书20230420-181512.mp4"))
player2 = activity?.let {
ExoPlayer.Builder(it).build().apply {
setMediaItem(MediaItem.Builder().setUri(uri2).build())
......
......@@ -15,6 +15,8 @@ import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
const val databaseName = "anti_collision.db"
/**
* 连接状态
* */
......
......@@ -2,7 +2,7 @@ package com.waytous.anticollision.utils
import android.content.Context
import android.content.SharedPreferences
import com.waytous.anticollision.MyApp
import com.waytous.anticollision.AntiCollisionApp
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
......@@ -10,7 +10,7 @@ class PreferenceDelegate<T>(private val name: String, private val default: T, pr
: ReadWriteProperty<Any?, T> {
private val prefs: SharedPreferences =
MyApp.instance().applicationContext.getSharedPreferences(prefName, Context.MODE_PRIVATE)
AntiCollisionApp.instance().applicationContext.getSharedPreferences(prefName, Context.MODE_PRIVATE)
@Synchronized
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
......
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="67dp"
android:height="6dp"
android:viewportWidth="67"
android:viewportHeight="6">
<path
android:pathData="M67,6l-67,0l0,-6l2,0l0,4l63,0l0,-4l2,0l0,6z"
android:fillColor="#dcdcdc"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="67dp"
android:height="6dp"
android:viewportWidth="67"
android:viewportHeight="6">
<path
android:pathData="M67,6l-67,0l0,-6l2,0l0,4l63,0l0,-4l2,0l0,6z"
android:fillColor="#2c2c2c"/>
</vector>
......@@ -15,10 +15,11 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
<CheckedTextView
android:id="@+id/itemFaultEngine"
style="@style/FaultCauseTextStyle"
android:text="@string/fault_cause_engine"
android:background="@drawable/background_fault_cause_item"
android:drawableTop="@drawable/background_fault_cause_item_engine"
android:layout_marginTop="77dp"
android:layout_marginStart="44dp"
......@@ -29,6 +30,7 @@
android:id="@+id/itemFaultMechanical"
style="@style/FaultCauseTextStyle"
android:text="@string/fault_cause_mechanical"
android:background="@drawable/background_fault_cause_item"
android:drawableTop="@drawable/background_fault_cause_item_mechanical"
android:layout_marginStart="32dp"
app:layout_constraintTop_toTopOf="@id/itemFaultEngine"
......@@ -39,6 +41,7 @@
android:id="@+id/itemFaultHydraulicSystem"
style="@style/FaultCauseTextStyle"
android:text="@string/fault_cause_hydraulic_system"
android:background="@drawable/background_fault_cause_item"
android:drawableTop="@drawable/background_fault_cause_item_hydraulic_system"
android:layout_marginStart="32dp"
app:layout_constraintTop_toTopOf="@id/itemFaultMechanical"
......@@ -51,6 +54,7 @@
style="@style/FaultCauseTextStyle"
android:layout_marginEnd="44dp"
android:layout_marginStart="32dp"
android:background="@drawable/background_fault_cause_item"
android:drawableTop="@drawable/background_fault_cause_item_electrical"
android:text="@string/fault_cause_electrical"
app:layout_constraintEnd_toEndOf="parent"
......@@ -61,6 +65,7 @@
android:id="@+id/itemFaultEdgeReduction"
style="@style/FaultCauseTextStyle"
android:layout_marginTop="28dp"
android:background="@drawable/background_fault_cause_item"
android:drawableTop="@drawable/background_fault_cause_item_edge_reduction"
android:text="@string/fault_cause_edge_reduction"
app:layout_constraintEnd_toEndOf="@+id/itemFaultEngine"
......@@ -70,6 +75,7 @@
android:id="@+id/itemFaultTire"
style="@style/FaultCauseTextStyle"
android:layout_marginStart="32dp"
android:background="@drawable/background_fault_cause_item"
android:drawableTop="@drawable/background_fault_cause_item_tire"
android:text="@string/fault_cause_tire"
app:layout_constraintTop_toTopOf="@id/itemFaultEdgeReduction"
......@@ -79,6 +85,7 @@
android:id="@+id/itemFaultEquipmentMaintenance"
style="@style/FaultCauseTextStyle"
android:layout_marginStart="32dp"
android:background="@drawable/background_fault_cause_item"
android:drawableTop="@drawable/background_fault_cause_item_equipment_maintenance"
android:text="@string/fault_cause_equipment_maintenance"
app:layout_constraintTop_toTopOf="@id/itemFaultTire"
......@@ -88,6 +95,7 @@
android:id="@+id/itemFaultOtherInputs"
style="@style/FaultCauseTextStyle"
android:layout_marginStart="32dp"
android:background="@drawable/background_fault_cause_item"
android:drawableTop="@drawable/background_fault_cause_item_other_inputs"
android:text="@string/fault_cause_other_inputs"
app:layout_constraintTop_toTopOf="@id/itemFaultEquipmentMaintenance"
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.BaseFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
\ No newline at end of file
......@@ -282,9 +282,8 @@
app:layout_constraintTop_toTopOf="@id/defaultToggleMore"
app:layout_constraintEnd_toEndOf="@id/defaultMapLayout" />
<include
<com.waytous.anticollision.ui.MapBoxLayout
android:id="@+id/defaultMapLayout"
layout="@layout/layout_map_box"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginEnd="16dp"
......
......@@ -7,10 +7,19 @@
android:background="@drawable/drawable_bg_map_box"
tools:context=".ui.MainActivity">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/collectDataText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.mapbox.maps.MapView
android:id="@+id/mapView"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_margin="@dimen/dp_3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
......@@ -18,15 +27,15 @@
app:mapbox_resourcesAccessToken="@string/map_box_public_key"
app:mapbox_scaleBarBorderWidth="0dp"
app:mapbox_scaleBarGravity="bottom|end"
app:mapbox_scaleBarHeight="2dp"
app:mapbox_scaleBarHeight="@dimen/dp_6"
app:mapbox_scaleBarIsMetricUnits="true"
app:mapbox_scaleBarMarginBottom="15dp"
app:mapbox_scaleBarMarginRight="12dp"
app:mapbox_scaleBarRatio="0.2"
app:mapbox_scaleBarMarginRight="24dp"
app:mapbox_scaleBarTextBarMargin="10dp"
app:mapbox_scaleBarTextBorderWidth="5dp"
app:mapbox_scaleBarTextColor="@color/home_text_color"
app:mapbox_scaleBarTextSize="9sp"/>
app:mapbox_scaleBarTextSize="@dimen/dp_18" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/sos"
style="@style/MapBoxButtonStyle"
......@@ -38,6 +47,7 @@
android:src="@drawable/background_sos_btn"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/emergency"
style="@style/MapBoxButtonStyle"
......@@ -49,6 +59,7 @@
android:src="@mipmap/icon_driving_state_emergency"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/zoomLayout"
android:layout_width="wrap_content"
......@@ -58,6 +69,7 @@
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/zoomOut"
style="@style/MapBoxButtonStyle"
......@@ -66,12 +78,14 @@
android:layout_weight="1"
android:contentDescription="@string/zoom_out"
android:src="@drawable/background_zoom_out" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:background="@color/color_ffcacaca"/>
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:background="@color/color_ffcacaca" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/zoomIn"
style="@style/MapBoxButtonStyle"
......@@ -81,28 +95,43 @@
android:contentDescription="@string/zoom_in"
android:src="@drawable/background_zoom_in" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/locationTruck"
style="@style/MapBoxButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="28dp"
android:contentDescription="@string/location_truck"
android:src="@drawable/background_location_truck"
app:layout_constraintStart_toStartOf="@id/zoomLayout"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintEnd_toEndOf="@id/zoomLayout"
app:layout_constraintStart_toStartOf="@id/zoomLayout"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/toggleSafetyRange"
style="@style/MapBoxButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="34dp"
android:layout_marginEnd="28dp"
android:contentDescription="@string/toggle_safety_range"
android:src="@mipmap/icon_map_enable_safety_range_light"
app:layout_constraintEnd_toEndOf="@id/zoomLayout"
app:layout_constraintStart_toStartOf="@id/zoomLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/locationTruck" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/collectDataText"
android:layout_width="0dp"
android:layout_height="@dimen/dp_56"
android:layout_marginStart="@dimen/dp_3"
android:layout_marginEnd="@dimen/dp_3"
android:gravity="center"
android:text="@string/collect_data_text"
android:visibility="gone"
android:textSize="@dimen/sp_20"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mobile_navigation"
app:startDestination="@id/navigation_video_Home">
app:startDestination="@id/navigation_home">
<fragment
android:id="@+id/navigation_home"
......
......@@ -9,6 +9,7 @@
<color name="white">#FFFFFFFF</color>
<color name="half_white">#80FFFFFF</color>
<color name="color_ff333333">#ff333333</color>
<color name="color_ff666666">#ff666666</color>
<color name="color_80333333">#80333333</color>
<color name="color_0052D8">#ff0052d8</color>
<color name="status_bg_color">#ebefefef</color>
......@@ -31,4 +32,5 @@
<color name="color_4d3c3c3c">#4d3c3c3c</color>
<color name="color_1a000000">#1a000000</color>
<color name="color_ff3684F9">#ff3684F9</color>
<color name="color_green">#00ff00</color>
</resources>
\ No newline at end of file
This diff is collapsed.
......@@ -68,6 +68,7 @@
<string name="fault_cause_equipment_maintenance">设备保养</string>
<string name="fault_cause_other_inputs">其他录入</string>
<string name="pls_input_cause">请输入原因说明</string>
<string name="collect_data_text">采集状态:%1s 采集点数:%2d 速度:%3dKM/h 当前位置:%4f,%5f 高程:%6fm</string>
<string name="confirm">确定</string>
<string name="cancel">取消</string>
......
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.3.1' apply false
id 'com.android.library' version '7.3.1' apply false
id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
id 'com.android.application' version '7.4.2' apply false
id 'com.android.library' version '7.4.2' apply false
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
id 'com.google.dagger.hilt.android' version '2.44' apply false
}
\ No newline at end of file
......@@ -15,6 +15,7 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
android.enableJetifier=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
......
#Thu Feb 16 11:06:04 CST 2023
#Thu May 04 15:47:53 CST 2023
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment