forked from eatvio/eatvio_app
feat(video_calls): added system android pip for calls
This commit is contained in:
@@ -37,6 +37,7 @@
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTop"
|
||||
android:supportsPictureInPicture="true"
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
package com.eatvioapp.app
|
||||
|
||||
import android.app.PictureInPictureParams
|
||||
import android.content.Intent
|
||||
import android.content.pm.ApplicationInfo
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Build
|
||||
import android.util.Rational
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugin.common.MethodChannel
|
||||
@@ -21,7 +24,10 @@ class MainActivity: FlutterActivity() {
|
||||
}
|
||||
|
||||
private val channelName = "com.eatvioapp/hms_push"
|
||||
private val videoCallPipChannelName = "com.eatvioapp/video_call_pip"
|
||||
private var methodChannel: MethodChannel? = null
|
||||
private var videoCallPipChannel: MethodChannel? = null
|
||||
private var videoCallPipEnabled: Boolean = false
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
@@ -37,6 +43,16 @@ class MainActivity: FlutterActivity() {
|
||||
super.configureFlutterEngine(flutterEngine)
|
||||
|
||||
methodChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channelName)
|
||||
videoCallPipChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, videoCallPipChannelName)
|
||||
videoCallPipChannel?.setMethodCallHandler { call, result ->
|
||||
when (call.method) {
|
||||
"setPipEnabled" -> {
|
||||
videoCallPipEnabled = call.arguments as? Boolean ?: false
|
||||
result.success(null)
|
||||
}
|
||||
else -> result.notImplemented()
|
||||
}
|
||||
}
|
||||
methodChannel?.setMethodCallHandler { call, result ->
|
||||
when (call.method) {
|
||||
"getHuaweiToken" -> {
|
||||
@@ -94,6 +110,12 @@ class MainActivity: FlutterActivity() {
|
||||
handleIntentForActionUrl(intent)
|
||||
}
|
||||
|
||||
override fun onUserLeaveHint() {
|
||||
super.onUserLeaveHint()
|
||||
enterVideoCallPictureInPictureIfNeeded()
|
||||
videoCallPipChannel?.invokeMethod("onUserLeaveHint", null)
|
||||
}
|
||||
|
||||
override fun onNewIntent(intent: Intent) {
|
||||
super.onNewIntent(intent)
|
||||
// Обработка нового интента, когда Activity уже запущена (тап по уведомлению).
|
||||
@@ -122,4 +144,19 @@ class MainActivity: FlutterActivity() {
|
||||
// Проксируем URL во Flutter, где уже есть общая логика навигации по диплинкам.
|
||||
methodChannel?.invokeMethod("openActionUrl", actionUrl)
|
||||
}
|
||||
|
||||
private fun enterVideoCallPictureInPictureIfNeeded() {
|
||||
if (!videoCallPipEnabled) return
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return
|
||||
if (isInPictureInPictureMode) return
|
||||
|
||||
try {
|
||||
val params = PictureInPictureParams.Builder()
|
||||
.setAspectRatio(Rational(2, 3))
|
||||
.build()
|
||||
enterPictureInPictureMode(params)
|
||||
} catch (e: Exception) {
|
||||
android.util.Log.w("VideoCallPiP", "Unable to enter PiP from onUserLeaveHint", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user