From 17e3622bdce19d71d06d25475c2f6ce011ecce93 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 13 Jan 2025 11:57:33 +0100 Subject: [PATCH] Try to enter PiP mode when leaving CallActivity during a video call, either by back gesture or button, and remove PiP when call is ended --- .../compatibility/Api31Compatibility.kt | 1 + .../java/org/linphone/ui/call/CallActivity.kt | 26 ++++++++++++++++++- .../fragment/ActiveConferenceCallFragment.kt | 6 +++-- .../ui/call/fragment/ActiveCallFragment.kt | 5 ++-- .../ui/call/viewmodel/CurrentCallViewModel.kt | 6 +++++ 5 files changed, 39 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt index 5518767ea..a84ddd1a5 100644 --- a/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt @@ -46,6 +46,7 @@ class Api31Compatibility { .setAutoEnterEnabled(enable) .build() ) + Log.i("$TAG PiP auto enter has been [${if (enable) "enabled" else "disabled"}]") } catch (ise: IllegalArgumentException) { Log.e("$TAG Can't set PiP params: $ise") } diff --git a/app/src/main/java/org/linphone/ui/call/CallActivity.kt b/app/src/main/java/org/linphone/ui/call/CallActivity.kt index c75c4a087..f9f61f498 100644 --- a/app/src/main/java/org/linphone/ui/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/ui/call/CallActivity.kt @@ -49,6 +49,7 @@ import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R +import org.linphone.compatibility.Api28Compatibility import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log import org.linphone.databinding.CallActivityBinding @@ -64,6 +65,7 @@ import org.linphone.ui.call.model.AudioDeviceModel import org.linphone.ui.call.viewmodel.CallsViewModel import org.linphone.ui.call.viewmodel.CurrentCallViewModel import org.linphone.ui.call.viewmodel.SharedCallViewModel +import org.linphone.ui.main.MainActivity @UiThread class CallActivity : GenericActivity() { @@ -376,7 +378,7 @@ class CallActivity : GenericActivity() { if (::callViewModel.isInitialized) { if (isPipSupported && callViewModel.isVideoEnabled.value == true) { - Log.i("$TAG User leave hint, entering PiP mode") + Log.i("$TAG User leave hint, try entering PiP mode") val pipMode = Compatibility.enterPipMode(this) if (!pipMode) { Log.e("$TAG Failed to enter PiP mode") @@ -386,6 +388,28 @@ class CallActivity : GenericActivity() { } } + @UiThread + fun goToMainActivity() { + if (isPipSupported && callViewModel.isVideoEnabled.value == true) { + Log.i("$TAG User is going back to MainActivity, try entering PiP mode") + val pipMode = Api28Compatibility.enterPipMode(this) + if (!pipMode) { + Log.e("$TAG Failed to enter PiP mode, finishing Activity") + callViewModel.pipMode.value = false + finish() + return + } + + Log.i("$TAG Launching MainActivity to have PiP above it") + val intent = Intent(this, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) + startActivity(intent) + } else { + Log.i("$TAG Either PiP isn't supported or video is not enabled, finishing Activity") + finish() + } + } + private fun updateCurrentLayout(newLayoutInfo: WindowLayoutInfo) { if (newLayoutInfo.displayFeatures.isNotEmpty()) { for (feature in newLayoutInfo.displayFeatures) { diff --git a/app/src/main/java/org/linphone/ui/call/conference/fragment/ActiveConferenceCallFragment.kt b/app/src/main/java/org/linphone/ui/call/conference/fragment/ActiveConferenceCallFragment.kt index 78dbd249d..7cf980f2a 100644 --- a/app/src/main/java/org/linphone/ui/call/conference/fragment/ActiveConferenceCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/conference/fragment/ActiveConferenceCallFragment.kt @@ -40,6 +40,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.CallActiveConferenceFragmentBinding +import org.linphone.ui.call.CallActivity import org.linphone.ui.call.fragment.GenericCallFragment import org.linphone.ui.call.viewmodel.CallsViewModel import org.linphone.ui.call.viewmodel.CurrentCallViewModel @@ -129,7 +130,8 @@ class ActiveConferenceCallFragment : GenericCallFragment() { Log.i("$TAG Back gesture/click detected, no bottom sheet is expanded, going back") isEnabled = false try { - requireActivity().onBackPressedDispatcher.onBackPressed() + Log.i("$TAG Back gesture detected, going to MainActivity") + (requireActivity() as CallActivity).goToMainActivity() } catch (ise: IllegalStateException) { Log.w("$TAG Can't go back: $ise") } @@ -279,7 +281,7 @@ class ActiveConferenceCallFragment : GenericCallFragment() { } binding.setBackClickListener { - requireActivity().finish() + (requireActivity() as CallActivity).goToMainActivity() } binding.setCallsListClickListener { diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt index 460a512d8..8d71e4d56 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt @@ -145,7 +145,8 @@ class ActiveCallFragment : GenericCallFragment() { Log.i("$TAG Back gesture/click detected, no bottom sheet is expanded, going back") isEnabled = false try { - requireActivity().onBackPressedDispatcher.onBackPressed() + Log.i("$TAG Back gesture detected, going to MainActivity") + (requireActivity() as CallActivity).goToMainActivity() } catch (ise: IllegalStateException) { Log.w( "$TAG Can't go back: $ise" @@ -210,7 +211,7 @@ class ActiveCallFragment : GenericCallFragment() { callMediaEncryptionStatsBottomSheetBehavior.skipCollapsed = true binding.setBackClickListener { - requireActivity().finish() + (requireActivity() as CallActivity).goToMainActivity() } binding.setTransferCallClickListener { diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt index bc032adba..92b6c340a 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt @@ -1427,6 +1427,12 @@ class CurrentCallViewModel finishActivityEvent.postValue(Event(true)) } else -> { + if (pipMode.value == true) { + Log.i("$TAG Activity currently displayed in PiP, do not go to ended call fragment") + finishActivityEvent.postValue(Event(true)) + return + } + Log.i("$TAG Go to ended call fragment") updateCallDuration()