Playing a video in VideoDetailFragment and rotating the screen to landscape (back and forth more often)
can trigger this error message. Especially if rotation for whatever reason takes long or
playing a high resolution (1080p) video.
The underlying logcat error messages:
05-12 16:38:38.251 24920 26037 E Surface : getSlotFromBufferLocked: unknown buffer: 0x923fc810
05-12 16:38:38.251 24920 26037 W ACodec : [OMX.qcom.video.decoder.avc] can not return buffer 35 to native window
The problem is that that Exoplayer is trying to write to our -- during rotation -- no longer existant
(VideoDetailFragment) SurfaceView.
Solution:
Implementing SurfaceHolder.Callback and using DummySurface we can now handle the lifecycle of the Surface.
How?: In case we are no longer able to write to the Surface eg. through rotation/putting in
background we can set a DummySurface. Although it only works on API >= 23.
Result: we get a little video interruption (audio is still fine) but we won't get the
'Unrecoverable player error occurred' error message.
This implementation is based on and more background information:
'ExoPlayer stuck in buffering after re-adding the surface view a few time 2703'
-> exoplayer fix suggestion link
https://github.com/google/ExoPlayer/issues/2703#issuecomment-300599981
- bugfix: have ServiceConnection created only once!
- select the context within the PlayerHolder to start, stop, bind or unbind the service
-> we have to make sure the Service is started AND stopped within the same context
-> so let PlayerHolder be the one to select the context
- remove removeListener() and replace the call with setListener(null)
- Compatibility: use ContextCompat.startForegroundService instead of startService()
instead use service.stopService() which inturn calls stopSelf() and
triggers hopefully onDestroy() to be called. Eventually we have to make
sure that all ServiceConnections are closed to successfully stop the service
now!
Cleanup within stopService() and not only onDestroy()
So we make sure that all listeners can react to onServiceStopped()
and close their ServiceConnections. Afterwards the android framework
is ready to stop the Service.
Rename URLHandler and KoreUtil classes to InternalUrlsHandler and KoreUtils.
Move InternalUrlsHandler, KoreUtils, TextLinkfier, ShareUtils classes to external_communication subpackage.
Remove unused param showPreviewText in shareText method of ShareUtils class.
Add initial work to be able to display an image preview of the content shared (not for downloads).
Use a better regular expression to parse timestamps in plain text descriptions.
- Add early return for invalid sizes to shuffle
- Rename variables to be more descriptive
- Refactor moving list element, removing unnecessary operations
- Unwrap if clause for adding to history because the condition is
guaranteed by the guard clause
- Inline the value 0 for the ReorderEvent
- Update documentation to reflect new changes
Original did not cover the case of when streams is empty and
documentation does not specify any input restrictions.
There's an ambiguity with broadcasting an event between the
documentation and the actual code (see TODO).