From 2526bb168dda4d673611e9800381ba7c0ec0afc0 Mon Sep 17 00:00:00 2001 From: SpiritCroc <dev@spiritcroc.de> Date: Sat, 3 Dec 2022 15:13:40 +0100 Subject: [PATCH] Add composer-related developer quick settings Change-Id: I3d8bd7b38b8ac84f77d84998433d40894b28ea3d --- .../spiritcroc/menu/ArrayOptionsMenuHelper.kt | 7 ++- .../home/room/detail/TimelineFragment.kt | 57 +++++++++++-------- .../home/room/detail/TimelineViewModel.kt | 1 + .../composer/MessageComposerFragment.kt | 16 ++++-- .../features/settings/VectorPreferences.kt | 7 ++- vector/src/main/res/menu/menu_timeline.xml | 21 +++++++ 6 files changed, 76 insertions(+), 33 deletions(-) diff --git a/vector/src/main/java/de/spiritcroc/menu/ArrayOptionsMenuHelper.kt b/vector/src/main/java/de/spiritcroc/menu/ArrayOptionsMenuHelper.kt index 4fed3710fd..3a773eb706 100644 --- a/vector/src/main/java/de/spiritcroc/menu/ArrayOptionsMenuHelper.kt +++ b/vector/src/main/java/de/spiritcroc/menu/ArrayOptionsMenuHelper.kt @@ -61,9 +61,12 @@ object ArrayOptionsMenuHelper { } } -fun MenuItem.toggleExec(withNewVal: (Boolean) -> Boolean) { +fun MenuItem.toggleExec(withNewVal: (Boolean) -> Boolean): Boolean { val shouldCheck = !isChecked - if (withNewVal(shouldCheck)) { + return if (withNewVal(shouldCheck)) { isChecked = shouldCheck + true + } else { + false } } 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 a6325916de..62c8e55ba9 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 @@ -48,6 +48,7 @@ import androidx.core.view.forEach import androidx.core.view.isGone import androidx.core.view.isInvisible import androidx.core.view.isVisible +import androidx.core.view.postDelayed import androidx.core.view.updatePadding import androidx.fragment.app.setFragmentResultListener import androidx.lifecycle.lifecycleScope @@ -920,6 +921,11 @@ class TimelineFragment : menu.findItem(R.id.dev_display_name_changes).isChecked = vectorPreferences.showAvatarDisplayNameChangeMessages() menu.findItem(R.id.dev_redacted).isChecked = vectorPreferences.showRedactedMessages() + // Composer features + menu.findItem(R.id.dev_composer_voice_message_button).isChecked = vectorPreferences.useVoiceMessage() + menu.findItem(R.id.dev_composer_emoji_button).isChecked = vectorPreferences.showEmojiKeyboard() + menu.findItem(R.id.dev_composer_rich).isChecked = vectorPreferences.isRichTextEditorEnabled() + // Bubble style ArrayOptionsMenuHelper.createSubmenu( resources, @@ -1015,36 +1021,39 @@ class TimelineFragment : timelineViewModel.handle(RoomDetailAction.MarkAllAsRead(forceIfOpenedAnonymously = true)) true } - R.id.dev_hidden_events -> { - item.toggleExec { shouldShow -> - vectorPreferences.setShouldShowHiddenEvents(shouldShow) - reloadTimeline() - true - } + R.id.dev_hidden_events -> item.toggleExec { shouldShow -> + vectorPreferences.setShouldShowHiddenEvents(shouldShow) + reloadTimeline() true } - R.id.dev_membership_changes -> { - item.toggleExec { shouldShow -> - vectorPreferences.setShowJoinLeaveMessages(shouldShow) - reloadTimeline() - true - } + R.id.dev_membership_changes -> item.toggleExec { shouldShow -> + vectorPreferences.setShowJoinLeaveMessages(shouldShow) + reloadTimeline() true } - R.id.dev_display_name_changes -> { - item.toggleExec { shouldShow -> - vectorPreferences.setShowAvatarDisplayNameChangeMessages(shouldShow) - reloadTimeline() - true - } + R.id.dev_display_name_changes -> item.toggleExec { shouldShow -> + vectorPreferences.setShowAvatarDisplayNameChangeMessages(shouldShow) + reloadTimeline() true } - R.id.dev_redacted -> { - item.toggleExec { shouldShow -> - vectorPreferences.setShowRedactedMessages(shouldShow) - reloadTimeline() - true - } + R.id.dev_redacted -> item.toggleExec { shouldShow -> + vectorPreferences.setShowRedactedMessages(shouldShow) + reloadTimeline() + true + } + R.id.dev_composer_voice_message_button -> item.toggleExec { enabled -> + vectorPreferences.setVoiceMessageButtonEnabled(enabled) + requireActivity().restart() + true + } + R.id.dev_composer_emoji_button -> item.toggleExec { enabled -> + vectorPreferences.setEmojiButtonEnabled(enabled) + requireActivity().restart() + true + } + R.id.dev_composer_rich -> item.toggleExec { enabled -> + vectorPreferences.setRichEditorEnabled(enabled) + requireActivity().restart() true } R.id.menu_timeline_thread_list -> { 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 4b14cefc66..8d46bace0e 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 @@ -942,6 +942,7 @@ class TimelineViewModel @AssistedInject constructor( R.id.dev_bubble_style, R.id.dev_hidden_events, R.id.dev_event_visibilities, + R.id.dev_composer_features, R.id.dev_theming, // SC dev end R.id.dev_tools -> vectorPreferences.developerMode() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerFragment.kt index 04622f5e5e..2b11d4052f 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerFragment.kt @@ -136,6 +136,10 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A GlideApp.with(this) } + private val isRichTextEditorEnabled: Boolean by lazy { + vectorPreferences.isRichTextEditorEnabled() + } + private val isEmojiKeyboardVisible: Boolean get() = vectorPreferences.showEmojiKeyboard() @@ -152,7 +156,7 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A private val attachmentActionsViewModel: AttachmentTypeSelectorSharedActionViewModel by viewModels() private val composer: MessageComposerView get() { - return if (vectorPreferences.isRichTextEditorEnabled()) { + return if (isRichTextEditorEnabled) { views.richTextComposerLayout } else { views.composerLayout @@ -174,8 +178,8 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A setupComposer() setupEmojiButton() - views.composerLayout.isGone = vectorPreferences.isRichTextEditorEnabled() - views.richTextComposerLayout.isVisible = vectorPreferences.isRichTextEditorEnabled() + views.composerLayout.isGone = isRichTextEditorEnabled + views.richTextComposerLayout.isVisible = isRichTextEditorEnabled messageComposerViewModel.observeViewEvents { when (it) { @@ -253,7 +257,7 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A override fun onDestroyView() { super.onDestroyView() - if (!vectorPreferences.isRichTextEditorEnabled()) { + if (!isRichTextEditorEnabled) { autoCompleter.clear() } messageComposerViewModel.endAllVoiceActions() @@ -307,7 +311,7 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A val composerEditText = composer.editText composerEditText.setHint(R.string.room_message_placeholder) - if (!vectorPreferences.isRichTextEditorEnabled()) { + if (!isRichTextEditorEnabled) { autoCompleter.setup(composerEditText) } @@ -343,7 +347,7 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A } composer.callback = object : Callback { override fun onAddAttachment() { - if (vectorPreferences.isRichTextEditorEnabled()) { + if (isRichTextEditorEnabled) { AttachmentTypeSelectorBottomSheet.show(childFragmentManager) } else { if (!::attachmentTypeSelector.isInitialized) { 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 51efaa8b74..eaaf0108b5 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 @@ -1241,7 +1241,7 @@ class VectorPreferences @Inject constructor( .putBoolean(SETTINGS_OPEN_CHATS_AT_FIRST_UNREAD, true) .putBoolean(SETTINGS_ALLOW_URL_PREVIEW_IN_ENCRYPTED_ROOM_KEY, true) .putBoolean(SETTINGS_LABS_ALLOW_MARK_UNREAD, true) - .putBoolean(SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY, false) + //.putBoolean(SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY, false) .putBoolean(SETTINGS_VOICE_MESSAGE, false) .putBoolean(SETTINGS_USE_RAGE_SHAKE_KEY, true) .putBoolean(SETTINGS_AGGREGATE_UNREAD_COUNTS, false) @@ -1253,6 +1253,11 @@ class VectorPreferences @Inject constructor( .apply() } + // Some more quick settings + fun setVoiceMessageButtonEnabled(enabled: Boolean) = defaultPrefs.edit(commit = true) { putBoolean(SETTINGS_VOICE_MESSAGE, enabled) } + fun setEmojiButtonEnabled(enabled: Boolean) = defaultPrefs.edit(commit = true) { putBoolean(SETTINGS_SHOW_EMOJI_KEYBOARD, enabled) } + fun setRichEditorEnabled(enabled: Boolean) = defaultPrefs.edit(commit = true) { putBoolean(SETTINGS_LABS_RICH_TEXT_EDITOR_KEY, enabled) } + /** Whether the keyboard should disable personalized learning. */ fun useIncognitoKeyboard(): Boolean { return defaultPrefs.getBoolean(SETTINGS_SECURITY_INCOGNITO_KEYBOARD_PREFERENCE_KEY, false) diff --git a/vector/src/main/res/menu/menu_timeline.xml b/vector/src/main/res/menu/menu_timeline.xml index 797abe3619..f7ef814a5a 100644 --- a/vector/src/main/res/menu/menu_timeline.xml +++ b/vector/src/main/res/menu/menu_timeline.xml @@ -140,6 +140,27 @@ </menu> </item> + <item + android:id="@+id/dev_composer_features" + android:title="@string/settings_category_composer" + android:visible="false" + tools:visible="true" + app:showAsAction="never"> + <menu> + <group android:checkableBehavior="all"> + <item + android:id="@+id/dev_composer_voice_message_button" + android:title="@string/settings_show_voice_message_recorder_ui" /> + <item + android:id="@+id/dev_composer_emoji_button" + android:title="@string/settings_show_emoji_keyboard" /> + <item + android:id="@+id/dev_composer_rich" + android:title="@string/labs_enable_rich_text_editor_title" /> + </group> + </menu> + </item> + <item android:id="@+id/dev_hidden_events" android:title="@string/dev_tools_menu_hidden_events"