Merge branch 'dev_robotaxi-d_230912_6.1.0' into dev_minibus-d_230926_6.1.0

This commit is contained in:
yangyakun
2023-10-07 18:34:51 +08:00
25 changed files with 1176 additions and 147 deletions

3
.gitignore vendored
View File

@@ -7,5 +7,4 @@
/build
/captures
.externalNativeBuild
.cxx
.gitlab-ci.yml
.cxx

25
.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,25 @@
stages:
- analyze
inspect java and kotlin codes:
tags:
- apk
- android
stage: analyze
script:
- echo "$CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA $CI_COMMIT_BRANCH"
- echo "$CI_JOB_STAGE}_reports_${CI_PROJECT_NAME}_${CI_BUILD_REF_NAME}"
- ./gradlew runCodeInspect
before_script:
- source change_java_version
artifacts:
name: "$CI_JOB_STAGE}_reports_${CI_PROJECT_NAME}_$CI_COMMIT_REF_SLUG"
when: on_failure
expire_in: 1 days
paths:
- "build/reports/*"
only:
- "$CI_COMMIT_BRANCH"
except:
- master
allow_failure: true

View File

@@ -45,8 +45,6 @@ import org.greenrobot.eventbus.EventBus
*/
class SelectLineView : ConstraintLayout, SelectLineViewModel.SelectLineViewCallback {
private val TAG = "OrderInfoView"
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
@@ -100,7 +98,7 @@ class SelectLineView : ConstraintLayout, SelectLineViewModel.SelectLineViewCallb
rlv_line_list.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
rlv_line_list.addItemDecoration(
com.mogo.och.charter.passenger.ui.selectline.layoutmanage.BottomDecoration(
BottomDecoration(
AutoSizeUtils.dp2px(context, 60f)
)
)
@@ -109,7 +107,7 @@ class SelectLineView : ConstraintLayout, SelectLineViewModel.SelectLineViewCallb
rv_site_list.layoutManager =
LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
rv_site_list.addItemDecoration(
com.mogo.och.charter.passenger.ui.selectline.layoutmanage.BottomDecoration(
BottomDecoration(
AutoSizeUtils.dp2px(context, 90f)
)
)

View File

@@ -61,7 +61,7 @@ internal class InfoVideoView @JvmOverloads constructor(
"蘑菇车联之红旗车队"
))
add(
com.mogo.och.taxi.passenger.bean.TaxiPassengerVideoPlay(
TaxiPassengerVideoPlay(
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655708499497/大运会合作解说版.m4v",
"https://img.zhidaohulian.com/fileServer/online_car_hailing/1655969536177/大运会.png",
"蘑菇车联牵手成都大运会"
@@ -79,7 +79,7 @@ internal class InfoVideoView @JvmOverloads constructor(
fun exitFullScreenMode(resetVideoPlayer: Boolean) {
val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager
val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager)
val (_: Int, player) = getPlayer(carouselLayoutManager)
player?.let {
it.exitFullScreenMode()
it.onVideoPause()
@@ -100,7 +100,7 @@ internal class InfoVideoView @JvmOverloads constructor(
return
}
val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager
val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager)
val (_: Int, player) = getPlayer(carouselLayoutManager)
when (visibility) {
View.VISIBLE -> {
player?.let {
@@ -218,7 +218,7 @@ internal class InfoVideoView @JvmOverloads constructor(
override fun onWindowFocusChanged(hasWindowFocus: Boolean) {
super.onWindowFocusChanged(hasWindowFocus)
val carouselLayoutManager = rvVideoPlaylist?.layoutManager as CarouselLayoutManager
val (centerItemPosition: Int, player) = getPlayer(carouselLayoutManager)
val (_: Int, player) = getPlayer(carouselLayoutManager)
player?.let {
if(it.isInPlayingState&&!it.isIfCurrentIsFullscreen&&!hasWindowFocus){
player.onVideoPause()

View File

@@ -303,6 +303,10 @@ class TaxiCurrentTaskViewModel : BaseViewModel<UnmannedState, TaskUiIntent>(),
*/
override fun onStopAutopilot() {
UiThreadHandler.removeCallbacks(startTaskRunnable)
if (!TaxiTaskModel.checkCurrentTaskCondition()) {
d(TAG, "onStopAutopilot: 无任务无需流转状态")
return
}
startTask(false)
}

View File

@@ -1322,6 +1322,7 @@ object TaxiTaskModel {
*/
fun clearCurrentOCHOrder() {
clearAutopilotControlParameters()
mIsArrivedSiteStartTag = false
isRestartAutopilot = false
if (FunctionBuildConfig.isDemoMode) {
// 当美化模式(演示模式)开启时: 取消或订单已完成时置false

View File

@@ -19,7 +19,6 @@ import com.mogo.eagle.core.block.runtime.config.recorder.*
import com.mogo.eagle.core.block.runtime.utils.TimeUtils.Companion.now
import com.mogo.eagle.core.function.call.devatools.*
import com.mogo.eagle.core.utilcode.util.*
import kotlinx.coroutines.*
import kotlinx.coroutines.Runnable
import java.lang.ref.WeakReference
import java.util.LinkedList

View File

@@ -39,7 +39,7 @@ buildscript {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18'
classpath "com.mogo.sticky:service:${plugin_version}"
classpath "io.github.knight-zxw:lancet-plugin:${lancetx_plugin_version}"
classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.21.0"
classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.15.0"
classpath 'com.mogo.cloud:matrix:1.0.0'
// classpath 'com.bytedance.btrace:rhea-gradle-plugin:2.0.0'
}
@@ -52,7 +52,6 @@ buildscript {
}
allprojects {
apply from: rootProject.file('codequality/pmd.gradle')
repositories {
mavenLocal()
maven { url 'http://nexus.zhidaoauto.com/repository/maven-releases/' }
@@ -73,6 +72,17 @@ allprojects {
}
google()
}
if (isCodeInspectEnable ) {
def basePath = new File(codequality, 'code_inspect_increment.gradle').path
apply from: "$basePath"
def pmdPath = new File(codequality, 'pmd.gradle').path
apply from: "$pmdPath"
def detektPath = new File(codequality, 'detekt.gradle').path
apply from: "$detektPath"
def codeInspectPath = new File(codequality, 'code_inspect.gradle').path
apply from: "$codeInspectPath"
}
}
task clean(type: Delete) {

0
codequality/baseline.xml Normal file
View File

View File

@@ -0,0 +1,24 @@
task runCodeInspect {
group = "codeInspect"
description = "静态代码检查统一触发pmd detekt任务"
}
project.afterEvaluate {
bindTask("pmd", "runCodeInspect")
bindTask("detekt", "runCodeInspect")
}
/**
* 绑定任务
* @param taskName 任务名称
* @param targetTaskName 被绑定的任务名称
* @param action taskName指定的任务执行完成后的回调
*/
def bindTask(String taskName, String targetTaskName) {
def task = project.tasks.findByName(taskName)
if (task != null) {
logger.lifecycle("${task} will be run")
def targetTask = project.tasks.findByName(targetTaskName)
targetTask.finalizedBy(task)
}
}

View File

@@ -0,0 +1,187 @@
ext {
//存储增量的Java文件给pmd使用
commitJavaFiles = new ArrayList<String>()
//存储增量的kotlin文件给detekt使用
commitKotlinFiles = new ArrayList<String>()
commitAuthor = ""
appVersionName = ""
}
/**
* 增量开关, 给 lint 插件做增量扫描使用
*/
def isIncrement = false
/**
* 通过cmd命令获取结果值
* @return string 结果值
*/
def getResultFromCmd(String cmd) {
logger.lifecycle("${project.name} cmd:$cmd")
def out = new ByteArrayOutputStream()
if (System.properties['os.name'].toLowerCase().contains('windows')) {
project.exec {
ExecSpec execSpec ->
executable 'cmd'
args '/c', "$cmd"
standardOutput = out
}.assertNormalExitValue()
} else {
// jenkins 打包出异常需要区分linux和macOS
// project.exec {
// ExecSpec execSpec ->
// executable 'bash'
// args '-c', "$cmd"
// standardOutput = out
// }.assertNormalExitValue()
}
return out.toString().trim()
}
/**
* 获取提交作者
* @return 提交作者
*/
def getCommitAuthor() {
def commitAuthor = ""
// if (isCiServer()) {
// commitAuthor = "${System.env.CI_COMMIT_AUTHOR}"
// commitAuthor = commitAuthor.substring(0, commitAuthor.indexOf('<')).trim()
// } else {
commitAuthor = getResultFromCmd("git config --get user.name")
// }
return commitAuthor
}
/**
* 获取提交 sha用于 git diff 出增量文件,其它项目仓库,这个方法需要更改实现
* @return 提交 sha
*/
def getCommitTargetSha() {
//目前这个仓库只能根据上一个merge节点进行代码增量检测
def commitTargetSha = getResultFromCmd("git log --max-count=1 --pretty=%H --merges")
return commitTargetSha
}
/**
* 获取提交文件,只包含.java和.kt的文件
* @return 文件相对路径数组
*/
def getCommitFiles() {
def commitTargetSha = getCommitTargetSha()
def commitSha = getResultFromCmd("git log --max-count=1 --pretty=%H")
def commitAuthor = getCommitAuthor()
def cmd = "git log --name-only --author=$commitAuthor --pretty=\"format:\" $commitTargetSha..$commitSha"
def result = getResultFromCmd(cmd)
def projectStartPath = getProjectStartPath()
logger.lifecycle("projectStartPath=$projectStartPath")
if (result != null && result.trim().length() > 0) {
def files = result.readLines()
.findAll { it.startsWith("${projectStartPath}") && isFilePathValid(it) }.toArray()
return files.toUnique()
}
return null
}
/**
* 判断文件路径是否合理
* @param path 文件路径
* @return true合理否则不合理
*/
static def isFilePathValid(String path) {
return (path.endsWith('.kt') || path.endsWith('.java') || path.endsWith('.xml') || path.endsWith('.png')) && !path.contains('/test/') && !path.contains('/androidTest/') && !path.contains('/generated/')
}
/**
* 获取src目录下的所有文件只包含.java和.kt的文件
* @return 文件相对路径数组
*/
def getAllFiles() {
def fileCollection = project.files("src")
if (fileCollection == null) {
return null
}
def files = fileCollection.asFileTree.getFiles()
def iterator = files.iterator()
def allFiles = new ArrayList<String>(files.size())
while (iterator.hasNext()) {
File file = iterator.next()
def path = getProjectStartPath() + File.separator + project.relativePath(file.path)
if (path != null && isFilePathValid(path)) {
allFiles.add(path)
}
}
return allFiles.toArray(new Object[allFiles.size()])
}
/**
* 获取项目名称如gradleengine,framework/asmbase
* @return 项目名称
*/
def getProjectStartPath() {
def projectRelativePath = project.relativePath(project.path).replaceAll(':', '/')
return projectRelativePath.substring(1)
}
/**
* 存储提交文件
* @param commitFiles 提交文件
*/
def saveCommitFiles(Object[] commitFiles) {
//commitFiles 是对象
def lintBuildDir = new File(project.buildDir, "code_inspect")
if (!lintBuildDir.exists()) {
lintBuildDir.mkdirs()
}
def changedFile = new File(lintBuildDir, "commit_files.txt")
def fileOutputStream = new FileOutputStream(changedFile)
def rootProjectPath = project.rootProject.rootDir.path + File.separator
//存储绝对路径
for (int i = 0; i < commitFiles.length; i++) {
def commitFile = commitFiles[i].toString()
fileOutputStream.write((rootProjectPath + commitFile).getBytes("utf-8"))
if (i != commitFiles.length - 1)
fileOutputStream.write("\n".getBytes("utf-8"))
}
fileOutputStream.flush()
fileOutputStream.close()
logger.lifecycle("Save Commit Files In: ${changedFile.path} \n$commitFiles")
}
task runCodeInspectIncrement {
// group = "codeInspect"
// description = "存储增量文件"
// def commitJavaFiles = new ArrayList<String>()
// def commitKotlinFiles = new ArrayList<String>()
//
// def commitFiles = new Object[0]
// if (isIncrement) {
// commitFiles = getCommitFiles()
// } else {
// commitFiles = getAllFiles()
// }
// saveCommitFiles(commitFiles)
// if (commitFiles != null && commitFiles.length > 0) {
// def projectStartPath = getProjectStartPath()
// for (String s : commitFiles) {
// def commitFile = s.toString().trim()
// if (commitFile.endsWith('.kt')) {
// commitKotlinFiles.add(commitFile.substring(projectStartPath.length() + 1))
// } else if (commitFile.endsWith('.java')) {
// commitJavaFiles.add(commitFile.substring(projectStartPath.length() + 1))
// }
// }
// }
// if (!commitKotlinFiles.isEmpty()) {
// logger.lifecycle("${project.name} commitKotlinFiles:$commitKotlinFiles")
// }
// if (!commitJavaFiles.isEmpty()) {
// logger.lifecycle("${project.name} commitJavaFiles:$commitJavaFiles")
// }
// project.setProperty("commitKotlinFiles", commitKotlinFiles)
// project.setProperty("commitJavaFiles", commitJavaFiles)
// project.setProperty("commitAuthor", getCommitAuthor())
}

View File

@@ -9,6 +9,7 @@
<!--https://pmd.github.io/pmd-5.6.1/pmd-java/index.html-->
<exclude-pattern>.*.kt</exclude-pattern>
<exclude-pattern>.*/R.java</exclude-pattern>
<exclude-pattern>.*/gen/.*</exclude-pattern>
<exclude-pattern>.*Dagger*.*</exclude-pattern>
@@ -25,8 +26,6 @@
<!-- </properties>-->
<!-- </rule>-->
<!-- 应避免重新分配catch语句中捕获的异常变量 -->
<rule ref="category/java/bestpractices.xml/AvoidReassigningCatchVariables" />
<!-- StringBuffers/StringBuilders可能会大幅增长因此如果保存在寿命较长的对象中可能会成为内存泄漏的来源 -->
<rule ref="category/java/bestpractices.xml/AvoidStringBufferField" />
<!-- 在同一行中声明多个变量,会比较混乱 -->
@@ -44,9 +43,7 @@
</rule>
<!-- 检查未使用的局部变量 -->
<rule ref="category/java/bestpractices.xml/UnusedLocalVariable" />
<!-- 检查未使用的private变量 -->
<!-- <rule ref="category/java/bestpractices.xml/UnusedPrivateField" />-->
<rule ref="category/java/bestpractices.xml/UseStandardCharsets" />
<!-- <rule ref="category/java/bestpractices.xml/UseStandardCharsets" />-->
<!-- 容易出现运行时错误 -->
<rule ref="category/java/errorprone.xml/AvoidBranchingStatementAsLastInLoop" />

View File

@@ -0,0 +1,54 @@
apply plugin: 'io.gitlab.arturbosch.detekt'
def configPath = rootProject.file("codequality").path
detekt {
toolVersion = "1.15.0"
input = files(
"src/main/java",
"src/jinlvvan/java",
"src/driverm1/java"
)
parallel = false
//将配置文件应用于detekt的默认配置文件之上
buildUponDefaultConfig = false
//规则集
config.setFrom("${configPath}/detekt.yml")
//指定基准文件。在detekt的后续运行中所有发现都存储在此文件中
// baseline = file("${configPath}/baseline.xml")
disableDefaultRuleSets = false
ignoreFailures = true
// Android: Don't create tasks for the specified build types (e.g. "release")
// ignoredBuildTypes = ["release"]
// Android: Don't create tasks for the specified build flavor (e.g. "production")
// ignoredFlavors = ["production"]
// Android: Don't create tasks for the specified build variants (e.g. "productionRelease")
// ignoredVariants = ["productionRelease"]
}
tasks.detekt.jvmTarget = "1.8"
tasks.named("detekt").configure {
reports {
// Enable/Disable HTML report (default: true)
html {
enabled = true
// Path where HTML report will be stored (default: `build/reports/detekt/detekt.html`)
destination = new File(new File("${project.rootProject.buildDir.path}/reports/detekt"), "${project.name}-detekt.html")
}
xml {
enabled = true
destination = new File(new File("${project.rootProject.buildDir.path}/reports/detekt"), "${project.name}-detekt.xml")
}
txt {
enabled = false
// destination = new File(new File("${project.rootProject.buildDir.path}/reports/detekt"), "${project.name}-detekt.txt")
}
sarif {
// Enable/Disable SARIF report (default: false)
enabled = true
// Path where SARIF report will be stored (default: `build/reports/detekt/detekt.sarif`)
destination = new File(new File("${project.rootProject.buildDir.path}/reports/detekt"), "${project.name}-detekt.sarif")
}
}
}

803
codequality/detekt.yml Normal file
View File

@@ -0,0 +1,803 @@
build:
excludeCorrectable: false
config:
validation: true
warningsAsErrors: false
# checkExhaustiveness: false
# when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]'
excludes: 'custom-checks.*'
processors:
active: true
exclude:
- 'DetektProgressListener'
# - 'KtFileCountProcessor'
# - 'PackageCountProcessor'
# - 'ClassCountProcessor'
# - 'FunctionCountProcessor'
# - 'PropertyCountProcessor'
# - 'ProjectComplexityProcessor'
# - 'ProjectCognitiveComplexityProcessor'
# - 'ProjectLLOCProcessor'
# - 'ProjectCLOCProcessor'
# - 'ProjectLOCProcessor'
# - 'ProjectSLOCProcessor'
# - 'LicenseHeaderLoaderExtension'
console-reports:
active: true
exclude:
- 'ProjectStatisticsReport'
- 'ComplexityReport'
- 'NotificationReport'
- 'FindingsReport'
- 'FileBasedFindingsReport'
# - 'LiteFindingsReport'
output-reports:
active: true
exclude:
# - 'TxtOutputReport'
# - 'XmlOutputReport'
# - 'HtmlOutputReport'
# - 'MdOutputReport'
# - 'SarifOutputReport'
comments:
active: false
AbsentOrWrongFileLicense: #报告每个没有所需许可证标头的Kotlin源文件
active: false
licenseTemplateFile: 'license.template'
# licenseTemplateIsRegex: false
CommentOverPrivateFunction: #报告private函数的注释和文档
active: false
CommentOverPrivateProperty: #报告私有属性的注释和文档
active: false
# DeprecatedBlockTag: #报告注释中使用@deprecated块标记,可以使用@ReplaceWith annotations
# active: false
EndOfSentenceFormat: #验证KDoc注释的第一句话的结尾
active: false
endOfSentenceFormat: '([.?!][ \t\n\r\f<])|([.?!:]$)'
# KDocReferencesNonPublicProperty: #报告任何引用类的非公共属性的KDoc注释
# active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
# OutdatedDocumentation: #报告任何具有与声明签名不匹配的KDoc的类、函数或构造函数
# active: false
# matchTypeParameters: true
# matchDeclarationsOrder: true
# allowParamOnConstructorProperties: false
UndocumentedPublicClass: #报告没有所需文档的公共类、对象和接口
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
searchInNestedClass: true
searchInInnerClass: true
searchInInnerObject: true
searchInInnerInterface: true
# searchInProtectedClass: false
UndocumentedPublicFunction: #报告任何没有所需文档的公共方法
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
# searchProtectedFunction: false
UndocumentedPublicProperty: #报告任何没有所需文档的公共字段
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
# searchProtectedProperty: false
complexity:
active: true
# CognitiveComplexMethod: #报告复杂方法
# active: false
# allowedComplexity: 15
ComplexCondition: #报告复杂条件
active: false
# allowedConditions: 4
ComplexInterface: #包含太多函数和/或属性的复杂接口表明该接口一次处理太多事情。接口应该遵循单一责任原则,以鼓励该接口的实现不要同时处理太多事情
active: false
# allowedDefinitions: 10
includeStaticDeclarations: false
includePrivateDeclarations: false
# ignoreOverloaded: false
#该规则使用McCabe的循环复杂性MCC度量来测量函数源代码中线性独立路径的数量{https://www.ndepend.com/docs/code-metrics#CC}
# CyclomaticComplexMethod: #复杂的方法很难理解和阅读。复杂方法的副作用可能并不明显。更喜欢把复杂的方法分解成更小的方法,这样更容易理解。较小的方法也可以命名得更清晰,从而提高代码的可读性。
# active: true
# allowedComplexity: 14
# ignoreSingleWhenExpression: false
# ignoreSimpleWhenEntries: false
# ignoreNestingFunctions: false
# ignoreLocalFunctions: false
# nestingFunctions:
# - 'also'
# - 'apply'
# - 'forEach'
# - 'isNotNull'
# - 'ifNull'
# - 'let'
# - 'run'
# - 'use'
# - 'with'
LabeledExpression: #报告已标记的表达式
active: false
ignoredLabels: []
LargeClass: #报告大型类
active: true
# allowedLines: 600
LongMethod: #报告大方法
active: true
# allowedLines: 60
LongParameterList: #报告参数超过特定阈值的函数和构造函数。
active: true
# allowedFunctionParameters: 6
# allowedConstructorParameters: 15
ignoreDefaultParameters: false
ignoreDataClasses: true
# ignoreAnnotatedParameter: []
MethodOverloading: #报告经常重载的方法
active: false
# allowedOverloads: 6
NamedArguments: #报告参数超过某个阈值且全部未命名的函数调用。参数过多的调用更难理解,因此命名参数会有所帮助。
active: false
# allowedArguments: 3
# ignoreArgumentsMatchingNames: false
NestedBlockDepth: #报告函数中嵌套深度过大
active: true
# allowedDepth: 4
# NestedScopeFunctions: #避免嵌套作用域函数
# active: false
# allowedDepth: 1
# functions:
# - 'kotlin.apply'
# - 'kotlin.run'
# - 'kotlin.with'
# - 'kotlin.let'
# - 'kotlin.also'
ReplaceSafeCallChainWithRun: #不可为null的类型上的安全调用链是冗余的可以通过将冗余的安全调用封装在run块中来删除 {xxx?.run}
active: false
StringLiteralDuplication: #规则检测并报告重复的字符串文字
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
# allowedDuplications: 2
ignoreAnnotation: true
# allowedWithLengthLessThan: 5
ignoreStringsRegex: '$^'
TooManyFunctions: #此规则报告包含过多函数的文件、类、接口、对象和枚举。每个元素可以配置有不同的阈值。
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
# allowedFunctionsPerFile: 11
# allowedFunctionsPerClass: 11
# allowedFunctionsPerInterface: 11
# allowedFunctionsPerObject: 11
# allowedFunctionsPerEnum: 11
ignoreDeprecated: false
ignorePrivate: false
ignoreOverridden: false
#协程规则集分析代码中潜在的协程问题。
coroutines:
active: true
GlobalCoroutineUsage:
active: false
# InjectDispatcher: #始终使用依赖项注入来注入调度器,以便于测试
# active: true
# dispatcherNames:
# - 'IO'
# - 'Default'
# - 'Unconfined'
RedundantSuspendModifier: #suspend修饰符只能在需要的地方使用否则该函数只能从其他挂起函数中使用。这不必要地限制了函数的使用应该通过删除不需要的suspend修饰符来避免
active: true
# SleepInsteadOfDelay: #报告Thread.sleep在挂起函数和协同程序块中的使用情况。由于协程的轻量级性质一个线程可以同时包含多个协程因此如果一个协程调用thread.sleep它可能会停止执行不相关的协程并导致不可预测的行为。
# active: true
# SuspendFunSwallowedCancellation: #不应在runCatching的lambda块内部调用suspend函数
# active: false
# SuspendFunWithCoroutineScopeReceiver: #将CoroutineScope用作接收器的挂起函数不应标记为挂起。
# active: false
SuspendFunWithFlowReturnType: #从kotlin.coroutines.Flow返回Flow的函数不应标记为挂起简单地调用一个返回Flow的函数的行为不应该有任何副作用。只有当针对返回的Flow开始收集时才应该实际完成工作。
active: true
#空块规则集包含将报告应避免的空代码块的规则。
empty-blocks:
active: true
EmptyCatchBlock: #报告空的捕获块。空的catch块表示异常被忽略而未被处理
active: true
allowedExceptionNameRegex: '_|(ignore|expected).*'
EmptyClassBlock: #报告空类。空的代码块没有任何作用,应该删除
active: true
EmptyDefaultConstructor: #报告空的默认构造函数。空的代码块没有任何作用,应该删除
active: true
EmptyDoWhileBlock: #报告空的do/while循环。空的代码块没有任何作用应该删除
active: true
EmptyElseBlock: #报告为空的else块。空的代码块没有任何作用应该删除
active: true
EmptyFinallyBlock: #报告为空的finally块。空代码块没有任何作用应该删除
active: true
EmptyForBlock: #报告为空的for块。空代码块没有任何作用应该删除
active: true
EmptyFunctionBlock: #报告为空的方法块。空代码块没有任何作用,应该删除
active: true
ignoreOverridden: false
EmptyIfBlock: #报告为空的if块。空代码块没有任何作用应该删除
active: true
EmptyInitBlock: #报告为空的init块。空代码块没有任何作用应该删除
active: true
# EmptyKotlinFile: #报告为空的kotlin文件。空代码块没有任何作用应该删除
# active: true
EmptySecondaryConstructor: #报告为空的辅助构造函数。空代码块没有任何作用,应该删除
active: true
EmptyTryBlock: #报告为空的try块。空代码块没有任何作用应该删除
active: true
EmptyWhenBlock: #报告为空的when块。空代码块没有任何作用应该删除
active: true
EmptyWhileBlock: #报告为空的while块。空代码块没有任何作用应该删除
active: true
exceptions:
active: true
ExceptionRaisedInUnexpectedLocation: #此规则报告从不应引发异常的函数。如果存在引发异常的函数则会报告该函数。默认情况下此规则检查toString、hashCode、equals和finalize。此规则可通过methodNames配置进行配置
active: true
methodNames:
- 'equals'
- 'finalize'
- 'hashCode'
- 'toString'
InstanceOfCheckForException: #此规则报告通过is检查或强制转换检查异常类型的捕获块。代码应该使用多个catch块而不是捕获一般的异常类型然后检查特定的异常类型。然后这些捕获块应该捕获特定的异常
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
NotImplementedDeclaration: #此规则报告引发的所有NotImplementedError类型的异常。它还报告所有TODO..)函数。这表明功能仍在开发中,无法正常工作。这两种声明都只能作为临时声明,不应放入生产环境中
active: false
# ObjectExtendsThrowable: #避免抛出单例Throwable
# active: false
PrintStackTrace: #打印堆栈
active: true
RethrowCaughtException: #重新抛出异常
active: true
ReturnFromFinally: # finally return
active: true
ignoreLabeled: false
SwallowedException: #报告所有捕获异常且未正确传递(例如作为原因)到新引发异常的实例
active: true
ignoredExceptionTypes:
- 'InterruptedException'
- 'MalformedURLException'
- 'NumberFormatException'
- 'ParseException'
allowedExceptionNameRegex: '_|(ignore|expected).*'
ThrowingExceptionFromFinally: #报告从finally块抛出异常
active: true
ThrowingExceptionInMain: #报告在主方法中引发的所有异常。只有当异常可以由“更高”的函数处理时,才应该抛出异常
active: false
ThrowingExceptionsWithoutMessageOrCause: #报告在没有参数或进一步描述的情况下抛出的所有异常
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
exceptions:
- 'ArrayIndexOutOfBoundsException'
- 'Exception'
- 'IllegalArgumentException'
- 'IllegalMonitorStateException'
- 'IllegalStateException'
- 'IndexOutOfBoundsException'
- 'NullPointerException'
- 'RuntimeException'
- 'Throwable'
ThrowingNewInstanceOfSameException: #异常不应封装在同一异常类型中,然后重新抛出。更喜欢用更有意义的异常类型包装异常
active: true
TooGenericExceptionCaught: #规则为类型过于通用的异常报告捕获块。最好捕获当前处理的案例的特定异常,避免扩大区域
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
exceptionNames:
- 'ArrayIndexOutOfBoundsException'
- 'Error'
# - 'Exception'
- 'IllegalMonitorStateException'
- 'IndexOutOfBoundsException'
- 'NullPointerException'
- 'RuntimeException'
# - 'Throwable'
allowedExceptionNameRegex: '_|(ignore|expected).*'
TooGenericExceptionThrown: #规则报告类型过于通用的抛出异常。对于当前发生的情况,最好抛出特定的异常
active: true
exceptionNames:
- 'Error'
- 'Exception'
- 'RuntimeException'
- 'Throwable'
naming:
active: true
# BooleanPropertyNaming:
# active: false
# allowedPattern: '^(is|has|are)'
ClassNaming:
active: true
classPattern: '[A-Z][a-zA-Z0-9]*'
ConstructorParameterNaming:
active: true
parameterPattern: '[a-z][A-Za-z0-9]*'
privateParameterPattern: '[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
EnumNaming:
active: true
enumEntryPattern: '[A-Z][_a-zA-Z0-9]*'
ForbiddenClassName:
active: false
forbiddenName: []
# FunctionNameMaxLength:
# active: false
# maximumFunctionNameLength: 30
# FunctionNameMinLength:
# active: false
# minimumFunctionNameLength: 3
FunctionNaming:
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
functionPattern: '[a-z][a-zA-Z0-9]*'
excludeClassPattern: '$^'
FunctionParameterNaming:
active: true
parameterPattern: '[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
InvalidPackageDeclaration:
active: true
rootPackage: ''
# requireRootInDeclaration: false
# LambdaParameterNaming:
# active: false
# parameterPattern: '[a-z][A-Za-z0-9]*|_'
MatchingDeclarationName:
active: true
mustBeFirst: true
# multiplatformTargets:
# - 'ios'
# - 'android'
# - 'js'
# - 'jvm'
# - 'native'
# - 'iosArm64'
# - 'iosX64'
# - 'macosX64'
# - 'mingwX64'
# - 'linuxX64'
MemberNameEqualsClassName:
active: true
ignoreOverridden: true
# NoNameShadowing:
# active: true
NonBooleanPropertyPrefixedWithIs:
active: false
ObjectPropertyNaming:
active: true
constantPattern: '[A-Za-z][_A-Za-z0-9]*'
propertyPattern: '[A-Za-z][_A-Za-z0-9]*'
privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*'
PackageNaming:
active: true
packagePattern: '[a-z]+(\.[a-z][A-Za-z0-9]*)*'
TopLevelPropertyNaming:
active: true
constantPattern: '[A-Z][_A-Z0-9]*'
propertyPattern: '[A-Za-z][_A-Za-z0-9]*'
privatePropertyPattern: '_?[A-Za-z][_A-Za-z0-9]*'
VariableMaxLength:
active: false
maximumVariableNameLength: 64
VariableMinLength:
active: false
minimumVariableNameLength: 1
VariableNaming:
active: true
variablePattern: '[a-z][A-Za-z0-9]*'
privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*'
excludeClassPattern: '$^'
performance:
active: true
ArrayPrimitive: #使用ArrayPrimitive会导致隐含拳击和性能打击。更喜欢使用Kotlin专用的数组实例
active: true
# CouldBeSequence: #由于每个调用都会创建一个新的列表,因此长链的收集操作将带来性能损失。请考虑使用序列
# active: false
# allowedOperations: 2
ForEachOnRange: #在一个范围内使用forEach可能会产生巨大的性能成本。因此在大多数情况下应该使用简单的for循环 (for example: {(1..10).forEach})
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
SpreadOperator: #在大多数情况下,使用排列运算符会导致在调用方法之前创建数组的完整副本。这会带来非常高的性能损失
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
# UnnecessaryPartOfBinaryExpression: #仅在表达式仅使用以下运算符之一||或&&的情况下验证二进制表达式
# active: false
UnnecessaryTemporaryInstantiation: #将基元类型转换为字符串时,请避免使用临时对象。与直接使用基元类型相比,这会降低性能。若要解决此问题,请删除包装类型
active: true
#潜在错误规则集提供了检测潜在错误的规则。
potential-bugs:
active: true
# AvoidReferentialEquality: #检查平等
# active: true
# forbiddenTypePatterns:
# - 'kotlin.String'
# CastNullableToNonNullableType: #可空强转null
# active: false
# ignorePlatformTypes: true
# CastToNullableType: #将不安全的强制转换报告为可为null的类型。作为字符串未填充可能被误用为安全类型转换字符串
# active: false
# CharArrayToStringCall:
# active: false
Deprecation:
active: false
# DontDowncastCollectionTypes: #检查集合向下类型转换,建议方法转换({list as MutableList} convert : {list.toMutableList()})
# active: false
# DoubleMutabilityForCollection: #MutableState可变var,不可变建议val
# active: true
# mutableTypes:
# - 'kotlin.collections.MutableList'
# - 'kotlin.collections.MutableMap'
# - 'kotlin.collections.MutableSet'
# - 'java.util.ArrayList'
# - 'java.util.LinkedHashSet'
# - 'java.util.HashSet'
# - 'java.util.LinkedHashMap'
# - 'java.util.HashMap'
# ElseCaseInsteadOfExhaustiveWhen: #当表达式包含else大小写时即使它们有一组详尽的大小写该规则也会报告
# active: false
# ignoredSubjectTypes: []
EqualsAlwaysReturnsTrueOrFalse: #报告始终返回true或false的equals方法。
active: true
EqualsWithHashCodeExist: #当一个类重写equals方法时它也应该重写hashCode方法
active: true
# ExitOutsideMain: #报告主函数之外使用System.exit、Runtime.exit、Runtime.holt和Kotlin的exitProcess时的使用情况
# active: false
ExplicitGarbageCollectionCall: #报告所有显式触发垃圾回收器的调用。代码应该独立于垃圾收集器工作并且不应该要求在某些时间点触发GC。
active: true
HasPlatformType: #必须在公共API中显式声明平台类型以防止出现意外错误
active: true
#此规则对使用@CheckReturnValue或@CheckResult注释的函数返回值但未以任何方式使用该值的实例发出警告Kotlin编译器通常不会对这种情况发出警告所以这就是该规则背后的基本原理。
IgnoredReturnValue:
active: false
# restrictToConfig: true
returnValueAnnotations:
- 'CheckResult'
- '*.CheckResult'
- 'CheckReturnValue'
- '*.CheckReturnValue'
# ignoreReturnValueAnnotations:
# - 'CanIgnoreReturnValue'
# - '*.CanIgnoreReturnValue'
# returnValueTypes:
# - 'kotlin.sequences.Sequence'
# - 'kotlinx.coroutines.flow.*Flow'
# - 'java.util.stream.*Stream'
# ignoreFunctionCall: []
ImplicitDefaultLocale: #格式化字符串或执行大小写转换时,更喜欢显式传递[java.util.Locale],而不是使用隐式默认值
active: false
ImplicitUnitReturnType: #使用表达式语句的函数具有隐式返回类型
active: false
allowExplicitReturnType: true
InvalidRange: #报告为空的范围
active: true
IteratorHasNextCallsNextMethod: #验证Iterator接口的实现。Iterator实现的hasNext方法不应该有任何副作用
active: true
IteratorNotThrowingNoSuchElementException: #报告在next方法的实现中不抛出NoSuchElementException的Iterator接口的实现。当没有更多的元素要返回时迭代器应该抛出NoSuchElementException
active: true
LateinitUsage: #报告Late-init修饰符的用法。
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
ignoreOnClassesPattern: ''
MapGetWithNotNullAssertionOperator: #使用非null断言运算符报告对map访问方法map[]或map.get的调用。这可能会导致NullPointerException
active: true
# MissingPackageDeclaration: #当缺少包声明时报告
# active: false
# excludes: ['**/*.kts']
# NullCheckOnMutableProperty: #报告对可变属性的null检查因为这些属性的值可以在执行if语句后更改从而使null检查无效
# active: false
NullableToStringCall: #使用可能返回字符串“null”的可为null的接收器报告toString调用
active: false
# PropertyUsedBeforeDeclaration: #报告在声明之前使用的属性
# active: false
UnconditionalJumpStatementInLoop: #报告包含跳转语句的循环,这些语句在任何条件下都会跳转
active: false
# UnnecessaryNotNullCheck: #使用requireNotNull或checkNotNull报告用户可以删除的不必要的非null检查。
# active: false
UnnecessaryNotNullOperator: #报告用户可以删除的不必要的非null运算符用法!!
active: true
UnnecessarySafeCall: #报告用户可以删除的不必要的非null运算符用法?
active: true
# UnreachableCatchBlock: #报告无法访问的捕获块。如果在上面的块中已经捕获到异常,则捕获块可能无法访问(Exception or Throwable)catch顺序
# active: true
UnreachableCode: #报告无法访问的代码。代码可能无法访问因为它位于return、throw、continue或break表达式后面
active: true
UnsafeCallOnNullableType: #报告对可为null的类型的不安全调用
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
UnsafeCast: #报告不安全的强制转换
active: true
# UnusedUnaryOperator: #检测未使用的一元运算符
# active: true
UselessPostfixExpression: #报告未使用因而不必要的后缀表达式(++--
active: true
WrongEqualsTypeParameter: #报告接受错误类型参数的equals方法
active: true
#{link https://detekt.dev/docs/rules/style#explicititlambdaparameter}
style:
active: true
# AbstractClassCanBeConcreteClass:
# active: true
# AbstractClassCanBeInterface:
# active: true
# AlsoCouldBeApply:
# active: false
# BracesOnIfStatements:
# active: false
# singleLine: 'never'
# multiLine: 'always'
# BracesOnWhenStatements:
# active: false
# singleLine: 'necessary'
# multiLine: 'consistent'
# CanBeNonNullable:
# active: false
# CascadingCallWrapping:
# active: false
# includeElvis: true
ClassOrdering:
active: false
CollapsibleIfStatements:
active: false
DataClassContainsFunctions:
active: false
# conversionFunctionPrefix:
# - 'to'
# allowOperators: false
DataClassShouldBeImmutable:
active: false
# DestructuringDeclarationWithTooManyEntries:
# active: false
# maxDestructuringEntries: 3
# DoubleNegativeLambda:
# active: false
# negativeFunctions:
# - reason: 'Use `takeIf` instead.'
# value: 'takeUnless'
# - reason: 'Use `all` instead.'
# value: 'none'
# negativeFunctionNameParts:
# - 'not'
# - 'non'
EqualsNullCall:
active: true
EqualsOnSignatureLine:
active: false
ExplicitCollectionElementAccessMethod:
active: false
ExplicitItLambdaParameter:
active: true
ExpressionBodySyntax:
active: false
includeLineWrapping: false
# ForbiddenAnnotation:
# active: false
# annotations:
# - reason: 'it is a java annotation. Use `Suppress` instead.'
# value: 'java.lang.SuppressWarnings'
# - reason: 'it is a java annotation. Use `kotlin.Deprecated` instead.'
# value: 'java.lang.Deprecated'
# - reason: 'it is a java annotation. Use `kotlin.annotation.MustBeDocumented` instead.'
# value: 'java.lang.annotation.Documented'
# - reason: 'it is a java annotation. Use `kotlin.annotation.Target` instead.'
# value: 'java.lang.annotation.Target'
# - reason: 'it is a java annotation. Use `kotlin.annotation.Retention` instead.'
# value: 'java.lang.annotation.Retention'
# - reason: 'it is a java annotation. Use `kotlin.annotation.Repeatable` instead.'
# value: 'java.lang.annotation.Repeatable'
# - reason: 'Kotlin does not support @Inherited annotation, see https://youtrack.jetbrains.com/issue/KT-22265'
# value: 'java.lang.annotation.Inherited'
ForbiddenComment:
active: false
# comments:
# - reason: 'Forbidden FIXME todo marker in comment, please fix the problem.'
# value: 'FIXME:'
# - reason: 'Forbidden STOPSHIP todo marker in comment, please address the problem before shipping the code.'
# value: 'STOPSHIP:'
# - reason: 'Forbidden TODO todo marker in comment, please do the changes.'
# value: 'TODO:'
allowedPatterns: ''
ForbiddenImport:
active: false
imports: []
forbiddenPatterns: ''
ForbiddenMethodCall:
active: false
methods:
- reason: 'print does not allow you to configure the output stream. Use a logger instead.'
value: 'kotlin.io.print'
- reason: 'println does not allow you to configure the output stream. Use a logger instead.'
value: 'kotlin.io.println'
# ForbiddenSuppress:
# active: false
# rules: []
ForbiddenVoid:
active: true
ignoreOverridden: false
ignoreUsageInGenerics: false
FunctionOnlyReturningConstant:
active: true
ignoreOverridableFunction: true
# ignoreActualFunction: true
# excludedFunctions: []
LoopWithTooManyJumpStatements:
active: true
maxJumpCount: 1
MagicNumber:
active: true
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**', '**/*.kts']
ignoreNumbers:
- '-1'
- '0'
- '1'
- '2'
ignoreHashCodeFunction: true
ignorePropertyDeclaration: false
ignoreLocalVariableDeclaration: false
ignoreConstantDeclaration: true
ignoreCompanionObjectPropertyDeclaration: true
ignoreAnnotation: false
ignoreNamedArgument: true
ignoreEnums: false
ignoreRanges: false
# ignoreExtensionFunctions: true
MandatoryBracesLoops:
active: false
# MaxChainedCallsOnSameLine:
# active: false
# maxChainedCalls: 5
MaxLineLength:
active: true
maxLineLength: 120
excludePackageStatements: true
excludeImportStatements: true
excludeCommentStatements: false
# excludeRawStrings: true
# MayBeConstant:
# active: true
ModifierOrder:
active: true
# MultilineLambdaItParameter:
# active: false
# MultilineRawStringIndentation:
# active: false
# indentSize: 4
# trimmingMethods:
# - 'trimIndent'
# - 'trimMargin'
NestedClassesVisibility: #嵌套类从父类继承其可见性,通常用于实现嵌套在其中的类的本地功能。这些嵌套类的可见性不能高于其父类
active: true
NewLineAtEndOfFile:
active: true
NoTabs:
active: false
# NullableBooleanCheck:
# active: false
# ObjectLiteralToLambda: #除了实现单个方法之外什么都不做的匿名对象可以用作lambda。
# active: true
OptionalAbstractKeyword:
active: true
OptionalUnit:
active: false
PreferToOverPairSyntax:
active: false
ProtectedMemberInFinalClass:
active: true
# RangeUntilInsteadOfRangeTo:
# active: false
RedundantExplicitType:
active: false
RedundantHigherOrderMapUsage:
active: true
RedundantVisibilityModifierRule:
active: false
# ReturnCount: #在一个函数中有许多出口点可能会造成混乱,并影响代码的可读性。
# active: false
# max: 2
# excludedFunctions:
# - 'equals'
# excludeLabeled: false
# excludeReturnFromLambda: false
# excludeGuardClauses: false
SafeCast:
active: true
SerialVersionUIDInSerializableClass:
active: true
# SpacingAfterPackageDeclaration:
# active: false
# StringShouldBeRawString:
# active: false
# maxEscapedCharacterCount: 2
# ignoredCharacters: []
ThrowsCount: #限制函数中抛出语句的数量,函数应该有明确的throw语句
active: true
max: 2
# excludeGuardClauses: false
TrailingWhitespace:
active: false
# TrimMultilineRawString:
# active: false
# trimmingMethods:
# - 'trimIndent'
# - 'trimMargin'
UnderscoresInNumericLiterals:
active: false
# acceptableLength: 4
# allowNonStandardGrouping: false
UnnecessaryAnnotationUseSiteTarget:
active: false
UnnecessaryApply:
active: true
# UnnecessaryBackticks:
# active: false
# UnnecessaryBracesAroundTrailingLambda:
# active: false
# UnnecessaryFilter:
# active: true
UnnecessaryInheritance: #此规则报告不必要的超类型
active: true
# UnnecessaryInnerClass:
# active: false
UnnecessaryLet:
active: false
UnnecessaryParentheses:
active: false
# allowForUnclearPrecedence: false
# UnusedImport:
# active: false
# UnusedParameter:
# active: true
# allowedNames: 'ignored|expected'
UnusedPrivateClass:
active: true
UnusedPrivateMember:
active: true
allowedNames: ''
# UnusedPrivateProperty:
# active: true
# allowedNames: '_|ignored|expected|serialVersionUID'
# UseAnyOrNoneInsteadOfFind:
# active: true
UseArrayLiteralsInAnnotations:
active: true
UseCheckNotNull:
active: true
UseCheckOrError:
active: true
UseDataClass:
active: false
allowVars: false
UseEmptyCounterpart:
active: false
UseIfEmptyOrIfBlank:
active: false
UseIfInsteadOfWhen:
active: false
# ignoreWhenContainingVariableDeclaration: false
# UseIsNullOrEmpty:
# active: true
# UseLet:
# active: false
# UseOrEmpty:
# active: true
UseRequire:
active: true
UseRequireNotNull:
active: true
# UseSumOfInsteadOfFlatMapSize:
# active: false
UselessCallOnNotNull:
active: true
UtilityClassWithPublicConstructor:
active: true
VarCouldBeVal:
active: true
# ignoreLateinitVar: false
WildcardImport:
active: true
excludeImports:
- 'java.util.*'

View File

@@ -4,15 +4,15 @@ def pmdConfigPath = rootProject.file("codequality").path
task pmd(type:Pmd){
//忽略失败如果设置为true检测出bug会停止task
ignoreFailures = false
ignoreFailures = true
consoleOutput = true
//filter路径
ruleSetFiles = files("${pmdConfigPath}/custom-pmd-ruleset.xml") // todo 新增rules
ruleSetFiles = files("${pmdConfigPath}/custom-pmd-ruleset.xml") //新增rules
ruleSets = []
//检测资源路径
source 'src/main/java','src/jinlvvan/java','src/driverm1/java'
//排除项
exclude '**/gen/**'
exclude '**/gen/**,*.kt'
reports {
xml.getRequired().set(false)

View File

@@ -2,6 +2,12 @@ apply from: rootProject.file('gradle/ext.gradle')
ext {
time = ""
kotlin_version = "1.6.21"
//插件工具存放目录
codequality = new File(projectDir, 'codequality')
//静态代码检查开关
isCodeInspectEnable = true
dependencies = [
// androidx
androidxappcompat : "androidx.appcompat:appcompat:1.3.1",
@@ -224,14 +230,8 @@ ext {
block_detector : "com.mogo.eagle.core.block:runtime:10.0.21"
]
android = [
launcherApplicationId : "com.mogo.launcher",
independentApplicationId : "com.mogo.launcher.app",
fLauncherApplicationId : "com.mogo.launcher.f",
bydautoIndependentApplicationId: "com.mogo.launcher.app.bydauto",
fLauncherAmapApiValue : "ace34d685cc04836c03905e4d1536125",
bydautoIndependentApiValue : "b1e1d527b02a493913c50985827c943a",
commonLauncherAmapApiValue : "a36b9f7b086fa3951bb35338a5a06dd3",
commonIndependentAmapApiValue : "1c3fbc5f5e183619ffb1e7bc01e6751f",
compileSdkVersion : 33,
buildToolsVersion : "29.0.2",
minSdkVersion : 23,

View File

@@ -17,6 +17,7 @@ import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_AD
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_VEHICLE
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_CAR_CONFIG
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_CAR_LOC
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_PARALLEL
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_P_ACTIONS
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_P_OBJECTS
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_STATUS_QUERY_RESP
@@ -771,6 +772,12 @@ class MoGoAdasListenerImpl : OnAdasListener {
* @param sysTime 当前时间戳
* @param parallelTaskProcessNotice 数据
*/
@ChainLog(
linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT,
linkCode = CHAIN_SOURCE_ADAS,
nodeAliasCode = CHAIN_CODE_ADAS_PARALLEL,
paramIndexes = [0, 1, 2, 4]
)
override fun onParallelDrivingResp(
header: MessagePad.Header,
messageType: AiCloudTask.MessageType,

View File

@@ -19,6 +19,8 @@ import com.mogo.eagle.core.network.*
import com.mogo.eagle.core.network.utils.*
import com.mogo.eagle.core.utilcode.download.Config
import com.mogo.eagle.core.utilcode.kotlin.*
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.getMisChannelCode
import com.mogo.eagle.core.utilcode.mogo.logger.scene.*
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.*
@@ -66,6 +68,7 @@ class UpgradeAppNetWorkManager private constructor() {
"${ it.first } -> ${ it.second }"
}
}
itx["role"] = AppIdentityModeUtils.getMisChannelCode(FunctionBuildConfig.appIdentityMode)
})
}
Log.d(TAG, "getAppUpgradeInfo: -> records:" + records?.entries?.joinToString(",") { itx -> "key:${itx.key} -> value:[${itx.value.joinToString(",") { "${it.first},${it.second}" } }]"})

View File

@@ -93,16 +93,19 @@ class ParallelDriveView @JvmOverloads constructor(
reqParaDrive()
listener?.onReqClick()
}
APP_REQUESTING -> {
cancelParaDrive()
Log.d(TAG, "Click-请求已取消")
ToastUtils.showShort("请求已取消!")
checkAvailableAndUpdateUI()
}
AD_REQUESTING -> {
Log.d(TAG, "Click-自动驾驶正在请求平行驾驶")
ToastUtils.showShort("自动驾驶正在请求平行驾驶")
}
UNAVAILABLE -> {
Log.d(TAG, "Click-请P档驻车并松开油门刹车后请求")
ToastUtils.showShort("请P档驻车并松开油门刹车后请求")
@@ -118,41 +121,36 @@ class ParallelDriveView @JvmOverloads constructor(
override fun onAutopilotStatusResponse(state: Int) {
super.onAutopilotStatusResponse(state)
if (state != autopilotState) {
synchronized(this) {
when (state) {
7 -> {
if (this.autopilotState != 7) {
isAutoDriving = false
Log.d(TAG, "onAutopilotStatusResponse-7")
ThreadUtils.runOnUiThread({
updateUI(PARALLEL_DRIVING)
}, ThreadUtils.MODE.QUEUE)
}
}
when (state) {
7 -> {
isAutoDriving = false
Log.d(TAG, "onAutopilotStatusResponse-7")
ThreadUtils.runOnUiThread({
updateUI(PARALLEL_DRIVING)
}, ThreadUtils.MODE.QUEUE)
}
2 -> {
if (this.autopilotState != state) {
isAutoDriving = true
Log.d(TAG, "onAutopilotStatusResponse-2")
}
}
else -> {
if (this.autopilotState != state) {
isAutoDriving = false
Log.d(TAG, "onAutopilotStatusResponse-else")
if (this.autopilotState == 7) {
ThreadUtils.runOnUiThread({
checkAvailableAndUpdateUI()
}, ThreadUtils.MODE.QUEUE)
}
}
}
2 -> {
isAutoDriving = true
Log.d(TAG, "onAutopilotStatusResponse-2")
if (this.autopilotState == 7) {
ThreadUtils.runOnUiThread({
checkAvailableAndUpdateUI()
}, ThreadUtils.MODE.QUEUE)
}
}
else -> {
isAutoDriving = false
Log.d(TAG, "onAutopilotStatusResponse-else")
if (this.autopilotState == 7) {
ThreadUtils.runOnUiThread({
checkAvailableAndUpdateUI()
}, ThreadUtils.MODE.QUEUE)
}
this.autopilotState = state
}
}
this.autopilotState = state
}
override fun onParallelDrivingAbility(

View File

@@ -70,6 +70,7 @@ class ChainConstant {
const val CHAIN_CODE_ADAS_P_OBJECTS = "CHAIN_CODE_ADAS_P_OBJECTS"
const val CHAIN_CODE_ADAS_P_ACTIONS = "CHAIN_CODE_ADAS_P_ACTIONS"
const val CHAIN_CODE_ADAS_STATUS_QUERY_RESP = "CHAIN_CODE_ADAS_STATUS_QUERY_RESP"
const val CHAIN_CODE_ADAS_PARALLEL = "CHAIN_CODE_ADAS_PARALLEL"
const val CHAIN_CODE_RECORD_NATIVE_LEAK = "CHAIN_CODE_RECORD_NATIVE_LEAK"
const val CHAIN_CODE_RECORD_ANR = "CHAIN_CODE_RECORD_ANR"

View File

@@ -1,5 +1,6 @@
package com.mogo.eagle.core.widget.media.video
import android.annotation.SuppressLint
import android.content.Context
import android.os.Build
import android.util.AttributeSet
@@ -212,6 +213,7 @@ class NoticeSimpleVideoPlayer : StandardGSYVideoPlayer {
}
}
@SuppressLint("ObsoleteSdkInt")
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
if (!mIfCurrentIsFullscreen) {

View File

@@ -1,5 +1,6 @@
package com.mogo.commons.koom
import android.annotation.SuppressLint
import android.app.Application
import android.os.Build
import com.kwai.koom.base.CommonConfig
@@ -8,6 +9,7 @@ import com.kwai.koom.base.MonitorManager
object KoomInitTask : InitTask {
@SuppressLint("ObsoleteSdkInt")
override fun init(application: Application) {
val config = CommonConfig.Builder()
.setApplication(application) // Set application

View File

@@ -1,6 +1,6 @@
#Fri Sep 22 11:53:55 CST 2023
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

View File

@@ -1,85 +0,0 @@
//package com.autonavi.nge.dm;
//
//import android.os.IBinder;
//import com.autonavi.nge.guidance.RouteBook;
//import com.autonavi.nge.guidance.NaviInfo;
//import com.autonavi.nge.guidance.RouteImage;
//import com.autonavi.nge.guidance.LaneMask;
//import com.autonavi.nge.obj.Category;
//import com.autonavi.nge.obj.UpdateRegion;
//import com.autonavi.nge.trafficInfo.TMCID;
//import com.autonavi.nge.search.SPPoiItem;
//import com.autonavi.nge.search.SPCategories;
//import com.autonavi.nge.search.SPQuery;
//import com.autonavi.nge.search.SPSearchResult;
//import com.autonavi.nge.map.LonLat;
//import com.autonavi.nge.guidance.GuidanceStatListener;
//interface INavigationCore {
//// IBinder getHandler();
// void Routing_SetOrigin(float lon, float lat, int sessionid);
// void Routing_SetDest(float lon, float lat, int sessionid);
// void Routing_GetRoute(int sessionid);
// boolean Routing_GetStatus(int sessionid);
// void Routing_Reset(int sessionid);
// void Routing_ClearTour(int sessionid);
// void RoutingSetCostModel(int model, int sessionid);
// void RoutingSetAvoidHighway(boolean isAvoidHighway, int sessionid);
// void RoutingSetAvoidToll(boolean isAvoidToll, int sessionid);
//
// void Traffic_Update(in List<TMCID> ids, int evt);
// void Traffic_UpdateByTile(int tile, in int[] ids, in byte[] speeds);
// void RoutingSetUseTraffic(boolean useTraffic, int sessionid);
// int RoutingGetRouteNum(int sessionid);
// int RoutingGetLength(int route, int sessionid);
// int RoutingGetSTime(int route, int sessionid);
// int RoutingGetDTime(int route, int sessionid);
// void addwaypoint(float lon, float lat, int heading, int sessionid);
// void clearwaypoints(int sessionid);
//
// void Guidance_UpdatePosition(float lon, float lat, float speed, float heading);
// void Guidance_StartNavi(int type);
// void Guidance_StopNavi();
// void Guidance_SetSimSpeed(int speed);
// void Guidance_PauseSimNavi();
// void Guidance_ResumeSimNavi();
// RouteBook Guidance_RouteBook(int session,int start,int end);
// NaviInfo Guidance_NaviInfo();
// NaviInfo GetNaviInfo(in byte[] datas);
// String Guidance_TTS();
// RouteImage Guidance_Image(int imageUr,int imageBg,int imageArrow,int type);
// LaneMask Guidance_LaneMask();
// double Guidance_getRoadAngle();
//
// List<SPPoiItem> Search_getSearchResult(int productId, double lon, double lat, double radius, int kindfilter, int updateregionId, String keyWord, int pageIdx, int searchType);
// SPPoiItem getPoiItemByPoiId(int poiId);
// List<SPPoiItem> getPoiItemListByLonLat(int prodId, int urId, float lon, float lat, int pageCount, int pageIdx);
// List<SPPoiItem> queryPoiItemByCircle(float centerLon,float centerLat,float radius);
// List<SPPoiItem> queryPoiItemByRect(float topLeftLon,float topLeftLat,float bottomRightLon,float bottomRightLat);
// List<SPPoiItem> queryPoiItemByPolygon(in List<LonLat> latLonPoints);
// List getFTSDataByDA( int urid, String keyStr, int keytype, int maxResultCount);
// List<String> getInputResult(int productId, int updateregionId, String inputStr);
// List<String> getInputResultByDA();
// List<Category> getCatList(int urid);
// List<UpdateRegion> getURListByDA(int prodid);
// void play(String text,boolean forcePlay);
//
// int RoutingGetSearchedCnt(int route, int sessionid);
//
// int [] getMemoryInfo();
//
// void startServer();
//
// void stopServer();
//
// int getMDSVersion();
// String getDataVersion();
// String getCopyRight();
// String getCompilerVersion();
//
// void onGuidanceStatusChanged(int statCode, in byte[] datas);
//
// void setGuidanceStatListener(GuidanceStatListener listener);
//
// SPCategories getAllPoiCategories(int languageCode);
// List<SPSearchResult> getPoiItemList(in SPQuery query);
//}

View File

@@ -1025,7 +1025,7 @@ class MapController(private var context: Context?, private val mMapView: IMapVie
val data = polylineOptions.lonLats
var polyline: Polyline? = null
try {
if (data == null || data.size <= 1) {
if (data.size <= 1) {
throw RuntimeException("传入的坐标数必须大于1")
}
val strOptionsJson = JSON.toJSONString(polylineOptions)
@@ -1054,7 +1054,7 @@ class MapController(private var context: Context?, private val mMapView: IMapVie
val colorSize = colorValues?.size ?: 0
var polyline: Polyline? = null
try {
if (data == null || data.size <= 1) {
if (data.size <= 1) {
throw RuntimeException("传入的坐标数必须大于1")
}
if (polylineOptions.getIsGradient() && colorSize > data.size) {
@@ -1090,7 +1090,7 @@ class MapController(private var context: Context?, private val mMapView: IMapVie
val data = deadZoneOptions.getPosition()
var deadZone: DeadZone? = null
try {
if (data == null || data.size <= 1) {
if (data.size <= 1) {
throw RuntimeException("传入的坐标数必须大于1")
}
val strOptionsJson = JSON.toJSONString(deadZoneOptions)