WIP
This commit is contained in:
committed by
Benoit Marty
parent
ab4b11b9f0
commit
bf1462f9b1
+3
-2
@@ -30,7 +30,8 @@ tasks.register<Delete>("clean").configure {
|
||||
delete(rootProject.layout.buildDirectory)
|
||||
}
|
||||
|
||||
private val ktLintVersion = the<LibrariesForLibs>().versions.ktlint.get()
|
||||
private val catalog = the<LibrariesForLibs>()
|
||||
private val ktLintVersion = catalog.versions.ktlint.get()
|
||||
|
||||
allprojects {
|
||||
// Detekt
|
||||
@@ -46,7 +47,7 @@ allprojects {
|
||||
config.from(files("$rootDir/tools/detekt/detekt.yml"))
|
||||
}
|
||||
dependencies {
|
||||
detektPlugins("io.nlopez.compose.rules:detekt:0.5.8")
|
||||
detektPlugins(catalog.detekt.compose.rules)
|
||||
detektPlugins(project(":tests:detekt-rules"))
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -10,6 +10,7 @@ package io.element.android.features.home.impl.components
|
||||
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.RowScope
|
||||
import androidx.compose.foundation.layout.WindowInsets
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
@@ -160,7 +161,7 @@ fun HomeTopBar(
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun RoomListMenuItems(
|
||||
private fun RowScope.RoomListMenuItems(
|
||||
onToggleSearch: () -> Unit,
|
||||
onMenuActionClick: (RoomListMenuAction) -> Unit,
|
||||
canReportBug: Boolean,
|
||||
|
||||
+5
-4
@@ -48,6 +48,7 @@ import io.element.android.libraries.designsystem.theme.components.Text
|
||||
import io.element.android.libraries.matrix.api.spaces.SpaceServiceFilter
|
||||
import io.element.android.libraries.matrix.ui.model.getAvatarData
|
||||
import io.element.android.libraries.ui.strings.CommonStrings
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
@@ -93,7 +94,7 @@ fun SpaceFiltersView(
|
||||
SpaceFiltersBottomSheetContent(
|
||||
filters = state.visibleFilters,
|
||||
searchQuery = state.searchQuery,
|
||||
onFilterSelected = { filter ->
|
||||
onSelectFilter = { filter ->
|
||||
state.eventSink(SpaceFiltersEvent.Selecting.SelectFilter(filter))
|
||||
}
|
||||
)
|
||||
@@ -105,9 +106,9 @@ fun SpaceFiltersView(
|
||||
|
||||
@Composable
|
||||
private fun SpaceFiltersBottomSheetContent(
|
||||
filters: List<SpaceServiceFilter>,
|
||||
filters: ImmutableList<SpaceServiceFilter>,
|
||||
searchQuery: TextFieldState,
|
||||
onFilterSelected: (SpaceServiceFilter) -> Unit,
|
||||
onSelectFilter: (SpaceServiceFilter) -> Unit,
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
Column(
|
||||
@@ -133,7 +134,7 @@ private fun SpaceFiltersBottomSheetContent(
|
||||
items(filters) { filter ->
|
||||
SpaceFilterItem(
|
||||
filter = filter,
|
||||
onClick = { onFilterSelected(filter) }
|
||||
onClick = { onSelectFilter(filter) }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -147,7 +147,7 @@ private fun DoneButton(
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun Buttons(
|
||||
private fun ColumnScope.Buttons(
|
||||
onRetry: () -> Unit,
|
||||
onCancel: () -> Unit,
|
||||
) {
|
||||
|
||||
+2
-1
@@ -14,6 +14,7 @@ import io.element.android.compound.theme.ElementTheme
|
||||
import io.element.android.features.location.api.Location
|
||||
import io.element.android.libraries.designsystem.components.PinVariant
|
||||
import io.element.android.libraries.designsystem.components.rememberLocationPinBitmap
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
import kotlinx.serialization.json.JsonPrimitive
|
||||
import org.maplibre.compose.expressions.dsl.and
|
||||
import org.maplibre.compose.expressions.dsl.asString
|
||||
@@ -66,7 +67,7 @@ data class LocationMarkerData(
|
||||
*/
|
||||
@Composable
|
||||
fun LocationPinMarkers(
|
||||
markers: List<LocationMarkerData>,
|
||||
markers: ImmutableList<LocationMarkerData>,
|
||||
onMarkerClick: ((LocationMarkerData) -> Unit)? = null,
|
||||
onClusterClick: ((Position) -> Unit)? = null,
|
||||
) {
|
||||
|
||||
+3
-1
@@ -26,6 +26,7 @@ import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableIntStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberUpdatedState
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
@@ -180,6 +181,7 @@ private fun StartLiveLocationActionView(
|
||||
onActionSuccess: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val updatedOnActionSuccess by rememberUpdatedState(onActionSuccess)
|
||||
Box(modifier = modifier) {
|
||||
val asyncIndicatorState = rememberAsyncIndicatorState()
|
||||
AsyncIndicatorHost(state = asyncIndicatorState)
|
||||
@@ -202,7 +204,7 @@ private fun StartLiveLocationActionView(
|
||||
}
|
||||
}
|
||||
is AsyncAction.Success -> {
|
||||
LaunchedEffect(action) { onActionSuccess() }
|
||||
LaunchedEffect(action) { updatedOnActionSuccess() }
|
||||
}
|
||||
else -> Unit
|
||||
}
|
||||
|
||||
+2
-1
@@ -50,6 +50,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||
import io.element.android.libraries.designsystem.theme.components.Text
|
||||
import io.element.android.libraries.designsystem.theme.components.TopAppBar
|
||||
import io.element.android.libraries.ui.strings.CommonStrings
|
||||
import kotlinx.collections.immutable.toImmutableList
|
||||
import kotlinx.coroutines.launch
|
||||
import org.maplibre.compose.camera.CameraMoveReason
|
||||
import org.maplibre.compose.camera.CameraPosition
|
||||
@@ -172,7 +173,7 @@ fun ShowLocationView(
|
||||
trackUserLocation = state.isTrackMyLocation
|
||||
)
|
||||
val markers = remember(state.locationShares) {
|
||||
state.locationShares.map { it.toMarkerData() }
|
||||
state.locationShares.map { it.toMarkerData() }.toImmutableList()
|
||||
}
|
||||
LocationPinMarkers(markers)
|
||||
},
|
||||
|
||||
+1
-1
@@ -125,7 +125,7 @@ private fun Content(errorScreenType: QrCodeErrorScreenType) {
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun Buttons(
|
||||
private fun ColumnScope.Buttons(
|
||||
onRetry: () -> Unit,
|
||||
onCancel: () -> Unit,
|
||||
) {
|
||||
|
||||
+2
-1
@@ -17,6 +17,7 @@ import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.RowScope
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.WindowInsets
|
||||
import androidx.compose.foundation.layout.consumeWindowInsets
|
||||
@@ -412,7 +413,7 @@ fun MessagesView(
|
||||
}
|
||||
|
||||
@Composable
|
||||
internal fun MessagesMenuActions(
|
||||
internal fun RowScope.MessagesMenuActions(
|
||||
displayThreads: Boolean,
|
||||
roomCallState: RoomCallState,
|
||||
onJoinCallClick: (isAudioCall: Boolean) -> Unit,
|
||||
|
||||
+3
-1
@@ -28,6 +28,7 @@ import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.derivedStateOf
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberUpdatedState
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
@@ -157,6 +158,7 @@ private fun ScrollHelper(
|
||||
listState: LazyListState,
|
||||
onPaginate: () -> Unit,
|
||||
) {
|
||||
val updatedOnPaginate by rememberUpdatedState(onPaginate)
|
||||
val lastVisibleItemIndex by remember {
|
||||
derivedStateOf { listState.firstVisibleItemIndex + listState.layoutInfo.visibleItemsInfo.size - 1 }
|
||||
}
|
||||
@@ -168,7 +170,7 @@ private fun ScrollHelper(
|
||||
}
|
||||
LaunchedEffect(needsPagination, lastVisibleItemIndex) {
|
||||
if (needsPagination) {
|
||||
onPaginate()
|
||||
updatedOnPaginate()
|
||||
delay(400L)
|
||||
}
|
||||
}
|
||||
|
||||
+5
-2
@@ -9,7 +9,9 @@
|
||||
package io.element.android.features.messages.impl.timeline.model.event
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.produceState
|
||||
import androidx.compose.runtime.rememberUpdatedState
|
||||
import io.element.android.features.location.api.Location
|
||||
import io.element.android.libraries.designsystem.components.PinVariant
|
||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||
@@ -103,8 +105,9 @@ private fun rememberIsLiveLocationActive(
|
||||
mode: TimelineItemLocationContent.Mode.Live,
|
||||
currentTimeMillis: () -> Long,
|
||||
): Boolean {
|
||||
val updatedCurrentTimeMillis by rememberUpdatedState(currentTimeMillis)
|
||||
fun TimelineItemLocationContent.Mode.Live.isActive(): Boolean {
|
||||
return isActive && endTimestamp > currentTimeMillis()
|
||||
return isActive && endTimestamp > updatedCurrentTimeMillis()
|
||||
}
|
||||
return produceState(
|
||||
initialValue = mode.isActive(),
|
||||
@@ -112,7 +115,7 @@ private fun rememberIsLiveLocationActive(
|
||||
key2 = mode.isActive,
|
||||
) {
|
||||
if (mode.isActive) {
|
||||
val remainingMillis = mode.endTimestamp - currentTimeMillis()
|
||||
val remainingMillis = mode.endTimestamp - updatedCurrentTimeMillis()
|
||||
delay(remainingMillis)
|
||||
}
|
||||
value = false
|
||||
|
||||
+3
-1
@@ -19,6 +19,7 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableIntStateOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberUpdatedState
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
@@ -343,6 +344,7 @@ private fun LiveLocationUpdatesSection(
|
||||
onOpenAppPermissionsClick: () -> Unit,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val updatedOnValueSaved by rememberUpdatedState(onValueSaved)
|
||||
PreferenceCategory(
|
||||
modifier = modifier,
|
||||
showTopDivider = true,
|
||||
@@ -382,7 +384,7 @@ private fun LiveLocationUpdatesSection(
|
||||
value = sliderValue.toFloat(),
|
||||
onValueChange = { sliderValue = it.roundToInt() },
|
||||
onValueChangeFinish = {
|
||||
onValueSaved(sliderValue)
|
||||
updatedOnValueSaved(sliderValue)
|
||||
},
|
||||
valueRange = valueRange,
|
||||
colors = SliderDefaults.colors(
|
||||
|
||||
@@ -72,6 +72,7 @@ android_gradle_plugin = { module = "com.android.tools.build:gradle", version.ref
|
||||
compose_compiler_plugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" }
|
||||
# https://developer.android.com/studio/write/java8-support#library-desugaring-versions
|
||||
android_desugar = "com.android.tools:desugar_jdk_libs:2.1.5"
|
||||
detekt_compose_rules = "io.nlopez.compose.rules:detekt:0.4.28"
|
||||
kotlin_gradle_plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
|
||||
metro_gradle_plugin = { module = "dev.zacsweers.metro:gradle-plugin", version.ref = "metro" }
|
||||
kotlin_compiler = { module = "org.jetbrains.kotlin:kotlin-compiler", version.ref = "kotlin" }
|
||||
|
||||
+1
@@ -186,6 +186,7 @@ class SafeChildrenTransitionScope<T : Any, S>(
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalSharedTransitionApi::class)
|
||||
@Suppress("ContentSlotReused")
|
||||
@Composable
|
||||
inline fun <reified NavTarget : Any, State> ParentNode<NavTarget>.SafeChildren(
|
||||
navModel: NavModel<NavTarget, State>,
|
||||
|
||||
+5
-2
@@ -24,6 +24,8 @@ import androidx.compose.material3.SheetState
|
||||
import androidx.compose.material3.contentColorFor
|
||||
import androidx.compose.material3.rememberModalBottomSheetState
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.movableContentOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.Shape
|
||||
@@ -88,14 +90,15 @@ fun ModalBottomSheet(
|
||||
dragHandle = dragHandle,
|
||||
contentWindowInsets = contentWindowInsets,
|
||||
) {
|
||||
val movableContent = remember { movableContentOf { content() } }
|
||||
if (scrollable) {
|
||||
Column(
|
||||
modifier = Modifier.verticalScroll(rememberScrollState()),
|
||||
) {
|
||||
content()
|
||||
movableContent()
|
||||
}
|
||||
} else {
|
||||
content()
|
||||
movableContent()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
@@ -184,6 +184,7 @@ private fun PickButton(
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("ModifierClickableOrder")
|
||||
@Composable
|
||||
private fun BoxScope.OverlayEditButton(
|
||||
onClick: () -> Unit,
|
||||
|
||||
+1
-1
@@ -114,7 +114,7 @@ fun QrCodeCameraView(
|
||||
Box(modifier.clipToBounds()) {
|
||||
if (LocalInspectionMode.current) {
|
||||
Box(
|
||||
modifier = modifier
|
||||
modifier = Modifier
|
||||
.background(color = ElementTheme.colors.bgSubtlePrimary),
|
||||
contentAlignment = Alignment.Center,
|
||||
) {
|
||||
|
||||
+18
-1
@@ -150,7 +150,7 @@ exceptions:
|
||||
TooGenericExceptionCaught:
|
||||
active: false
|
||||
SwallowedException:
|
||||
active: true
|
||||
active: false
|
||||
ThrowingExceptionsWithoutMessageOrCause:
|
||||
active: true
|
||||
TooGenericExceptionThrown:
|
||||
@@ -224,12 +224,27 @@ comments:
|
||||
Compose:
|
||||
CompositionLocalAllowlist:
|
||||
active: true
|
||||
# You can optionally define a list of CompositionLocals that are allowed here
|
||||
allowedCompositionLocals:
|
||||
- LocalCompoundColors
|
||||
- LocalSnackbarDispatcher
|
||||
- LocalCameraPositionState
|
||||
- LocalMediaItemPresenterFactories
|
||||
- LocalTimelineItemPresenterFactories
|
||||
- LocalRoomMemberProfilesCache
|
||||
- LocalMentionSpanUpdater
|
||||
- LocalAnalyticsService
|
||||
- LocalBuildMeta
|
||||
- LocalUiTestMode
|
||||
- LocalSdkIntVersionProvider
|
||||
CompositionLocalNaming:
|
||||
active: true
|
||||
ContentEmitterReturningValues:
|
||||
active: true
|
||||
# You can optionally add your own composables here
|
||||
# contentEmitters: MyComposable,MyOtherComposable
|
||||
ModifierComposable:
|
||||
active: true
|
||||
ModifierMissing:
|
||||
active: true
|
||||
ModifierReused:
|
||||
@@ -252,6 +267,8 @@ Compose:
|
||||
active: true
|
||||
PreviewPublic:
|
||||
active: true
|
||||
# You can optionally disable that only previews with @PreviewParameter are flagged
|
||||
previewPublicOnlyIfParams: false
|
||||
RememberMissing:
|
||||
active: true
|
||||
UnstableCollections:
|
||||
|
||||
Reference in New Issue
Block a user