Debug info: render the roomId in the room details screen when developer mode is enabled.

This commit is contained in:
Benoit Marty 2025-06-20 10:11:17 +02:00
parent 0dfec51889
commit 009601cf5b
6 changed files with 70 additions and 1 deletions

View file

@ -48,6 +48,7 @@ import io.element.android.libraries.matrix.ui.room.getDirectRoomMember
import io.element.android.libraries.matrix.ui.room.isDmAsState
import io.element.android.libraries.matrix.ui.room.isOwnUserAdmin
import io.element.android.libraries.matrix.ui.room.roomMemberIdentityStateChange
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.services.analytics.api.AnalyticsService
import io.element.android.services.analyticsproviders.api.trackers.captureInteraction
@ -70,6 +71,7 @@ class RoomDetailsPresenter @Inject constructor(
private val analyticsService: AnalyticsService,
private val isPinnedMessagesFeatureEnabled: IsPinnedMessagesFeatureEnabled,
private val clipboardHelper: ClipboardHelper,
private val appPreferencesStore: AppPreferencesStore,
) : Presenter<RoomDetailsState> {
@Composable
override fun present(): RoomDetailsState {
@ -136,6 +138,9 @@ class RoomDetailsPresenter @Inject constructor(
val canShowKnockRequests by remember {
derivedStateOf { isKnockRequestsEnabled && canHandleKnockRequests && joinRule == JoinRule.Knock }
}
val isDeveloperModeEnabled by remember {
appPreferencesStore.isDeveloperModeEnabledFlow()
}.collectAsState(initial = false)
val roomNotificationSettingsState by room.roomNotificationSettingsStateFlow.collectAsState()
@ -211,6 +216,7 @@ class RoomDetailsPresenter @Inject constructor(
hasMemberVerificationViolations = hasMemberVerificationViolations,
canReportRoom = canReportRoom,
isTombstoned = roomInfo.successorRoom != null,
showDebugInfo = isDeveloperModeEnabled,
eventSink = ::handleEvents,
)
}

View file

@ -50,6 +50,7 @@ data class RoomDetailsState(
val hasMemberVerificationViolations: Boolean,
val canReportRoom: Boolean,
val isTombstoned: Boolean,
val showDebugInfo: Boolean,
val eventSink: (RoomDetailsEvent) -> Unit
) {
val roomBadges = buildList {

View file

@ -33,7 +33,7 @@ open class RoomDetailsStateProvider : PreviewParameterProvider<RoomDetailsState>
override val values: Sequence<RoomDetailsState>
get() = sequenceOf(
aRoomDetailsState(displayAdminSettings = true),
aRoomDetailsState(roomTopic = RoomTopicState.Hidden),
aRoomDetailsState(roomTopic = RoomTopicState.Hidden, showDebugInfo = true),
aRoomDetailsState(roomTopic = RoomTopicState.CanAddTopic),
aRoomDetailsState(isEncrypted = false),
aRoomDetailsState(roomAlias = null),
@ -120,6 +120,7 @@ fun aRoomDetailsState(
hasMemberVerificationViolations: Boolean = false,
canReportRoom: Boolean = true,
isTombstoned: Boolean = false,
showDebugInfo: Boolean = false,
eventSink: (RoomDetailsEvent) -> Unit = {},
) = RoomDetailsState(
roomId = roomId,
@ -151,6 +152,7 @@ fun aRoomDetailsState(
hasMemberVerificationViolations = hasMemberVerificationViolations,
canReportRoom = canReportRoom,
isTombstoned = isTombstoned,
showDebugInfo = showDebugInfo,
eventSink = eventSink,
)

View file

@ -30,6 +30,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter
@ -42,6 +43,7 @@ import io.element.android.features.roomcall.api.hasPermissionToJoin
import io.element.android.features.userprofile.api.UserProfileVerificationState
import io.element.android.features.userprofile.shared.blockuser.BlockUserDialogs
import io.element.android.features.userprofile.shared.blockuser.BlockUserSection
import io.element.android.libraries.androidutils.system.copyToClipboard
import io.element.android.libraries.architecture.coverage.ExcludeFromCoverage
import io.element.android.libraries.designsystem.atomic.atoms.MatrixBadgeAtom
import io.element.android.libraries.designsystem.atomic.molecules.MatrixBadgeRowMolecule
@ -261,6 +263,12 @@ fun RoomDetailsView(
onReportRoomClick = onReportRoomClick,
onLeaveRoomClick = { state.eventSink(RoomDetailsEvent.LeaveRoom) }
)
if (state.showDebugInfo) {
DebugInfoSection(
roomId = state.roomId,
)
}
}
}
}
@ -701,6 +709,33 @@ private fun OtherActionsSection(
}
}
@Composable
private fun DebugInfoSection(roomId: RoomId) {
val context = LocalContext.current
PreferenceCategory(showTopDivider = true) {
ListItem(
headlineContent = {
Text("Internal room ID")
},
supportingContent = {
Text(
text = roomId.value,
style = ElementTheme.typography.fontBodySmRegular,
color = ElementTheme.colors.textSecondary,
)
},
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Code())),
trailingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Copy())),
onClick = {
context.copyToClipboard(
roomId.value,
context.getString(CommonStrings.common_copied_to_clipboard)
)
},
)
}
}
@PreviewWithLargeHeight
@Composable
internal fun RoomDetailsPreview(@PreviewParameter(RoomDetailsStateProvider::class) state: RoomDetailsState) =