Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
H
HTAnticollision
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
马乐
HTAnticollision
Commits
552c8ce0
Commit
552c8ce0
authored
May 16, 2023
by
马乐
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1.完善单向可信数据源封装
parent
69f8a7a4
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
35 changed files
with
897 additions
and
110 deletions
+897
-110
build.gradle
app/build.gradle
+39
-12
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+2
-1
AntiCollisionApp.kt
...c/main/java/com/waytous/anticollision/AntiCollisionApp.kt
+5
-3
AppExecutors.kt
app/src/main/java/com/waytous/anticollision/AppExecutors.kt
+66
-0
ApiService.kt
...src/main/java/com/waytous/anticollision/api/ApiService.kt
+114
-0
MapSourceService.kt
...in/java/com/waytous/anticollision/api/MapSourceService.kt
+114
-0
MapDataSource.kt
...main/java/com/waytous/anticollision/bean/MapDataSource.kt
+29
-0
MapDataSourceWrapper.kt
...va/com/waytous/anticollision/bean/MapDataSourceWrapper.kt
+4
-0
AppDatabase.kt
...in/java/com/waytous/anticollision/database/AppDatabase.kt
+11
-0
MapDataDao.kt
...ain/java/com/waytous/anticollision/database/MapDataDao.kt
+19
-0
MyLocationProvider.kt
.../com/waytous/anticollision/location/MyLocationProvider.kt
+13
-1
MainRepository.kt
...va/com/waytous/anticollision/repository/MainRepository.kt
+0
-0
BaseFragment.kt
...rc/main/java/com/waytous/anticollision/ui/BaseFragment.kt
+0
-0
MainActivity.kt
...rc/main/java/com/waytous/anticollision/ui/MainActivity.kt
+6
-0
MainViewModel.kt
...c/main/java/com/waytous/anticollision/ui/MainViewModel.kt
+249
-0
MapBoxLayout.kt
...rc/main/java/com/waytous/anticollision/ui/MapBoxLayout.kt
+0
-0
CollectFragment.kt
...a/com/waytous/anticollision/ui/collect/CollectFragment.kt
+7
-1
HomeFragment.kt
...in/java/com/waytous/anticollision/ui/home/HomeFragment.kt
+54
-43
VideoHomeFragment.kt
...a/com/waytous/anticollision/ui/video/VideoHomeFragment.kt
+59
-26
Extensions.kt
...c/main/java/com/waytous/anticollision/utils/Extensions.kt
+2
-0
PreferenceDelegate.kt
...ava/com/waytous/anticollision/utils/PreferenceDelegate.kt
+2
-2
map_scale_bar.xml
app/src/main/res/drawable-night/map_scale_bar.xml
+9
-0
map_scale_bar.xml
app/src/main/res/drawable/map_scale_bar.xml
+9
-0
dialog_fault_cause_select.xml
app/src/main/res/layout/dialog_fault_cause_select.xml
+9
-1
fragment_base.xml
app/src/main/res/layout/fragment_base.xml
+15
-0
fragment_home.xml
app/src/main/res/layout/fragment_home.xml
+1
-2
layout_map_box.xml
app/src/main/res/layout/layout_map_box.xml
+42
-12
mobile_navigation.xml
app/src/main/res/navigation/mobile_navigation.xml
+1
-1
colors.xml
app/src/main/res/values/colors.xml
+3
-0
dimens.xml
app/src/main/res/values/dimens.xml
+0
-0
strings.xml
app/src/main/res/values/strings.xml
+1
-0
network_security_config.xml
app/src/main/res/xml/network_security_config.xml
+4
-0
build.gradle
build.gradle
+5
-3
gradle.properties
gradle.properties
+1
-0
gradle-wrapper.properties
gradle/wrapper/gradle-wrapper.properties
+2
-2
No files found.
app/build.gradle
View file @
552c8ce0
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.2
0
'
implementation
'org.jetbrains.kotlin:kotlin-reflect:1.7.2
2
'
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
app/src/main/AndroidManifest.xml
View file @
552c8ce0
...
...
@@ -16,12 +16,13 @@
<application
android:name=
".
My
App"
android:name=
".
AntiCollision
App"
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"
...
...
app/src/main/java/com/waytous/anticollision/
My
App.kt
→
app/src/main/java/com/waytous/anticollision/
AntiCollision
App.kt
View file @
552c8ce0
...
...
@@ -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
:
My
App
by
Delegates
.
notNull
()
private
var
instance
:
AntiCollision
App
by
Delegates
.
notNull
()
fun
instance
()
=
instance
}
}
\ No newline at end of file
app/src/main/java/com/waytous/anticollision/AppExecutors.kt
0 → 100644
View file @
552c8ce0
/*
* 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
)
}
}
}
app/src/main/java/com/waytous/anticollision/api/ApiService.kt
0 → 100644
View file @
552c8ce0
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
app/src/main/java/com/waytous/anticollision/api/MapSourceService.kt
0 → 100644
View file @
552c8ce0
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
app/src/main/java/com/waytous/anticollision/bean/MapDataSource.kt
0 → 100644
View file @
552c8ce0
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
app/src/main/java/com/waytous/anticollision/bean/MapDataSourceWrapper.kt
0 → 100644
View file @
552c8ce0
package
com.waytous.anticollision.bean
data class
MapDataSourceWrapper
(
val
mapDataSource
:
MapDataSource
,
val
abort
:
Boolean
)
\ No newline at end of file
app/src/main/java/com/waytous/anticollision/database/AppDatabase.kt
0 → 100644
View file @
552c8ce0
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
app/src/main/java/com/waytous/anticollision/database/MapDataDao.kt
0 → 100644
View file @
552c8ce0
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
app/src/main/java/com/waytous/anticollision/location/MyLocationProvider.kt
View file @
552c8ce0
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
app/src/main/java/com/waytous/anticollision/repository/MainRepository.kt
0 → 100644
View file @
552c8ce0
This diff is collapsed.
Click to expand it.
app/src/main/java/com/waytous/anticollision/ui/BaseFragment.kt
0 → 100644
View file @
552c8ce0
This diff is collapsed.
Click to expand it.
app/src/main/java/com/waytous/anticollision/ui/MainActivity.kt
View file @
552c8ce0
...
...
@@ -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
)
//设置下布局向上移动状态栏的高度
...
...
app/src/main/java/com/waytous/anticollision/ui/MainViewModel.kt
0 → 100644
View file @
552c8ce0
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
app/src/main/java/com/waytous/anticollision/ui/MapBoxLayout.kt
0 → 100644
View file @
552c8ce0
This diff is collapsed.
Click to expand it.
app/src/main/java/com/waytous/anticollision/ui/collect/CollectFragment.kt
View file @
552c8ce0
...
...
@@ -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
}
...
...
app/src/main/java/com/waytous/anticollision/ui/home/HomeFragment.kt
View file @
552c8ce0
...
...
@@ -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
:
Base
Fragment
()
{
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
app/src/main/java/com/waytous/anticollision/ui/video/VideoHomeFragment.kt
View file @
552c8ce0
...
...
@@ -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
(
LAT
ITUDE
,
LONG
ITUDE
LONG
ITUDE
,
LAT
ITUDE
)
)
.
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
())
...
...
app/src/main/java/com/waytous/anticollision/utils/Extensions.kt
View file @
552c8ce0
...
...
@@ -15,6 +15,8 @@ import androidx.core.content.ContextCompat
import
androidx.core.graphics.drawable.DrawableCompat
const
val
databaseName
=
"anti_collision.db"
/**
* 连接状态
* */
...
...
app/src/main/java/com/waytous/anticollision/utils/PreferenceDelegate.kt
View file @
552c8ce0
...
...
@@ -2,7 +2,7 @@ package com.waytous.anticollision.utils
import
android.content.Context
import
android.content.SharedPreferences
import
com.waytous.anticollision.
My
App
import
com.waytous.anticollision.
AntiCollision
App
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
=
My
App
.
instance
().
applicationContext
.
getSharedPreferences
(
prefName
,
Context
.
MODE_PRIVATE
)
AntiCollision
App
.
instance
().
applicationContext
.
getSharedPreferences
(
prefName
,
Context
.
MODE_PRIVATE
)
@Synchronized
override
fun
getValue
(
thisRef
:
Any
?,
property
:
KProperty
<*>):
T
{
...
...
app/src/main/res/drawable-night/map_scale_bar.xml
0 → 100644
View file @
552c8ce0
<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>
app/src/main/res/drawable/map_scale_bar.xml
0 → 100644
View file @
552c8ce0
<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>
app/src/main/res/layout/dialog_fault_cause_select.xml
View file @
552c8ce0
...
...
@@ -15,10 +15,11 @@
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
/>
<
androidx.appcompat.widget.AppCompat
TextView
<
Checked
TextView
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"
...
...
app/src/main/res/layout/fragment_base.xml
0 → 100644
View file @
552c8ce0
<?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
app/src/main/res/layout/fragment_home.xml
View file @
552c8ce0
...
...
@@ -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"
...
...
app/src/main/res/layout/layout_map_box.xml
View file @
552c8ce0
...
...
@@ -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
app/src/main/res/navigation/mobile_navigation.xml
View file @
552c8ce0
...
...
@@ -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_H
ome"
>
app:startDestination=
"@id/navigation_
h
ome"
>
<fragment
android:id=
"@+id/navigation_home"
...
...
app/src/main/res/values/colors.xml
View file @
552c8ce0
...
...
@@ -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
app/src/main/res/values/dimens.xml
View file @
552c8ce0
This diff is collapsed.
Click to expand it.
app/src/main/res/values/strings.xml
View file @
552c8ce0
...
...
@@ -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>
...
...
app/src/main/res/xml/network_security_config.xml
0 → 100644
View file @
552c8ce0
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config
cleartextTrafficPermitted=
"true"
/>
</network-security-config>
build.gradle
View file @
552c8ce0
// 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
gradle.properties
View file @
552c8ce0
...
...
@@ -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
...
...
gradle/wrapper/gradle-wrapper.properties
View file @
552c8ce0
#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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment