mohe_native_player 1.10.21
mohe_native_player: ^1.10.21 copied to clipboard
A Flutter native video player plugin for iOS and Android with full-featured controls, HLS/DASH support, danmaku, DLNA casting, PiP, and more.
1.10.21 #
- fix(ios): prevent short-drama playback from auto-entering PiP after PiP is disabled and the app goes to background.
1.10.20 #
- fix(ios): preserve Flutter-hidden native control bar state when entering landscape fullscreen, preventing duplicate progress bars when Flutter renders its own controls.
1.10.19 #
- fix(ios): hide the portrait back button during fullscreen so it no longer duplicates the landscape control-bar back button.
- fix(ios): refresh
mediaInfowhenpresentationSizearrives afterreadyToPlay, and reset stale media metadata during engine/video switches. - fix(android): show cellular generation text next to the landscape status-bar cellular icon.
1.10.18 #
- fix(ios): restore the
mediaInfoevent after sync overwrite. - fix(ios): reset
mediaInfoon VLC fallback and guardvlcAdapterReadyToPlayhandling. - sync(ios): update bundled iLookPlayerCore to ilook-ios-player v1.0.497.
1.10.17 #
- fix(android): remove the duplicated
ShortDramaImmersiveCoordinator.forceRestore(Activity)method somohe_native_playercompiles on Android.
1.10.16 #
- fix(android):
restoreSystemUInow callsShortDramaImmersiveCoordinator.forceRestore()to unconditionally reset immersive state and restore system bars, preventing permanent status-bar hide when refCount is imbalanced. - fix(ios): default
isPiPEnabledtoYES, aligning with native player defaults. - fix(ios): detect
AVPlayerItemStatusFailedinrecoverFromBackgroundIfNeededand escalate torecoverAfterLongBackground(replaceCurrentItem) so a background-failed item no longer blocks recovery. - feat(ios): add
isLayerReadyForDisplayproperty toFFmpegDecryptPlayer/DecryptFileAVPlayerfor callers to detect AVPlayer render channel health after background.
1.10.13 #
- fix(ios): add instance guards to all VLC/FFmpeg delegate callbacks — prevents stale engine instances from firing error events, corrupting seek/loading UI state, or leaking CMSampleBuffers on engine switch.
1.10.12 #
- feat(ios): add
mediaInfoevent (fires once when both duration and video size are available), aligning with Android behavior. All three engines (FFmpeg / AVPlayer / VLC) supported. - feat(ios): PiP handoff session — preserves background playback state across episode switches during PiP, fixing black-screen freeze on
didStopPictureInPicture. - feat(ios):
recoverAfterLongBackgroundusesreplaceCurrentItemWithPlayerItemto rebuild the RemoteXPC render channel after long background/PiP. - fix(ios): memory-warning handler now only evicts paused instances, preserving playing and stalling instances.
- fix(ios): stall recovery re-applies user playback rate via
playbackLikelyToKeepUpKVO. - fix(ios):
lockcompleteduplicate-fire guard; volume KVO dedup for multi-instance short-drama. - feat(ios/android):
PlayerController.restoreSystemUI()— restore system bars after exiting short-drama immersive mode (Android functional; iOS no-op). - fix(dart): commands issued before the platform channel is ready are now queued and flushed automatically, eliminating initialization race conditions.
1.10.11 #
- fix(android): fix PiP aspect ratio flash and incorrect view restore on Samsung One UI.
setPictureInPictureParams()now only fires for the active PiP player; layout restore always usesMATCH_PARENTso the view fills the container regardless of when reparenting occurred.
1.10.10 #
- fix(android): drama videos rendered shrunk inside landscape PiP on certain OEM ROMs (Flutter HC
PlatformViewWrapperrebounding inline-mode layout params beforeTextureViewcould push the correct frame). Proactively re-assertMATCH_PARENTlayout params across multiple frames after reparenting, and force PiP-modeonMeasureto honor the parent container size regardless of explicit-pixel layout params. - feat(android): add
PlayerController.restoreSystemUI()API. Exiting short-drama immersive no longer auto-restores system bars — the host app should now callrestoreSystemUI()explicitly after popping the short-drama route. View destroy still emergency-restores when this view is the last immersive holder. - feat(ios): lock-screen / control-center "Now Playing" card via
MPNowPlayingInfoCenter+MPRemoteCommandCenter. New RPCssetNowPlayingEnabled/setCoverImage; default enabled. iOS-only feature.
1.10.9 #
- fix: unify list-style episode selection with
episodeselectand remove the legacy list-item event path. - fix(android): add PiP play/pause action state handling and resume an existing PiP player after screen-off recovery.
1.10.8 #
- fix(android): start the localhost HLS server when an existing encrypted HLS cache is hit, so cached short-drama playback uses the local
index.m3u8directly instead of falling back to the legacy MP4 path.
1.10.7 #
- feat(android): implement runtime
PlayerController.setFitMode(...), allowing contain/cover switches without rebuilding the platform view. - feat(android): emit a one-shot
mediaInfoevent after duration and video size are both available.
1.10.6 #
- fix(android): report encrypted HLS source duration as soon as FFmpeg discovers it, so Flutter can receive the short-drama total duration before HLS remuxing finishes.
- fix(android): only auto-enter PiP after an explicit user-leave signal, while screen-off/background stops pause playback instead.
1.10.5 #
- fix(android): ignore provisional HLS live-window duration until the real VOD duration is known, preventing short-drama progress jumps and premature next-episode switching on slow networks.
- fix(android): hand off the PiP video owner when short-drama auto-play moves to the next episode, so PiP continues showing the video instead of the whole Activity.
1.10.4 #
- feat(android): fire
videosizechangeevent to Flutter when first valid video size arrives, matching iOS. Detail payload{width, height}. Subscribers receive it viaPlayerController.eventStream.
1.10.3 #
- fix(android): ship consumer ProGuard rules so JNI-resolved methods on
OkHttpStreamingIOandFFmpegHlsRemuxer$CancelChecker / $ProgressListenersurvive host R8/minify. Without this, host apps withminifyEnabled truecrash on entering encrypted HLS playback withjava.lang.NoSuchMethodError: no non-static method "...readBytes([BI)I".
1.10.2 #
- feat: expose
PlayerController.getCurrentVideoDisplayInfo()for native video display metadata. - fix(ios): sync native player core updates for encrypted playback, fullscreen cleanup, PiP state, and initial seek handling.
- fix(android): align FFmpeg HLS remux bridge with the updated decrypt core callback signature.
1.10.1 #
- fix(android): notify the encrypted player of the first rendered frame when playback enters
PLAYING.
1.10.0 #
- feat(android): add encrypted HLS streaming playback with FFmpeg remuxing and local segment serving.
- feat(android): enable MP4/MPEG-TS/HLS muxer support in bundled FFmpeg libraries.
- fix(android): harden FFmpeg/JNI, streaming I/O, local HTTP server, and memory-pressure handling for playback stability.
1.9.0 #
- feat(ios): add HLS streaming preload support for encrypted playback.
- fix(flutter): clean up fullscreen gesture overlay analyzer issues before release.
1.8.1 #
- fix(android):
PlayerPlatformView.disposenow callsrestoreFromPiPto prevent PiP window leak on view destroy. - fix(android): immersive short drama mode — fix top status bar black strip on OnePlus / ColorOS devices.
- fix(android): landscape pause ad → portrait transition —
hideAllSelectorsno longer callsremoveAllViews, preventing layout disappear. - fix(android): prevent
MPEG4WriterFORTIFY abort — add Annex-B structure validation before writing. - fix(android): fix
DFEncryptedPlayerresource leak —shutdownnow enforces main-thread dispatch.
1.8.0 #
- feat: add
PlayerController.setFitMode(PlayerFitMode)— switch fill mode at runtime without rebuilding the widget. - feat(ios): fire
videosizechangeevent with{width, height}on video ready and VLC video size change. - feat(ios): ad mode now allows
videosizechangeevent through (previously blocked). - fix(android): danmaku settings panel — SeekBar thumb clipped on landscape; add padding equal to thumb radius and disable
clipChildrenon parent containers; addWindowInsetslistener for display cutout / waterfall right safe-inset. - chore(ios): bump
ILOOK_PLAYER_VERSIONto1.0.359.
1.7.0 #
- feat: add
PlayerFitModeenum (contain/cover) andPlayerView.fitModeparameter — passed viacreationParamsto native layer; cover = fill screen (short drama), contain = letterbox (default). - feat(ios): sync native core to v1.0.348 —
isHostFlutterflag blocks shortDrama auto-fullscreen black screen;setupViewWithFrame:attributes:dispatchescreationParamsfit-mode tosetFitMode:. - feat(ios):
FullscreenManagerenhancements for Flutter hosting — suppresses auto-rotate onisHostFlutter, correct safe-area handling inFullscreenPlayerViewController. - feat(android):
setPlayerMode(shortDrama)enters immersive fullscreen (hides status/nav bar, addsKEEP_SCREEN_ON);ShortDramaImmersiveCoordinatoruses activity-level ref counting so multiplePlayerViewinstances cooperate. - feat(android):
creationParamsfit-modemapped toCENTER_CROP(cover) orFIT_CENTER(contain) onTextureView.
1.6.0 #
- feat: add
PlayerPreload/PreloadRequestDart API — priority-based video preload withpreload,cancel,cancelExcept,configure,shutdownAllPlayers. - feat(android): add
ILookPreloadManager/ILookPreloadTask/ILookCacheKey— Android preload system aligned with iOS, with disk cache, priority queue, and inflight preemption. - feat(android):
PlayerPluginadds plugin-levelglobalChannelforshutdownAllPlayers,preloadVideos,cancelPreload,cancelPreloadExcept,configurePreload. - feat(android):
DFEncryptedPlayeradd full lifecycle —setDataSource,prepare,start,pause,stop,seekTo,getState,getDuration,getCurrentPosition. - fix(android):
FFDecryptMuxerstability improvements.
1.5.1 #
- feat(ios): sync ILookPlayerCore to v1.0.322 — enable FFmpeg Class Cluster (auto-routes to
DecryptFileAVPlayer), add offline-encryption engine (DFEnc*/DFURLSessionSourceDownloader/FFVideoPacketQueue). - feat:
playWithAdsadds optionallandingUrlparameter for "了解详情" ad tap-through. - feat: expose
shutdownAllPlayersvia global Flutter channel for batch player cleanup. - fix(android): add
setControlBarVisiblesupport on Android to align with iOS v1.4.0 — fixesMissingPluginExceptionthat broke short-drama playback.
1.5.1 #
- feat: add
setBarrageSettings({displayAreaRatio, opacity, fontSize, speedLevel})— batch configure danmaku display parameters in one call. - feat: add
setPiPEnabled(bool)— enable or disable PiP at runtime. - feat(ios): new
ILookPreloadManager/ILookPreloadTask— priority-based video preload system with configurable concurrency and disk cache limit. - feat(ios): expose preload API via Flutter plugin channel (
preloadVideos,cancelPreload,cancelPreloadExcept,configurePreload). - chore(ios): bump
ILOOK_PLAYER_VERSIONto1.0.330.
1.4.0 #
- feat: add
setControlBarVisible(bool)— show/hide the control bar (play/pause, progress, etc.). When hidden, tap gestures will not reveal controls. - feat(ios):
PlayerUIManagerrespectscontrolBarHiddenin bothshowControlsWithAutoHideandtoggleLandscapeControls. - feat(ios): add
methodSignatureForSelector/forwardInvocationguard inTestComponentto prevent crashes when a native method is missing after sync.sh.
1.3.3 #
- fix(ios/pip): align PiP lifecycle with original uni-app implementation to fix double-video on background.
- Remove manual
startPictureInPictureinsceneWillDeactivate(app still visible). applicationWillResignActiveonly setsisPiPStartPendingflag.applicationDidEnterBackgroundstarts AVPlayer PiP manually.- SampleBuffer PiP (VLC/FFmpeg) relies on system
canStartPictureInPictureAutomaticallyFromInline. - Add
isPiPStartPendingguard, pause protection, andfailedToStartfallback.
- Remove manual
1.3.2 #
- fix(ios/pip): disable
canStartPictureInPictureAutomaticallyFromInlinefor AVPlayer PiP to prevent double-video during app switch animation; SampleBuffer PiP still uses auto-start as required. - fix(ios/pip): add FFmpeg player path to
isBufferingandseekableTimeRangesPiP delegate callbacks. - fix(ios/pip): fix PiP
setPlayingdelegate to handle VLC, FFmpeg, and no-player cases independently. - chore(ios): comment out verbose
[BarrageSpeed]debug NSLogs in BarrageManager, BarrageRenderer, and BarrageScheduler.
1.3.1 #
- chore(ios): clarify
gravityRotationAllowednaming comment to explain why it differs from the exportedsetGravityRotationEnabled:method name.
1.3.0 #
- feat:
PlayerViewnow accepts amodeparameter (PlayerMode.normal/PlayerMode.shortDrama). In short drama mode, Flutter gesture recognizers are not registered so outerPageViewcan handle vertical swipes natively. - feat(ios): short drama mode disables double-tap and long-press gestures to prevent
UITapGestureRecognizer.delaysTouchesEndedfrom blocking Flutter'sVerticalDragGestureRecognizer. - fix(ios): gravity rotation no longer starts automatically on player init — must be explicitly enabled via
setGravityRotationEnabled(true). - fix(ios): reset motion manager orientation state on stop to prevent stale landscape/portrait state on next start.
1.2.1 #
- fix(ios): back button hidden state was being reset by internal UI refresh — add
portraitBackButtonHiddenproperty and respect user override acrossshowControlsand fullscreen transitions. - fix(android): align Android short drama mode with iOS —
setPlayerMode(SHORT_DRAMA)now hides back button by default; explicitsetPortraitBackButtonVisiblecalls take priority over mode defaults.
1.2.0 #
- feat: add
playerMode(normal / shortDrama) — short drama mode disables mid-video pan gestures. - feat: add
backButtonInsets— customize portrait back button position to avoid Dynamic Island. - feat: add
seekToSeconds— precise seek for both normal and short drama modes. - fix: sync adMode priority fix — ad mode now takes precedence over shortDrama, keeping pan gesture enabled during ads.
- feat(android): add
playerMode,backButtonInsets, andseekToSecondssupport on Android.
1.1.1 #
- Fix: restore gravity rotation detection —
startDeviceMotionUpdatesToQueuewas accidentally commented out, causing auto-rotation to stop working. - Fix: add
setGravityRotationEnabledandsetPortraitBackButtonVisiblebridge methods to iOS Flutter bridge.
1.0.1 #
- Add missing Android entry point:
PlayerPlugin.java,AndroidManifest.xml. - Add full Android Java sources: managers, views, models, utils, DanmakuFlameMaster library.
1.0.0 #
- Rename package from
nova_native_playertomohe_native_player. - Fix unused field, unused method, and unnecessary import warnings.
0.0.1 #
- Initial release.
- Native video player for iOS and Android.
- HLS/DASH streaming support.
- Full playback controls, danmaku, DLNA, PiP, fullscreen.