summaryrefslogtreecommitdiff
path: root/platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java
diff options
context:
space:
mode:
authorPaul Gardiner <paulg.artifex@glidos.net>2013-08-27 14:49:15 +0100
committerPaul Gardiner <paulg.artifex@glidos.net>2013-08-27 14:49:15 +0100
commitdca49ac644409e9bed09812e03977e649519f5d7 (patch)
tree70c894021aa35b42fd075be7d3e041c14acc11b5 /platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java
parentcf3ba3e213ce17bee76fa2fe02b43d5d3cc60732 (diff)
downloadmupdf-dca49ac644409e9bed09812e03977e649519f5d7.tar.xz
Android: support signing
Diffstat (limited to 'platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java')
-rw-r--r--platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java109
1 files changed, 102 insertions, 7 deletions
diff --git a/platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java b/platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java
index 2cb3974b..774aafb7 100644
--- a/platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java
+++ b/platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java
@@ -10,10 +10,20 @@ import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.RectF;
+import android.net.Uri;
+import android.text.method.PasswordTransformationMethod;
import android.view.LayoutInflater;
import android.view.WindowManager;
+import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
+/* This enum should be kept in line with the cooresponding C enum in mupdf.c */
+enum SignatureState {
+ NoSupport,
+ Unsigned,
+ Signed
+}
+
abstract class PassClickResultVisitor {
public abstract void visitText(PassClickResultText result);
public abstract void visitChoice(PassClickResultChoice result);
@@ -60,11 +70,11 @@ class PassClickResultChoice extends PassClickResult {
}
class PassClickResultSignature extends PassClickResult {
- public final boolean isSigned;
+ public final SignatureState state;
- public PassClickResultSignature(boolean _changed, boolean _isSigned) {
+ public PassClickResultSignature(boolean _changed, int _state) {
super(_changed);
- isSigned = _isSigned;
+ state = SignatureState.values()[_state];
}
public void acceptVisitor(PassClickResultVisitor visitor) {
@@ -73,6 +83,7 @@ class PassClickResultSignature extends PassClickResult {
}
public class MuPDFPageView extends PageView implements MuPDFView {
+ final private FilePickerSupport mFilePickerSupport;
private final MuPDFCore mCore;
private AsyncTask<Void,Void,PassClickResult> mPassClick;
private RectF mWidgetAreas[];
@@ -84,7 +95,10 @@ public class MuPDFPageView extends PageView implements MuPDFView {
private AlertDialog.Builder mChoiceEntryBuilder;
private AlertDialog.Builder mSigningDialogBuilder;
private AlertDialog.Builder mSignatureReportBuilder;
+ private AlertDialog.Builder mPasswordEntryBuilder;
+ private EditText mPasswordText;
private AlertDialog mTextEntry;
+ private AlertDialog mPasswordEntry;
private EditText mEditText;
private AsyncTask<String,Void,Boolean> mSetWidgetText;
private AsyncTask<String,Void,Void> mSetWidgetChoice;
@@ -92,10 +106,12 @@ public class MuPDFPageView extends PageView implements MuPDFView {
private AsyncTask<PointF[][],Void,Void> mAddInk;
private AsyncTask<Integer,Void,Void> mDeleteAnnotation;
private AsyncTask<Void,Void,String> mCheckSignature;
+ private AsyncTask<Void,Void,Boolean> mSign;
private Runnable changeReporter;
- public MuPDFPageView(Context c, MuPDFCore core, Point parentSize) {
+ public MuPDFPageView(Context c, FilePickerSupport filePickerSupport, MuPDFCore core, Point parentSize) {
super(c, parentSize);
+ mFilePickerSupport = filePickerSupport;
mCore = core;
mTextEntryBuilder = new AlertDialog.Builder(c);
mTextEntryBuilder.setTitle(getContext().getString(R.string.fill_out_text_field));
@@ -137,8 +153,21 @@ public class MuPDFPageView extends PageView implements MuPDFView {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
+ });
+ mSigningDialogBuilder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ FilePicker picker = new FilePicker(mFilePickerSupport) {
+ @Override
+ void onPick(Uri uri) {
+ signWithKeyFile(uri);
+ }
+ };
+ picker.pick();
+ }
});
+
mSignatureReportBuilder = new AlertDialog.Builder(c);
mSignatureReportBuilder.setTitle("Signature checked");
mSignatureReportBuilder.setPositiveButton(R.string.okay, new DialogInterface.OnClickListener() {
@@ -147,6 +176,59 @@ public class MuPDFPageView extends PageView implements MuPDFView {
dialog.dismiss();
}
});
+
+ mPasswordText = new EditText(c);
+ mPasswordText.setInputType(EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);
+ mPasswordText.setTransformationMethod(new PasswordTransformationMethod());
+
+ mPasswordEntryBuilder = new AlertDialog.Builder(c);
+ mPasswordEntryBuilder.setTitle(R.string.enter_password);
+ mPasswordEntryBuilder.setView(mPasswordText);
+ mPasswordEntryBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ });
+
+ mPasswordEntry = mPasswordEntryBuilder.create();
+ }
+
+ private void signWithKeyFile(final Uri uri) {
+ mPasswordEntry.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+ mPasswordEntry.setButton(AlertDialog.BUTTON_POSITIVE, "Sign", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ signWithKeyFileAndPassword(uri, mPasswordText.getText().toString());
+ }
+ });
+
+ mPasswordEntry.show();
+ }
+
+ private void signWithKeyFileAndPassword(final Uri uri, final String password) {
+ mSign = new AsyncTask<Void,Void,Boolean>() {
+ @Override
+ protected Boolean doInBackground(Void... params) {
+ return mCore.signFocusedSignature(Uri.decode(uri.getEncodedPath()), password);
+ }
+ @Override
+ protected void onPostExecute(Boolean result) {
+ if (result)
+ {
+ changeReporter.run();
+ }
+ else
+ {
+ mPasswordText.setText("");
+ signWithKeyFile(uri);
+ }
+ }
+
+ };
+
+ mSign.execute();
}
public LinkInfo hitLink(float x, float y) {
@@ -217,6 +299,12 @@ public class MuPDFPageView extends PageView implements MuPDFView {
dialog.show();
}
+ private void warnNoSignatureSupport() {
+ AlertDialog dialog = mSignatureReportBuilder.create();
+ dialog.setTitle("App built with no signature support");
+ dialog.show();
+ }
+
public void setChangeReporter(Runnable reporter) {
changeReporter = reporter;
}
@@ -287,10 +375,17 @@ public class MuPDFPageView extends PageView implements MuPDFView {
@Override
public void visitSignature(PassClickResultSignature result) {
- if (result.isSigned)
- invokeSignatureCheckingDialog();
- else
+ switch (result.state) {
+ case NoSupport:
+ warnNoSignatureSupport();
+ break;
+ case Unsigned:
invokeSigningDialog();
+ break;
+ case Signed:
+ invokeSignatureCheckingDialog();
+ break;
+ }
}
});
}