diff --git a/src/org/thialfihar/android/apg/Apg.java b/src/org/thialfihar/android/apg/Apg.java index bc21487fa..e290a501e 100644 --- a/src/org/thialfihar/android/apg/Apg.java +++ b/src/org/thialfihar/android/apg/Apg.java @@ -1527,7 +1527,8 @@ public class Apg { } public static Bundle decrypt(Context context, - InputStream inStream, OutputStream outStream, + PositionAwareInputStream inStream, OutputStream outStream, + long dataLength, String passPhrase, ProgressDialogUpdater progress, boolean assumeSymmetric) throws IOException, GeneralException, PGPException, SignatureException { @@ -1685,6 +1686,7 @@ public class Apg { } int n = 0; int done = 0; + long startPos = inStream.position(); while ((n = dataIn.read(buffer)) > 0) { out.write(buffer, 0, n); done += n; @@ -1698,6 +1700,12 @@ public class Apg { } // unknown size, but try to at least have a moving, slowing down progress bar currentProgress = startProgress + (endProgress - startProgress) * done / (done + 100000); + if (dataLength - startPos == 0) { + currentProgress = endProgress; + } else { + currentProgress = (int)(startProgress + (endProgress - startProgress) * + (inStream.position() - startPos) / (dataLength - startPos)); + } progress.setProgress(currentProgress, 100); } diff --git a/src/org/thialfihar/android/apg/DecryptActivity.java b/src/org/thialfihar/android/apg/DecryptActivity.java index b34bbba49..7e31e5f90 100644 --- a/src/org/thialfihar/android/apg/DecryptActivity.java +++ b/src/org/thialfihar/android/apg/DecryptActivity.java @@ -436,21 +436,26 @@ public class DecryptActivity extends BaseActivity { Message msg = new Message(); try { - InputStream in = null; + PositionAwareInputStream in = null; OutputStream out = null; + long size = 0; + if (mDecryptTarget == Id.target.message) { String messageData = mMessage.getText().toString(); - in = new ByteArrayInputStream(messageData.getBytes()); + in = new PositionAwareInputStream(new ByteArrayInputStream(messageData.getBytes())); out = new ByteArrayOutputStream(); + size = messageData.getBytes().length; } else { - in = new FileInputStream(mInputFilename); + in = new PositionAwareInputStream(new FileInputStream(mInputFilename)); out = new FileOutputStream(mOutputFilename); + File file = new File(mInputFilename); + size = file.length(); } if (mSignedOnly) { data = Apg.verifyText(this, in, out, this); } else { - data = Apg.decrypt(this, in, out, Apg.getCachedPassPhrase(getSecretKeyId()), + data = Apg.decrypt(this, in, out, size, Apg.getCachedPassPhrase(getSecretKeyId()), this, mAssumeSymmetricEncryption); } diff --git a/src/org/thialfihar/android/apg/PositionAwareInputStream.java b/src/org/thialfihar/android/apg/PositionAwareInputStream.java new file mode 100644 index 000000000..661e053f2 --- /dev/null +++ b/src/org/thialfihar/android/apg/PositionAwareInputStream.java @@ -0,0 +1,67 @@ +package org.thialfihar.android.apg; + +import java.io.IOException; +import java.io.InputStream; + +public class PositionAwareInputStream extends InputStream { + private InputStream mStream; + private long mPosition; + + public PositionAwareInputStream(InputStream in) { + mStream = in; + mPosition = 0; + } + + @Override + public int read() throws IOException { + int ch = mStream.read(); + ++mPosition; + return ch; + } + + @Override + public int available() throws IOException { + return mStream.available(); + } + + @Override + public void close() throws IOException { + mStream.close(); + } + + @Override + public boolean markSupported() { + return false; + } + + @Override + public int read(byte[] b) throws IOException { + int result = mStream.read(b); + mPosition += result; + return result; + } + + @Override + public int read(byte[] b, int offset, int length) throws IOException { + int result = mStream.read(b, offset, length); + mPosition += result; + return result; + } + + @Override + public synchronized void reset() throws IOException { + mStream.reset(); + mPosition = 0; + } + + @Override + public long skip(long n) throws IOException { + long result = mStream.skip(n); + mPosition += result; + return result; + } + + public long position() { + return mPosition; + } +}