diff options
author | Paul Gardiner <paulg.artifex@glidos.net> | 2013-08-27 14:49:15 +0100 |
---|---|---|
committer | Paul Gardiner <paulg.artifex@glidos.net> | 2013-08-27 14:49:15 +0100 |
commit | dca49ac644409e9bed09812e03977e649519f5d7 (patch) | |
tree | 70c894021aa35b42fd075be7d3e041c14acc11b5 /platform/android/src/com/artifex/mupdfdemo/MuPDFPageView.java | |
parent | cf3ba3e213ce17bee76fa2fe02b43d5d3cc60732 (diff) | |
download | mupdf-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.java | 109 |
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; + } } }); } |