feat: implement enterPictureInPictureOnLeave prop for both platform (Android, iOS) (#3385)
* docs: enable Android PIP * chore: change comments * feat(android): implement Android PictureInPicture * refactor: minor refactor code and apply lint * fix: rewrite pip action intent code for Android14 * fix: remove redundant codes * feat: add isInPictureInPicture flag for lifecycle handling - activity provide helper method for same purpose, but this flag makes code simple * feat: add pipFullscreenPlayerView for makes PIP include video only * fix: add manifest value checker for prevent crash * docs: add pictureInPicture prop's Android guide * fix: sync controller visibility * refactor: refining variable name * fix: check multi window mode when host pause - some OS version call onPause on multi-window mode * fix: handling when onStop is called while in multi-window mode * refactor: enhance PIP util codes * fix: fix FullscreenPlayerView constructor * refactor: add enterPictureInPictureOnLeave prop and pip methods - remove pictureInPicture boolean prop - add enterPictureInPictureOnLeave boolean prop - add enterPictureInPicture method - add exitPictureInPicture method * fix: fix lint error * fix: prevent audio play in background without playInBackground prop * fix: fix onDetachedFromWindow * docs: update docs for pip * fix(android): sync pip controller with external controller state - for media session * fix(ios): fix pip active fn variable reference * refactor(ios): refactor code * refactor(android): refactor codes * fix(android): fix lint error * refactor(android): refactor android pip logics * fix(android): fix flickering issue when stop picture in picture * fix(android): fix import * fix(android): fix picture in picture with fullscreen mode * fix(ios): fix syntax error * fix(android): fix Fragment managed code * refactor(android): remove redundant override lifecycle * fix(js): add PIP type definition for codegen * fix(android): fix syntax * chore(android): fix lint error * fix(ios): fix enter background handler * refactor(ios): remove redundant code * fix(ios): fix applicationDidEnterBackground for PIP * fix(android): fix onPictureInPictureStatusChanged * fix(ios): fix RCTPictureInPicture * refactor(android): Ignore exception for some device ignore pip checker - some device ignore PIP availability check, so we need to handle exception to prevent crash * fix(android): add hideWithoutPlayer fn into Kotlin ver * refactor(android): remove redundant code * fix(android): fix pip ratio to be calculated with correct ratio value * fix(android): fix crash issue when unmounting in PIP mode * fix(android): fix lint error * Update android/src/main/java/com/brentvatne/react/VideoManagerModule.kt * fix(android): fix lint error * fix(ios): fix lint error * fix(ios): fix lint error * feat(expo): add android picture in picture config within expo plugin * fix: Replace Fragment with androidx.activity - remove code that uses Fragment, which is a tricky implementation * fix: fix lint error * fix(android): disable auto enter when player released * fix(android): fix event handler to check based on Activity it's bound to --------- Co-authored-by: jonghun <jonghun@toss.im> Co-authored-by: Olivier Bouillet <62574056+freeboub@users.noreply.github.com>
This commit is contained in:
		@@ -78,6 +78,56 @@ Future:
 | 
			
		||||
- Will support more formats in the future through options
 | 
			
		||||
- Will support custom directory and file name through options
 | 
			
		||||
 | 
			
		||||
### `enterPictureInPicture`
 | 
			
		||||
 | 
			
		||||
<PlatformsList types={['Android', 'iOS']} />
 | 
			
		||||
 | 
			
		||||
`enterPictureInPicture()`
 | 
			
		||||
 | 
			
		||||
To use this feature on Android with Expo, you must set 'enableAndroidPictureInPicture' true within expo plugin config (app.json)
 | 
			
		||||
 | 
			
		||||
```json
 | 
			
		||||
  "plugins": [
 | 
			
		||||
    [
 | 
			
		||||
      "react-native-video",
 | 
			
		||||
      {
 | 
			
		||||
        "enableAndroidPictureInPicture": true,
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  ]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
To use this feature on Android with Bare React Native, you must:
 | 
			
		||||
 | 
			
		||||
- [Declare PiP support](https://developer.android.com/develop/ui/views/picture-in-picture#declaring) in your AndroidManifest.xml
 | 
			
		||||
- setting `android:supportsPictureInPicture` to `true`
 | 
			
		||||
 | 
			
		||||
```xml
 | 
			
		||||
<activity
 | 
			
		||||
  android:name=".MainActivity"
 | 
			
		||||
  ...
 | 
			
		||||
  android:supportsPictureInPicture="true">
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
NOTE: Foreground picture in picture is not supported on Android due to limitations of react native (Single Activity App). So, If you call `enterPictureInPicture`, application will switch to background on Android.
 | 
			
		||||
NOTE: Video ads cannot start when you are using the PIP on iOS (more info available at [Google IMA SDK Docs](https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/picture_in_picture?hl=en#starting_ads)). If you are using custom controls, you must hide your PIP button when you receive the `STARTED` event from `onReceiveAdEvent` and show it again when you receive the `ALL_ADS_COMPLETED` event.
 | 
			
		||||
 | 
			
		||||
### `exitPictureInPicture`
 | 
			
		||||
 | 
			
		||||
<PlatformsList types={['Android', 'iOS']} />
 | 
			
		||||
 | 
			
		||||
`exitPictureInPicture()`
 | 
			
		||||
 | 
			
		||||
Exits the active picture in picture; if it is not active, the function call is ignored.
 | 
			
		||||
 | 
			
		||||
### `restoreUserInterfaceForPictureInPictureStopCompleted`
 | 
			
		||||
 | 
			
		||||
<PlatformsList types={['iOS']} />
 | 
			
		||||
 | 
			
		||||
`restoreUserInterfaceForPictureInPictureStopCompleted(restored)`
 | 
			
		||||
 | 
			
		||||
This function corresponds to the completion handler in Apple's [restoreUserInterfaceForPictureInPictureStop](https://developer.apple.com/documentation/avkit/avpictureinpicturecontrollerdelegate/1614703-pictureinpicturecontroller?language=objc). IMPORTANT: This function must be called after `onRestoreUserInterfaceForPictureInPictureStop` is called.
 | 
			
		||||
 | 
			
		||||
### `seek`
 | 
			
		||||
 | 
			
		||||
<PlatformsList types={['All']} />
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user