From a8bdca0c262694dcd925bd4db1dc5a2ba4c44aab Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 17 Mar 2023 12:09:49 +0100 Subject: [PATCH] Added RC setting to disable video completely --- CHANGELOG.md | 1 + .../viewmodels/ConferenceWaitingRoomViewModel.kt | 2 ++ .../activities/voip/viewmodels/CallsViewModel.kt | 1 + .../voip/viewmodels/ConferenceViewModel.kt | 4 ++-- .../voip/viewmodels/ControlsViewModel.kt | 2 ++ app/src/main/java/org/linphone/core/CoreContext.kt | 14 +++++++++++++- .../main/java/org/linphone/core/CorePreferences.kt | 13 +++++++++---- .../conference_waiting_room_fragment.xml | 1 + .../layout/conference_waiting_room_fragment.xml | 2 ++ app/src/main/res/layout/voip_buttons.xml | 1 + 10 files changed, 34 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9c3e1de2..42824b5a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ Group changes to describe their impact on the project, as follows: - Showing short term presence for contacts whom publish it + added setting to disable it (enabled by default for sip.linphone.org accounts) - Confirmation dialog before removing account - Attended transfer instead of blind transfer if there is more than 1 call +- Added hidden setting to disable video completely ### Changed - Account EXPIRES is now set to 1 month instead of 1 year for sip.linphone.org accounts diff --git a/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceWaitingRoomViewModel.kt b/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceWaitingRoomViewModel.kt index 8da75bb14..d6e6504a6 100644 --- a/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceWaitingRoomViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceWaitingRoomViewModel.kt @@ -103,6 +103,8 @@ class ConferenceWaitingRoomViewModel : MessageNotifierViewModel() { } } + val hideVideo = corePreferences.disableVideo + private val callParams: CallParams = coreContext.core.createCallParams(null)!! private val listener: CoreListenerStub = object : CoreListenerStub() { diff --git a/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt b/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt index 711a7ca73..6d2a129f2 100644 --- a/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/voip/viewmodels/CallsViewModel.kt @@ -24,6 +24,7 @@ import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.activities.voip.data.CallData import org.linphone.core.* diff --git a/app/src/main/java/org/linphone/activities/voip/viewmodels/ConferenceViewModel.kt b/app/src/main/java/org/linphone/activities/voip/viewmodels/ConferenceViewModel.kt index e69e25b8b..09a75dc0a 100644 --- a/app/src/main/java/org/linphone/activities/voip/viewmodels/ConferenceViewModel.kt +++ b/app/src/main/java/org/linphone/activities/voip/viewmodels/ConferenceViewModel.kt @@ -198,7 +198,7 @@ class ConferenceViewModel : ViewModel() { override fun onStateChanged(conference: Conference, state: Conference.State) { Log.i("[Conference] State changed: $state") - isVideoConference.value = conference.currentParams.isVideoEnabled + isVideoConference.value = conference.currentParams.isVideoEnabled && !corePreferences.disableVideo when (state) { Conference.State.Created -> { @@ -340,7 +340,7 @@ class ConferenceViewModel : ViewModel() { isConferenceLocallyPaused.value = !conference.isIn isMeAdmin.value = conference.me.isAdmin - isVideoConference.value = conference.currentParams.isVideoEnabled + isVideoConference.value = conference.currentParams.isVideoEnabled && !corePreferences.disableVideo subject.value = LinphoneUtils.getConferenceSubject(conference) updateConferenceLayout(conference) diff --git a/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt b/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt index ec4c7ab2c..6de93caa5 100644 --- a/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/voip/viewmodels/ControlsViewModel.kt @@ -107,6 +107,8 @@ class ControlsViewModel : ViewModel() { val foldingState = MutableLiveData() + val hideVideo = corePreferences.disableVideo + private val nonEarpieceOutputAudioDevice = MutableLiveData() private val listener: CoreListenerStub = object : CoreListenerStub() { diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index df1ede8b1..943d08415 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -133,6 +133,18 @@ class CoreContext( override fun onGlobalStateChanged(core: Core, state: GlobalState, message: String) { Log.i("[Context] Global state changed [$state]") if (state == GlobalState.On) { + if (corePreferences.disableVideo) { + // if video has been disabled, don't forget to tell the Core to disable it as well + Log.w("[Context] Video has been disabled in app, disabling it as well in the Core") + core.isVideoCaptureEnabled = false + core.isVideoDisplayEnabled = false + + val videoPolicy = core.videoActivationPolicy + videoPolicy.automaticallyInitiate = false + videoPolicy.automaticallyAccept = false + core.videoActivationPolicy = videoPolicy + } + fetchContacts() } } @@ -789,7 +801,7 @@ class CoreContext( } fun showSwitchCameraButton(): Boolean { - return core.videoDevicesList.size > 2 // Count StaticImage camera + return !corePreferences.disableVideo && core.videoDevicesList.size > 2 // Count StaticImage camera } fun createCallOverlay() { diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index 838d5a30d..6c8f503d0 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -30,6 +30,7 @@ import java.security.KeyStoreException import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log +import org.linphone.utils.LinphoneUtils class CorePreferences constructor(private val context: Context) { private var _config: Config? = null @@ -474,6 +475,10 @@ class CorePreferences constructor(private val context: Context) { val disableChat: Boolean get() = config.getBool("app", "disable_chat_feature", false) + // Will disable video feature completely + val disableVideo: Boolean + get() = config.getBool("app", "disable_video_feature", false) + val forceEndToEndEncryptedChat: Boolean get() = config.getBool("app", "force_lime_chat_rooms", false) @@ -572,7 +577,7 @@ class CorePreferences constructor(private val context: Context) { get() = config.getBool("app", "side_menu_recordings", true) val showScheduledConferencesInSideMenu: Boolean - get() = config.getBool("app", "side_menu_conferences", true) + get() = config.getBool("app", "side_menu_conferences", LinphoneUtils.isRemoteConferencingAvailable()) val showAboutInSideMenu: Boolean get() = config.getBool("app", "side_menu_about", true) @@ -595,13 +600,13 @@ class CorePreferences constructor(private val context: Context) { get() = config.getBool("app", "settings_audio", true) val showVideoSettings: Boolean - get() = config.getBool("app", "settings_video", true) + get() = config.getBool("app", "settings_video", !disableVideo) val showCallSettings: Boolean get() = config.getBool("app", "settings_call", true) val showChatSettings: Boolean - get() = config.getBool("app", "settings_chat", true) + get() = config.getBool("app", "settings_chat", !disableChat) val showNetworkSettings: Boolean get() = config.getBool("app", "settings_network", true) @@ -613,7 +618,7 @@ class CorePreferences constructor(private val context: Context) { get() = config.getBool("app", "settings_advanced", true) val showConferencesSettings: Boolean - get() = config.getBool("app", "settings_conferences", true) + get() = config.getBool("app", "settings_conferences", LinphoneUtils.isRemoteConferencingAvailable()) /* Assets stuff */ diff --git a/app/src/main/res/layout-land/conference_waiting_room_fragment.xml b/app/src/main/res/layout-land/conference_waiting_room_fragment.xml index 16491bcf9..64c9d3c78 100644 --- a/app/src/main/res/layout-land/conference_waiting_room_fragment.xml +++ b/app/src/main/res/layout-land/conference_waiting_room_fragment.xml @@ -284,6 +284,7 @@ android:onClick="@{() -> viewModel.toggleVideo()}" android:padding="5dp" android:selected="@{viewModel.isVideoEnabled}" + android:visibility="@{viewModel.hideVideo ? View.GONE : View.VISIBLE}" android:src="@drawable/icon_toggle_camera" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="W,1:1" diff --git a/app/src/main/res/layout/conference_waiting_room_fragment.xml b/app/src/main/res/layout/conference_waiting_room_fragment.xml index d5a8d149d..6a648844b 100644 --- a/app/src/main/res/layout/conference_waiting_room_fragment.xml +++ b/app/src/main/res/layout/conference_waiting_room_fragment.xml @@ -288,6 +288,7 @@ android:onClick="@{() -> viewModel.toggleVideo()}" android:padding="5dp" android:selected="@{viewModel.isVideoEnabled}" + android:visibility="@{viewModel.hideVideo ? View.GONE : View.VISIBLE}" android:src="@drawable/icon_toggle_camera" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="W,1:1" @@ -304,6 +305,7 @@ android:padding="10dp" android:selected="@{viewModel.layoutMenuSelected}" android:src="@{viewModel.selectedLayout == ConferenceDisplayMode.ACTIVE_SPEAKER ? @drawable/icon_conference_layout_active_speaker : viewModel.selectedLayout == ConferenceDisplayMode.AUDIO_ONLY ? @drawable/icon_conference_layout_audio_only : @drawable/icon_conference_layout_grid, default=@drawable/icon_conference_layout_grid}" + android:visibility="@{viewModel.hideVideo ? View.GONE : View.VISIBLE}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="W,1:1" app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/voip_buttons.xml b/app/src/main/res/layout/voip_buttons.xml index 0ca230176..3d488b41e 100644 --- a/app/src/main/res/layout/voip_buttons.xml +++ b/app/src/main/res/layout/voip_buttons.xml @@ -100,6 +100,7 @@ android:onClick="@{() -> (!conferenceViewModel.conferenceExists || conferenceViewModel.conferenceDisplayMode != ConferenceDisplayMode.AUDIO_ONLY) ? controlsViewModel.toggleVideo() : conferenceViewModel.switchLayoutFromAudioOnlyToActiveSpeaker()}" android:padding="5dp" android:selected="@{controlsViewModel.isVideoEnabled && controlsViewModel.isSendingVideo}" + android:visibility="@{controlsViewModel.hideVideo ? View.GONE : View.VISIBLE}" android:src="@drawable/icon_toggle_camera" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintDimensionRatio="W,1:1"