diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsEvents.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsEvents.kt index f64e401fa3..95cc225fe3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsEvents.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsEvents.kt @@ -11,4 +11,5 @@ sealed interface LabsSettingsEvents { data class ToggleIncognito(val enabled: Boolean) : LabsSettingsEvents data class ToggleGroupSuggestionsForMembers(val enabled: Boolean) : LabsSettingsEvents data class ToggleBetterSearch(val enabled: Boolean) : LabsSettingsEvents + data class ToggleAutoLowerHand(val enabled: Boolean) : LabsSettingsEvents } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsFragment.kt index 8a95ea9d58..eef2cd82ba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsFragment.kt @@ -133,6 +133,15 @@ private fun LabsSettingsContent( onCheckChanged = { onEvent(LabsSettingsEvents.ToggleBetterSearch(it)) } ) } + + item { + Rows.ToggleRow( + checked = state.autoLowerHand, + text = "Auto Lower Hand Suggestion", + label = "Show a prompt to lower your raised hand when you are speaking in a group call.", + onCheckChanged = { onEvent(LabsSettingsEvents.ToggleAutoLowerHand(it)) } + ) + } } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsState.kt index c8b07d3c8d..26d3af9eaa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsState.kt @@ -13,5 +13,6 @@ data class LabsSettingsState( val storyArchive: Boolean = false, val incognito: Boolean = false, val groupSuggestionsForMembers: Boolean = false, - val betterSearch: Boolean = false + val betterSearch: Boolean = false, + val autoLowerHand: Boolean = false ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsViewModel.kt index a74636c436..7af5cf9cf2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/labs/LabsSettingsViewModel.kt @@ -37,6 +37,10 @@ class LabsSettingsViewModel : ViewModel() { SignalStore.labs.betterSearch = event.enabled _state.value = _state.value.copy(betterSearch = event.enabled) } + is LabsSettingsEvents.ToggleAutoLowerHand -> { + SignalStore.labs.autoLowerHand = event.enabled + _state.value = _state.value.copy(autoLowerHand = event.enabled) + } } } @@ -46,7 +50,8 @@ class LabsSettingsViewModel : ViewModel() { storyArchive = SignalStore.labs.storyArchive, incognito = SignalStore.labs.incognito, groupSuggestionsForMembers = SignalStore.labs.groupSuggestionsForMembers, - betterSearch = SignalStore.labs.betterSearch + betterSearch = SignalStore.labs.betterSearch, + autoLowerHand = SignalStore.labs.autoLowerHand ) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/RaiseHandSnackbar.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/RaiseHandSnackbar.kt index fa4f784dc8..92981a1f5d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/RaiseHandSnackbar.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/RaiseHandSnackbar.kt @@ -217,11 +217,11 @@ private fun getSnackbarText(state: RaiseHandState): String { val shouldDisplayLowerYourHand = remember(state) { val now = System.currentTimeMillis().milliseconds - val hasUnexpiredSelf = state.raisedHands.any { it.sender.isSelf && it.sender.isPrimary && it.getCollapseTimestamp() >= now } + val hasSelfRaisedHand = state.raisedHands.any { it.sender.isSelf && it.sender.isPrimary } val expiration = state.speechEvent?.getCollapseTimestamp() ?: Duration.ZERO val isUnexpired = expiration >= now - state.speechEvent?.speechEvent == GroupCall.SpeechEvent.LOWER_HAND_SUGGESTION && isUnexpired && hasUnexpiredSelf + state.speechEvent?.speechEvent == GroupCall.SpeechEvent.LOWER_HAND_SUGGESTION && isUnexpired && hasSelfRaisedHand } if (shouldDisplayLowerYourHand && state.isExpanded) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/LabsValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/LabsValues.kt index f2f4c79517..6119615431 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/LabsValues.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/LabsValues.kt @@ -9,6 +9,7 @@ class LabsValues internal constructor(store: KeyValueStore) : SignalStoreValues( const val INCOGNITO: String = "labs.incognito" const val GROUP_SUGGESTIONS_FOR_MEMBERS: String = "labs.group_suggestions_for_members" const val BETTER_SEARCH: String = "labs.better_search" + const val AUTO_LOWER_HAND: String = "labs.auto_lower_hand" } public override fun onFirstEverAppLaunch() = Unit @@ -25,6 +26,8 @@ class LabsValues internal constructor(store: KeyValueStore) : SignalStoreValues( var betterSearch by booleanValue(BETTER_SEARCH, true).falseForExternalUsers() + var autoLowerHand by booleanValue(AUTO_LOWER_HAND, true).falseForExternalUsers() + private fun SignalStoreValueDelegate.falseForExternalUsers(): SignalStoreValueDelegate { return this.map { actualValue -> RemoteConfig.internalUser && actualValue } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupConnectedActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupConnectedActionProcessor.java index 0c2e901cb6..9296b2d354 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupConnectedActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/GroupConnectedActionProcessor.java @@ -383,6 +383,10 @@ public class GroupConnectedActionProcessor extends GroupActionProcessor { protected @NonNull WebRtcServiceState handleGroupCallSpeechEvent(@NonNull WebRtcServiceState currentState, @NonNull GroupCall.SpeechEvent speechEvent) { Log.i(tag, "handleGroupCallSpeechEvent :: " + speechEvent.name()); + if (!SignalStore.labs().getAutoLowerHand()) { + return currentState; + } + return currentState.builder() .changeCallInfoState() .setGroupCallSpeechEvent(new GroupCallSpeechEvent(speechEvent))