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"