If in the end there is no solution for both (gapless looping & ExoPlayer.Completed), in my opinion the ability for seamless looping would be much more important, because there is a simple work-around for the ExoPlayer.Completed event.
Here is a very good overview of the ExoPlayer and Player States:
