removing the listener doesnt seem like the proper way to ensure it is only called once.

Just do 'mFirstFrameArrived = false;' in ctor.

Then here

if (!mFirstFrameArrived && mCurrentContentView && mCurrentContentView.isReadyForSnapshot()) {
    mFirstFrameArrived = true;
    if (mFirstRenderedFrameListener != null)
        mFirstRenderedFrameListener.onFirstFrameArrived();
}

Then you can even do this in the 

public void registerFirstRenderedFrameListener(FirstRenderedFrameListener listener) {
    mFirstRenderedFrameListener = listener;
    if (mFirstFrameArrived)
         mFirstRenderedFrameListener.onFirstFrameArrived();
}