Merge pull request #5638 from element-hq/feature/bma/upgradeKtLint

Upgrade ktlint to 1.7.1 and ensure Renovate will upgrade the version
This commit is contained in:
Benoit Marty
2025-10-30 15:40:56 +01:00
committed by GitHub
15 changed files with 67 additions and 54 deletions

View File

@@ -26,7 +26,11 @@ ktlint_standard_annotation = disabled
ktlint_standard_parameter-list-wrapping = disabled
ktlint_standard_indent = disabled
ktlint_standard_blank-line-before-declaration = disabled
ktlint_function_naming_ignore_when_annotated_with=Composable
ktlint_function_naming_ignore_when_annotated_with = Composable
# Added when upgrading to 1.7.1
ktlint_standard_function-expression-body = disabled
ktlint_standard_chain-method-continuation = disabled
ktlint_standard_class-signature = disabled
[*.java]
ij_java_align_consecutive_assignments = false

View File

@@ -1,3 +1,5 @@
import org.gradle.accessors.dm.LibrariesForLibs
/*
* Copyright 2022-2024 New Vector Ltd.
*
@@ -27,6 +29,8 @@ tasks.register<Delete>("clean").configure {
delete(rootProject.layout.buildDirectory)
}
private val ktLintVersion = the<LibrariesForLibs>().versions.ktlint.get()
allprojects {
// Detekt
apply {
@@ -56,14 +60,12 @@ allprojects {
// See https://github.com/JLLeitschuh/ktlint-gradle#configuration
configure<org.jlleitschuh.gradle.ktlint.KtlintExtension> {
// See https://github.com/pinterest/ktlint/releases/
// TODO Regularly check for new version here ^
version.set("1.1.1")
android.set(true)
ignoreFailures.set(false)
enableExperimentalRules.set(true)
version = ktLintVersion
android = true
ignoreFailures = false
enableExperimentalRules = true
// display the corresponding rule
verbose.set(true)
verbose = true
reporters {
reporter(org.jlleitschuh.gradle.ktlint.reporter.ReporterType.PLAIN)
// To have XML report for Danger

View File

@@ -87,8 +87,10 @@ class HomeFlowNode(
analyticsService.screen(MobileScreen(screenName = MobileScreen.ScreenName.Home))
}
)
whenChildAttached { commonLifecycle: Lifecycle,
changeRoomMemberRolesNode: ChangeRoomMemberRolesEntryPoint.NodeProxy ->
whenChildAttached {
commonLifecycle: Lifecycle,
changeRoomMemberRolesNode: ChangeRoomMemberRolesEntryPoint.NodeProxy,
->
commonLifecycle.coroutineScope.launch {
changeRoomMemberRolesNode.waitForRoleChanged()
withContext(NonCancellable) {

View File

@@ -34,14 +34,14 @@ class DefaultDeclineInviteTest {
private val notificationCleaner =
FakeNotificationCleaner(clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda)
private val successLeaveRoomLambda = lambdaRecorder<Result<Unit>> { -> Result.success(Unit) }
private val successLeaveRoomLambda = lambdaRecorder<Result<Unit>> { Result.success(Unit) }
private val successIgnoreUserLambda =
lambdaRecorder<UserId, Result<Unit>> { _ -> Result.success(Unit) }
private val successReportRoomLambda =
lambdaRecorder<String?, Result<Unit>> { _ -> Result.success(Unit) }
private val failureLeaveRoomLambda =
lambdaRecorder<Result<Unit>> { -> Result.failure(Exception("Leave room error")) }
lambdaRecorder<Result<Unit>> { Result.failure(Exception("Leave room error")) }
private val failureIgnoreUserLambda =
lambdaRecorder<UserId, Result<Unit>> { _ -> Result.failure(Exception("Ignore user error")) }
private val failureReportRoomLambda =

View File

@@ -19,12 +19,12 @@ import org.junit.Test
class DefaultReportRoomTest {
private val roomId = A_ROOM_ID
private val successLeaveRoomLambda = lambdaRecorder<Result<Unit>> { -> Result.success(Unit) }
private val successLeaveRoomLambda = lambdaRecorder<Result<Unit>> { Result.success(Unit) }
private val successReportRoomLambda =
lambdaRecorder<String?, Result<Unit>> { _ -> Result.success(Unit) }
private val failureLeaveRoomLambda =
lambdaRecorder<Result<Unit>> { -> Result.failure(Exception("Leave room error")) }
lambdaRecorder<Result<Unit>> { Result.failure(Exception("Leave room error")) }
private val failureReportRoomLambda =
lambdaRecorder<String?, Result<Unit>> { _ -> Result.failure(Exception("Report room error")) }

View File

@@ -148,9 +148,11 @@ class RoomDetailsFlowNode(
override fun onBuilt() {
super.onBuilt()
whenChildrenAttached { commonLifecycle: Lifecycle,
roomDetailsNode: RoomDetailsNode,
changeRoomMemberRolesNode: ChangeRoomMemberRolesEntryPoint.NodeProxy ->
whenChildrenAttached {
commonLifecycle: Lifecycle,
roomDetailsNode: RoomDetailsNode,
changeRoomMemberRolesNode: ChangeRoomMemberRolesEntryPoint.NodeProxy,
->
commonLifecycle.coroutineScope.launch {
changeRoomMemberRolesNode.waitForRoleChanged()
withContext(NonCancellable) {

View File

@@ -105,9 +105,7 @@ class RoomDirectoryPresenterTest {
@Test
fun `present - emit load more event`() = runTest {
val loadMoreLambda = lambdaRecorder { ->
Result.success(Unit)
}
val loadMoreLambda = lambdaRecorder<Result<Unit>> { Result.success(Unit) }
val roomDirectoryList = FakeRoomDirectoryList(loadMoreLambda = loadMoreLambda)
val roomDirectoryService = FakeRoomDirectoryService { roomDirectoryList }
val presenter = createRoomDirectoryPresenter(roomDirectoryService = roomDirectoryService)

View File

@@ -40,7 +40,6 @@ datetime = "0.7.1"
serialization_json = "1.9.0"
#other
detekt = "1.23.8"
coil = "3.3.0"
showkase = "1.0.5"
appyx = "1.7.1"
@@ -59,6 +58,9 @@ metro = "0.7.2"
autoservice = "1.1.1"
# quality
detekt = "1.23.8"
# See https://github.com/pinterest/ktlint/releases/
ktlint = "1.7.1"
androidx-test-ext-junit = "1.3.0"
kover = "0.9.1"
@@ -148,6 +150,10 @@ network_retrofit_bom = "com.squareup.retrofit2:retrofit-bom:3.0.0"
network_retrofit = { module = "com.squareup.retrofit2:retrofit" }
network_retrofit_converter_serialization = { module = "com.squareup.retrofit2:converter-kotlinx-serialization" }
# Quality
# Reference ktlint-cli so that Renovate can check if a new version is available.
ktlint-cli = { module = "com.pinterest.ktlint:ktlint-cli", version.ref = "ktlint" }
# Test
test_core = { module = "androidx.test:core", version.ref = "test_core" }
test_corektx = { module = "androidx.test:core-ktx", version.ref = "test_core" }

View File

@@ -75,22 +75,21 @@ class AsyncDataKtTest {
private class TestableMutableState<T>(
value: T
) : MutableState<T> {
@Suppress("ktlint:standard:property-naming")
private val _deque = ArrayDeque<T>(listOf(value))
private val deque = ArrayDeque(listOf(value))
override var value: T
get() = _deque.last()
get() = deque.last()
set(value) {
_deque.addLast(value)
deque.addLast(value)
}
/**
* Returns the states that were set in the order they were set.
*/
fun popFirst(): T = _deque.removeFirst()
fun popFirst(): T = deque.removeFirst()
fun assertNoMoreValues() {
assertThat(_deque).isEmpty()
assertThat(deque).isEmpty()
}
override operator fun component1(): T = value

