From 226428e0baa17abc49db4a821db69f4a3285b749 Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Sun, 29 May 2022 13:18:14 +0200 Subject: [PATCH] Developer quick setting to show hidden events https://github.com/SchildiChat/SchildiChat-android/issues/117 Change-Id: I4d7a015f5634f555dca7dcef54653b038ce96e5d --- .../home/room/detail/TimelineFragment.kt | 76 ++++++++++++------- .../home/room/detail/TimelineViewModel.kt | 1 + .../timeline/TimelineEventController.kt | 2 +- .../features/settings/VectorPreferences.kt | 7 ++ vector/src/main/res/menu/menu_timeline.xml | 8 ++ vector/src/main/res/values/strings_sc.xml | 2 + 6 files changed, 68 insertions(+), 28 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt index 1ea6493c8a..79c78c8e48 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt @@ -1028,6 +1028,15 @@ class TimelineFragment @Inject constructor( } } + private fun reloadTimeline(rebuildTimeline: Boolean = false, invalidateEpoxy: Boolean = true) { + if (rebuildTimeline) { + timelineViewModel.timeline.restartWithEventId(latestCurrentlyVisibleItem()?.eventId ?: timelineViewModel.timeline.getTargetEventId()) + } + if (invalidateEpoxy) { + timelineEventController.invalidateFullTimeline() + } + } + private fun setupJumpToReadMarkerView() { views.jumpToReadMarkerView.debouncedClicks { onJumpToReadMarkerClicked() @@ -1165,6 +1174,9 @@ class TimelineFragment @Inject constructor( else -> R.id.dev_bubble_style_both } menu.findItem(selectedBubbleStyle).isChecked = true + + // Hidden events + menu.findItem(R.id.dev_hidden_events).isChecked = vectorPreferences.shouldShowHiddenEvents() } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -1213,6 +1225,13 @@ class TimelineFragment @Inject constructor( handleSetBubbleStyle(BubbleThemeUtils.BUBBLE_STYLE_ELEMENT) true } + R.id.dev_hidden_events -> { + val shouldShow = !item.isChecked + vectorPreferences.setShouldShowHiddenEvents(shouldShow) + item.isChecked = shouldShow + reloadTimeline() + true + } R.id.menu_timeline_thread_list -> { navigateToThreadList() true @@ -2339,37 +2358,40 @@ class TimelineFragment @Inject constructor( } override fun onReadMarkerVisible() { - var mostRecentDisplayedEvent: TimelineEvent? = timelineViewModel.mostRecentDisplayedEvent() - val lm = views.timelineRecyclerView.layoutManager as? LinearLayoutManager - val room = session.roomService().getRoom(timelineArgs.roomId) - rmDimber.i { "Most recent check: ${mostRecentDisplayedEvent == null} ${lm?.findFirstVisibleItemPosition()}..${lm?.findLastVisibleItemPosition()}" } - if (mostRecentDisplayedEvent == null && lm != null && room != null) { - for (i in lm.findFirstVisibleItemPosition()..lm.findLastVisibleItemPosition()) { - val model = timelineEventController.adapter.getModelAtPosition(i) - rmDimber.i { "Most recent check: ${model.javaClass} / ${(model as? ItemWithEvents)?.isVisible()}" } - if (model is ItemWithEvents) { - if (!model.isVisible()) { - continue - } - rmDimber.i { "Most recent displayed model: ${model.getEventIds().firstOrNull()} - ${model.getEventIds().lastOrNull()}" } - model.getEventIds().reversed().forEach { eventId -> - if (mostRecentDisplayedEvent != null) { - return@forEach - } - val event = room.getTimelineEvent(eventId) - if (event != null) { - rmDimber.i { "Most recent displayed event: $eventId" } - mostRecentDisplayedEvent = event - return@forEach - } - } + val mostRecentDisplayedEvent: TimelineEvent? = timelineViewModel.mostRecentDisplayedEvent() ?: latestCurrentlyVisibleItem(rmDimber) + timelineViewModel.handle(RoomDetailAction.EnterTrackingUnreadMessagesState(mostRecentDisplayedEvent)) + } + + private fun latestCurrentlyVisibleItem(dimber: Dimber? = null): TimelineEvent? { + var mostRecentDisplayedEvent: TimelineEvent? = null + val lm = views.timelineRecyclerView.layoutManager as? LinearLayoutManager ?: return null + val room = session.roomService().getRoom(timelineArgs.roomId) ?: return null + dimber?.i { "Most recent check: ${mostRecentDisplayedEvent == null} ${lm.findFirstVisibleItemPosition()}..${lm.findLastVisibleItemPosition()}" } + for (i in lm.findFirstVisibleItemPosition()..lm.findLastVisibleItemPosition()) { + val model = timelineEventController.adapter.getModelAtPosition(i) + dimber?.i { "Most recent check: ${model.javaClass} / ${(model as? ItemWithEvents)?.isVisible()}" } + if (model is ItemWithEvents) { + if (!model.isVisible()) { + continue } - if (mostRecentDisplayedEvent != null) { - break + dimber?.i { "Most recent displayed model: ${model.getEventIds().firstOrNull()} - ${model.getEventIds().lastOrNull()}" } + model.getEventIds().reversed().forEach { eventId -> + if (mostRecentDisplayedEvent != null) { + return@forEach + } + val event = room.getTimelineEvent(eventId) + if (event != null) { + dimber?.i { "Most recent displayed event: $eventId" } + mostRecentDisplayedEvent = event + return@forEach + } } } + if (mostRecentDisplayedEvent != null) { + break + } } - timelineViewModel.handle(RoomDetailAction.EnterTrackingUnreadMessagesState(mostRecentDisplayedEvent)) + return mostRecentDisplayedEvent } override fun onPreviewUrlClicked(url: String) { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt index 1f50bdb024..bc11cca2d2 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt @@ -784,6 +784,7 @@ class TimelineViewModel @AssistedInject constructor( R.id.show_room_info -> true // SC R.id.show_participants -> true // SC R.id.dev_bubble_style, // SC + R.id.dev_hidden_events, // SC R.id.dev_tools -> vectorPreferences.developerMode() else -> false } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt index 2815a2a6d5..6f24eb1b50 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt @@ -377,7 +377,7 @@ class TimelineEventController @Inject constructor( submitSnapshot(snapshot) } - private fun invalidateFullTimeline() { + fun invalidateFullTimeline() { backgroundHandler.post { inSubmitList = true // Invalidate all timeline events to rebuild the whole Room/DM layout diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index 8e7a7fcd34..84fb33a96d 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -15,6 +15,7 @@ */ package im.vector.app.features.settings +import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences import android.media.RingtoneManager @@ -372,6 +373,12 @@ class VectorPreferences @Inject constructor( return developerMode() && defaultPrefs.getBoolean(SETTINGS_LABS_SHOW_HIDDEN_EVENTS_PREFERENCE_KEY, false) } + @SuppressLint("ApplySharedPref") + fun setShouldShowHiddenEvents(shouldShow: Boolean) { + // Commit, so we can be sure on timeline reload we will get the new value + defaultPrefs.edit().putBoolean(SETTINGS_LABS_SHOW_HIDDEN_EVENTS_PREFERENCE_KEY, shouldShow).commit() + } + fun swipeToReplyIsEnabled(): Boolean { return defaultPrefs.getBoolean(SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY, true) } diff --git a/vector/src/main/res/menu/menu_timeline.xml b/vector/src/main/res/menu/menu_timeline.xml index caf911df97..72df69f063 100644 --- a/vector/src/main/res/menu/menu_timeline.xml +++ b/vector/src/main/res/menu/menu_timeline.xml @@ -110,6 +110,14 @@ + + React with \"%1$s\" Free-form reaction + Hidden events +