fix read(byte[] b, int off, int len)  method in FileInStream.java.

Method read(byte[] b, int off, int len) returns 0 when there is nothing left to read. It should return -1.
When "mCurrentPosition" is equal to "FILE_LENGTH" the while loop is skipped and "tLen" has the same value as "len", and this means that the return value will be always 0 when there is nothing left to read. This will cause an infinite loop.
The issue exists in all branches. I've made the fix and pull request here because I'm working with the release version for 5.0, but all the branches should get the fix.
I think that the while loop reads until EOF. If nothing is read than "tLen" is not modified and -1 can be returned at the end, but your solution work's in this case also. 

    while (tLen > 0 && mCurrentPosition < FILE_LENGTH) {
      checkAndAdvanceBlockInStream();

      int tRead = mCurrentBlockInStream.read(b, tOff, tLen);
      if (tRead == -1) {
        // mCurrentBlockInStream has reached its block boundary
        continue;
      }

      mCurrentPosition += tRead;
      mCurrentBlockLeft -= tRead;
      tLen -= tRead;
      tOff += tRead;
    }