View File

@@ -14,6 +14,7 @@ import kotlinx.collections.immutable.toPersistentList
object WaveFormSamples {
val allRangeWaveForm = List(100) { it.toFloat() / 100 }.toImmutableList()
@Suppress("ktlint:standard:argument-list-wrapping")
val realisticWaveForm = persistentListOf(
0.000f, 0.000f, 0.000f, 0.003f, 0.354f,
0.353f, 0.365f, 0.790f, 0.787f, 0.167f,

View File

@@ -71,10 +71,7 @@ public fun MapLibreMap(
uiSettings: MapUiSettings = DefaultMapUiSettings,
symbolManagerSettings: MapSymbolManagerSettings = DefaultMapSymbolManagerSettings,
locationSettings: MapLocationSettings = DefaultMapLocationSettings,
content: (
@Composable @MapLibreMapComposable
() -> Unit
)? = null,
content: (@Composable @MapLibreMapComposable () -> Unit)? = null,
) {
// When in preview, early return a Box with the received modifier preserving layout
if (LocalInspectionMode.current) {

View File

@@ -207,10 +207,12 @@ class RustTimeline(
backwardPaginationStatus,
forwardPaginationStatus,
joinedRoom.roomInfoFlow.map { it.creators to it.isDm }.distinctUntilChanged(),
) { timelineItems,
) {
timelineItems,
backwardPaginationStatus,
forwardPaginationStatus,
(roomCreators, isDm) ->
(roomCreators, isDm),
->
withContext(dispatcher) {
timelineItems
.let { items ->

View File

@@ -34,7 +34,7 @@ class FakeNotificationCreator(
var createFallbackNotificationResult: LambdaOneParamRecorder<FallbackNotifiableEvent, Notification> = lambdaRecorder { _ -> A_NOTIFICATION },
var createSummaryListNotificationResult: LambdaFourParamsRecorder<MatrixUser, String, Boolean, Long, Notification> =
lambdaRecorder { _, _, _, _ -> A_NOTIFICATION },
var createDiagnosticNotificationResult: LambdaNoParamRecorder<Notification> = lambdaRecorder { -> A_NOTIFICATION },
var createDiagnosticNotificationResult: LambdaNoParamRecorder<Notification> = lambdaRecorder<Notification> { A_NOTIFICATION },
) : NotificationCreator {
override suspend fun createMessagesListNotification(
roomInfo: RoomEventGroupInfo,

View File

@@ -19,13 +19,3 @@ dependencies {
implementation(libs.test.core)
implementation(libs.test.turbine)
}
ktlint {
filter {
exclude { element ->
val path = element.file.path
// Exclude this file, that ktlint cannot parse.
path.contains("libraries/troubleshoot/test/src/main/kotlin/io/element/android/libraries/troubleshoot/test/Utils.kt")
}
}
}

View File

@@ -114,7 +114,8 @@ class DefaultVoiceMessagePlayerTest {
assertThat(player1.prepare().isSuccess).isTrue()
matchReadyState(1_000L)
player1.play()
awaitItem().let { // it plays until the end.
awaitItem().let {
// it plays until the end.
assertThat(it.isReady).isFalse()
assertThat(it.isPlaying).isFalse()
assertThat(it.isEnded).isTrue()
@@ -127,14 +128,16 @@ class DefaultVoiceMessagePlayerTest {
player2.state.test {
matchInitialState()
assertThat(player2.prepare().isSuccess).isTrue()
awaitItem().let { // Additional spurious state due to MediaPlayer owner change.
awaitItem().let {
// Additional spurious state due to MediaPlayer owner change.
assertThat(it.isReady).isFalse()
assertThat(it.isPlaying).isFalse()
assertThat(it.isEnded).isTrue()
assertThat(it.currentPosition).isEqualTo(1000)
assertThat(it.duration).isEqualTo(1000)
}
awaitItem().let { // Additional spurious state due to MediaPlayer owner change.
awaitItem().let {
// Additional spurious state due to MediaPlayer owner change.
assertThat(it.isReady).isFalse()
assertThat(it.isPlaying).isFalse()
assertThat(it.isEnded).isFalse()
@@ -143,7 +146,8 @@ class DefaultVoiceMessagePlayerTest {
}
matchReadyState(1_000L)
player2.play()
awaitItem().let { // it plays until the end.
awaitItem().let {
// it plays until the end.
assertThat(it.isReady).isFalse()
assertThat(it.isPlaying).isFalse()
assertThat(it.isEnded).isTrue()
@@ -154,7 +158,8 @@ class DefaultVoiceMessagePlayerTest {
// Play player1 again.
player1.state.test {
awaitItem().let { // Last previous state/
awaitItem().let {
// Last previous state/
assertThat(it.isReady).isFalse()
assertThat(it.isPlaying).isFalse()
assertThat(it.isEnded).isTrue()
@@ -162,7 +167,8 @@ class DefaultVoiceMessagePlayerTest {
assertThat(it.duration).isEqualTo(1000)
}
assertThat(player1.prepare().isSuccess).isTrue()
awaitItem().let { // Additional spurious state due to MediaPlayer owner change.
awaitItem().let {
// Additional spurious state due to MediaPlayer owner change.
assertThat(it.isReady).isFalse()
assertThat(it.isPlaying).isFalse()
assertThat(it.isEnded).isFalse()
@@ -171,7 +177,8 @@ class DefaultVoiceMessagePlayerTest {
}
matchReadyState(1_000L)
player1.play()
awaitItem().let { // it played again until the end.
awaitItem().let {
// it played again until the end.
assertThat(it.isReady).isFalse()
assertThat(it.isPlaying).isFalse()
assertThat(it.isEnded).isTrue()
@@ -189,7 +196,8 @@ class DefaultVoiceMessagePlayerTest {
assertThat(player.prepare().isSuccess).isTrue()
matchReadyState()
player.play()
skipItems(1) // skip play state
// skip play state
skipItems(1)
player.pause()
awaitItem().let {
assertThat(it.isPlaying).isFalse()
@@ -206,9 +214,11 @@ class DefaultVoiceMessagePlayerTest {
assertThat(player.prepare().isSuccess).isTrue()
matchReadyState()
player.play()
skipItems(1) // skip play state
// skip play state
skipItems(1)
player.pause()
skipItems(1) // skip pause state
// skip pause state
skipItems(1)
player.play()
awaitItem().let {
assertThat(it.isPlaying).isTrue()