diff --git a/app/src/main/java/org/linphone/activities/voip/CallActivity.kt b/app/src/main/java/org/linphone/activities/voip/CallActivity.kt index 59d41beea..67f4aabad 100644 --- a/app/src/main/java/org/linphone/activities/voip/CallActivity.kt +++ b/app/src/main/java/org/linphone/activities/voip/CallActivity.kt @@ -33,7 +33,6 @@ import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.activities.* import org.linphone.activities.main.MainActivity -import org.linphone.activities.navigateToActiveCall import org.linphone.activities.voip.viewmodels.CallsViewModel import org.linphone.activities.voip.viewmodels.ConferenceViewModel import org.linphone.activities.voip.viewmodels.ControlsViewModel @@ -106,7 +105,7 @@ class CallActivity : ProximitySensorActivity() { controlsViewModel.isVideoEnabled.observe( this ) { enabled -> - Compatibility.enableAutoEnterPiP(this, enabled) + Compatibility.enableAutoEnterPiP(this, enabled, conferenceViewModel.conferenceExists.value == true) } controlsViewModel.callStatsVisible.observe( @@ -185,7 +184,7 @@ class CallActivity : ProximitySensorActivity() { if (coreContext.core.currentCall?.currentParams?.isVideoEnabled == true) { Log.i("[Call Activity] Entering PiP mode") - Compatibility.enterPipMode(this) + Compatibility.enterPipMode(this, conferenceViewModel.conferenceExists.value == true) } } diff --git a/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt index a1a60b7cc..d76b521b0 100644 --- a/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api26Compatibility.kt @@ -55,14 +55,20 @@ import org.linphone.utils.LinphoneUtils @TargetApi(26) class Api26Compatibility { companion object { - fun enterPipMode(activity: Activity) { + fun enterPipMode(activity: Activity, conference: Boolean) { val supportsPip = activity.packageManager .hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) Log.i("[Call] Is PiP supported: $supportsPip") if (supportsPip) { - val params = PictureInPictureParams.Builder().build() + // Force portrait layout if in conference, otherwise for landscape + // Our layouts behave better in these orientation + val params = PictureInPictureParams.Builder() + .setAspectRatio(Compatibility.getPipRatio(activity, conference, !conference)) + .build() if (!activity.enterPictureInPictureMode(params)) { Log.e("[Call] Failed to enter PiP mode") + } else { + Log.i("[Call] Entering PiP mode with ${if (conference) "portrait" else "landscape"} aspect ratio") } } } diff --git a/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt index 22cda4e4b..63dbee83a 100644 --- a/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Api31Compatibility.kt @@ -204,14 +204,19 @@ class Api31Compatibility { } } - fun enableAutoEnterPiP(activity: Activity, enable: Boolean) { + fun enableAutoEnterPiP(activity: Activity, enable: Boolean, conference: Boolean) { val supportsPip = activity.packageManager .hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) Log.i("[Call] Is PiP supported: $supportsPip") if (supportsPip) { - val params = PictureInPictureParams.Builder().setAutoEnterEnabled(enable).build() + // Force portrait layout if in conference, otherwise for landscape + // Our layouts behave better in these orientation + val params = PictureInPictureParams.Builder() + .setAutoEnterEnabled(enable) + .setAspectRatio(Compatibility.getPipRatio(activity, conference, !conference)) + .build() activity.setPictureInPictureParams(params) - Log.i("[Call] PiP auto enter enabled params set to $enable") + Log.i("[Call] PiP auto enter enabled params set to $enable with ${if (conference) "portrait" else "landscape"} aspect ratio") } } diff --git a/app/src/main/java/org/linphone/compatibility/Compatibility.kt b/app/src/main/java/org/linphone/compatibility/Compatibility.kt index 106b0999f..2aa2d0525 100644 --- a/app/src/main/java/org/linphone/compatibility/Compatibility.kt +++ b/app/src/main/java/org/linphone/compatibility/Compatibility.kt @@ -30,6 +30,8 @@ import android.net.Uri import android.os.Build import android.os.Vibrator import android.telephony.TelephonyManager +import android.util.DisplayMetrics +import android.util.Rational import android.view.View import android.view.Window import android.view.WindowManager @@ -266,18 +268,43 @@ class Compatibility { return Api23Compatibility.canDrawOverlay(context) } - fun enterPipMode(activity: Activity) { + fun enterPipMode(activity: Activity, conference: Boolean) { if (Version.sdkStrictlyBelow(Version.API31_ANDROID_12) && Version.sdkAboveOrEqual(Version.API26_O_80)) { - Api26Compatibility.enterPipMode(activity) + Api26Compatibility.enterPipMode(activity, conference) } } - fun enableAutoEnterPiP(activity: Activity, enable: Boolean) { + fun enableAutoEnterPiP(activity: Activity, enable: Boolean, conference: Boolean) { if (Version.sdkAboveOrEqual(Version.API31_ANDROID_12)) { - Api31Compatibility.enableAutoEnterPiP(activity, enable) + Api31Compatibility.enableAutoEnterPiP(activity, enable, conference) } } + fun getPipRatio( + activity: Activity, + forcePortrait: Boolean = false, + forceLandscape: Boolean = false + ): Rational { + val displayMetrics = DisplayMetrics() + activity.windowManager.defaultDisplay.getMetrics(displayMetrics) + val height = displayMetrics.heightPixels + val width = displayMetrics.widthPixels + 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 + } + fun eventVibration(vibrator: Vibrator) { if (Version.sdkAboveOrEqual(Version.API26_O_80)) { Api26Compatibility.eventVibration(vibrator) diff --git a/app/src/main/res/layout/voip_conference_active_speaker.xml b/app/src/main/res/layout/voip_conference_active_speaker.xml index 92dcb40c6..1b3e26c1b 100644 --- a/app/src/main/res/layout/voip_conference_active_speaker.xml +++ b/app/src/main/res/layout/voip_conference_active_speaker.xml @@ -147,6 +147,7 @@ android:id="@+id/scroll_indicator" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:visibility="@{controlsViewModel.pipMode ? View.GONE : View.VISIBLE}" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"