diff --git a/app/src/main/java/org/linphone/ui/voip/VoipActivity.kt b/app/src/main/java/org/linphone/ui/voip/VoipActivity.kt index 666b6adaa..2916370b5 100644 --- a/app/src/main/java/org/linphone/ui/voip/VoipActivity.kt +++ b/app/src/main/java/org/linphone/ui/voip/VoipActivity.kt @@ -19,6 +19,8 @@ */ package org.linphone.ui.voip +import android.app.PictureInPictureParams +import android.content.pm.PackageManager import android.os.Bundle import android.view.ViewGroup import androidx.annotation.DrawableRes @@ -103,6 +105,7 @@ class VoipActivity : AppCompatActivity() { callViewModel = run { ViewModelProvider(this)[CurrentCallViewModel::class.java] } + binding.callViewModel = callViewModel callViewModel.showAudioDevicesListEvent.observe(this) { it.consume { devices -> @@ -172,6 +175,43 @@ class VoipActivity : AppCompatActivity() { } } + override fun onResume() { + super.onResume() + + val isInPipMode = isInPictureInPictureMode + if (::callViewModel.isInitialized) { + Log.i("$TAG onResume: is in PiP mode? $isInPipMode") + callViewModel.pipMode.value = isInPipMode + } + } + + override fun onUserLeaveHint() { + super.onUserLeaveHint() + + if (::callViewModel.isInitialized && callViewModel.isVideoEnabled.value == true) { + Log.i("$TAG User leave hint, entering PiP mode") + val supportsPip = packageManager.hasSystemFeature( + PackageManager.FEATURE_PICTURE_IN_PICTURE + ) + Log.i("$TAG Is PiP supported: $supportsPip") + if (supportsPip) { + val params = PictureInPictureParams.Builder() + .setAspectRatio(AppUtils.getPipRatio(this)) + .build() + try { + if (!enterPictureInPictureMode(params)) { + Log.e("$TAG Failed to enter PiP mode") + callViewModel.pipMode.value = false + } else { + Log.i("$TAG Entered PiP mode") + } + } catch (e: Exception) { + Log.e("$TAG Can't build PiP params: $e") + } + } + } + } + private fun updateCurrentLayout(newLayoutInfo: WindowLayoutInfo) { if (newLayoutInfo.displayFeatures.isNotEmpty()) { for (feature in newLayoutInfo.displayFeatures) { diff --git a/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt index d131b88e1..8f1862304 100644 --- a/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/voip/viewmodel/CurrentCallViewModel.kt @@ -67,6 +67,8 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { val fullScreenMode = MutableLiveData() + val pipMode = MutableLiveData() + // To synchronize chronometers in UI val callDuration = MutableLiveData() diff --git a/app/src/main/java/org/linphone/utils/AppUtils.kt b/app/src/main/java/org/linphone/utils/AppUtils.kt index c370c1ac1..644966462 100644 --- a/app/src/main/java/org/linphone/utils/AppUtils.kt +++ b/app/src/main/java/org/linphone/utils/AppUtils.kt @@ -19,7 +19,10 @@ */ package org.linphone.utils +import android.app.Activity import android.content.Context +import android.util.DisplayMetrics +import android.util.Rational import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -50,6 +53,42 @@ class AppUtils { return coreContext.context.getString(id, args) } + @MainThread + fun getPipRatio( + activity: Activity, + forcePortrait: Boolean = false, + forceLandscape: Boolean = false + ): Rational { + val displayMetrics = DisplayMetrics() + activity.windowManager.defaultDisplay.getMetrics(displayMetrics) + var height = displayMetrics.heightPixels + var width = displayMetrics.widthPixels + + val aspectRatio = width / height + if (aspectRatio < 1 / 2.39) { + height = 2.39.toInt() + width = 1 + } else if (aspectRatio > 2.39) { + width = 2.39.toInt() + height = 1 + } + + val ratio = if (width > height) { + if (forcePortrait) { + Rational(height, width) + } else { + Rational(width, height) + } + } else { + if (forceLandscape) { + Rational(height, width) + } else { + Rational(width, height) + } + } + return ratio + } + @MainThread fun getRedToast( context: Context, diff --git a/app/src/main/res/layout/voip_active_call_fragment.xml b/app/src/main/res/layout/voip_active_call_fragment.xml index 7357ca86d..56fc9c71c 100644 --- a/app/src/main/res/layout/voip_active_call_fragment.xml +++ b/app/src/main/res/layout/voip_active_call_fragment.xml @@ -113,13 +113,19 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"/> + + @@ -163,7 +167,6 @@ android:layout_marginStart="5dp" android:textColor="@color/white" android:textSize="16sp" - android:visibility="@{viewModel.fullScreenMode ? View.GONE : View.VISIBLE}" app:layout_constraintStart_toEndOf="@id/separator" app:layout_constraintTop_toTopOf="@id/call_direction_label" app:layout_constraintBottom_toBottomOf="@id/call_direction_label"/> @@ -176,7 +179,7 @@ android:padding="5dp" android:layout_marginEnd="10dp" android:src="@drawable/camera_rotate" - android:visibility="@{!viewModel.fullScreenMode && viewModel.isVideoEnabled && viewModel.showSwitchCamera ? View.VISIBLE : View.GONE}" + android:visibility="@{!viewModel.fullScreenMode && !viewModel.pipMode && viewModel.isVideoEnabled && viewModel.showSwitchCamera ? View.VISIBLE : View.GONE}" app:tint="@color/white" app:layout_constraintTop_toTopOf="@id/call_direction_label" app:layout_constraintBottom_toBottomOf="@id/call_direction_label" @@ -200,7 +203,7 @@ diff --git a/app/src/main/res/layout/voip_activity.xml b/app/src/main/res/layout/voip_activity.xml index f838e8e00..3f9cdc158 100644 --- a/app/src/main/res/layout/voip_activity.xml +++ b/app/src/main/res/layout/voip_activity.xml @@ -4,6 +4,10 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + +