|
|
Строка 4: |
Строка 4: |
| | | |
| Для внешнего обращения из других приложений служит имя активити "org.gplvote.signdoc.DO_SIGN". Так-же в подписываемых документах параметр "site" должен быть прописан в виде "app:<идентификатор приложения>". | | Для внешнего обращения из других приложений служит имя активити "org.gplvote.signdoc.DO_SIGN". Так-же в подписываемых документах параметр "site" должен быть прописан в виде "app:<идентификатор приложения>". |
| + | |
| + | Для передачи команды служит Extra параметр "Command". Он может иметь следующие значения: "SignDoc", "ViewDoc", "SendConfirms" и "GetPublicKeyId". |
| | | |
| Для передачи массива с документами на подписание служит Extra параметр "DocsList", в который данный массив помещается в виде JSON. | | Для передачи массива с документами на подписание служит Extra параметр "DocsList", в который данный массив помещается в виде JSON. |
| | | |
− | Для передачи массива с подтверждениями об обработке служит тот-же Extra параметр "DocsList", но для указания на то, что список содержит только подтверждения об обработке, устанавливается еще и параметр "ConfirmMode" в значение "1". В этом случае обработка происходит без визуализации активити приложения "Sign Doc". | + | Для передачи массива с подтверждениями об обработке служит тот-же Extra параметр "DocsList", но для указания на то, что список содержит только подтверждения об обработке, устанавливается еще и параметр "Command" в значение "SendConfirms". В этом случае обработка происходит без визуализации активити приложения "Sign Doc". |
− | | + | |
− | ==== Пример обращения с запросом на подписание документа ====
| + | |
− | <pre>
| + | |
− | public class Doc {
| + | |
− | public String toJson() {
| + | |
− | Gson gson = new Gson();
| + | |
− | String json = gson.toJson(this);
| + | |
− | return(json);
| + | |
− | }
| + | |
− | }
| + | |
− | | + | |
− | public class DocSignRequest extends Doc {
| + | |
− | public String type = "SIGN_REQUEST";
| + | |
− | public String site;
| + | |
− | public String doc_id; // Внутренний (клиента) идентификатор документа
| + | |
− | public String user_key_id; // Идентификатор открытого ключа пользователя
| + | |
− | public String data; // Данные - это зашифрованный JSON массив строк
| + | |
− | public String dec_data; // Расшифрованные данные в строковом виде. Используются в коде, через сеть не передаются
| + | |
− | public String template; // Шаблон
| + | |
− | }
| + | |
− | | + | |
− | // Формируем массив из документов - запросов на подписание
| + | |
− | ArrayList<DocSignRequest> documents = new ArrayList<DocSignRequest>();
| + | |
− | | + | |
− | // Для примера в массив добавляется один документ
| + | |
− | | + | |
− | // Создание документа
| + | |
− | DocSignRequest sign_request = new DocSignRequest();
| + | |
− | | + | |
− | sign_request.site = "app:trust_net";
| + | |
− | sign_request.doc_id = genDocId();
| + | |
− | sign_request.dec_data = "['Данные trust net 1','Данные trust net 2']";
| + | |
− | sign_request.template = "LIST\nЗаголовок 1\nЗаголовок 2";
| + | |
− | | + | |
− | // Добавляем документ в массив
| + | |
− | documents.add(sign_request);
| + | |
− | | + | |
− | // Формируем Intent с привязкой к приложению "Sign Doc"
| + | |
− | Intent intent = new Intent("org.gplvote.signdoc.DO_SIGN", Uri.parse("signdoc://sign_array"));
| + | |
− | | + | |
− | Gson gson = new Gson();
| + | |
− | | + | |
− | // Передаем в экстра параметре список документов на подписание в виде JSON массива
| + | |
− | intent.putExtra("DocsList", gson.toJson(documents));
| + | |
− | | + | |
− | // Этот флаг указывает что подписание идет не с сервера, а из приложения
| + | |
− | intent.putExtra("LastRecvTime", "");
| + | |
− | | + | |
− | // Запускаем активити подписания документа из приложения "Sign Doc"
| + | |
− | startActivityForResult(intent, DO_SIGN_REQUEST);
| + | |
− | </pre>
| + | |
− | | + | |
− | Поле "site" должно иметь формат "app:<имя приложения, формирующего запрос на подписание>".
| + | |
− | | + | |
− | ==== Пример обработки возвращенного результата подписания и отправки подтверждения об обработке подписи ====
| + | |
− | <pre>
| + | |
− | public class DocSign extends Doc {
| + | |
− | public String type = "SIGN";
| + | |
− | public String site;
| + | |
− | public String doc_id; // Внутренний (клиента) идентификатор документа
| + | |
− | public String sign; // Подпись в Base64 для sha256(данные+шаблон)
| + | |
− | }
| + | |
− | | + | |
− | public class DocSignConfirm extends Doc {
| + | |
− | public String type = "SIGN_CONFIRM";
| + | |
− | public String site;
| + | |
− | public String doc_id; // Внутренний (клиента) идентификатор документа
| + | |
− | }
| + | |
− | | + | |
− | @Override
| + | |
− | protected void onActivityResult(int requestCode, int resultCode, Intent data) {
| + | |
− | if (data == null) {return;}
| + | |
− | | + | |
− | // Получаем JSON массив с подписями документов
| + | |
− | String json_signs = data.getStringExtra("SIGNS");
| + | |
− | | + | |
− | ArrayList<DocSign> documents;
| + | |
− | Gson gson = new Gson();
| + | |
− | | + | |
− | // Конвертируем JSON массив в массив java
| + | |
− | documents = gson.fromJson(json_signs, new TypeToken<ArrayList<DocSign>>(){}.getType());
| + | |
− | | + | |
− | // Создаем массив подтверждений обработки подписи для последующей отправки
| + | |
− | ArrayList<DocSignConfirm> confirms = new ArrayList<DocSignConfirm>();
| + | |
− | | + | |
− | // Перебираем все полученные подписи документов для обработки
| + | |
− | for(int i = 0; i < documents.size(); i++) {
| + | |
− | DocSign sign = documents.get(i);
| + | |
− | | + | |
− | // В этом месте должна располагаться обработка подписи документа вашим приложением
| + | |
− | // ...
| + | |
− | | + | |
− | // Формируем подтверждения об обработке
| + | |
− | DocSignConfirm doc_confirm = new DocSignConfirm();
| + | |
− | | + | |
− | doc_confirm.site = sign.site;
| + | |
− | doc_confirm.doc_id = sign.doc_id;
| + | |
− | | + | |
− | // Добавляем подтверждение об обработке в массив подтверждений
| + | |
− | confirms.add(doc_confirm);
| + | |
− | }
| + | |
− |
| + | |
− | // Если массив подтверждений об обработке подписей не пуст - отправляем его приложению "Sign Doc"
| + | |
− | if (confirms.size() > 0) {
| + | |
− | Intent intent = new Intent("org.gplvote.signdoc.DO_SIGN", Uri.parse("signdoc://sign_array"));
| + | |
− | intent.putExtra("DocsList", gson.toJson(confirms));
| + | |
− | | + | |
− | // Флаг "ConfirmMode" означает что передаются подтверждения о подписании из приложения
| + | |
− | // В этом режиме не производится вывод на экран активити из приложения "Sign Doc"
| + | |
− | intent.putExtra("ConfirmMode", "1");
| + | |
− | startActivity(intent);
| + | |
− | }
| + | |
− | }
| + | |
− | </pre>
| + | |
Приложение GPLVote Sign Doc может подписывать документы, которые ему будут предоставлять другие приложения, работающие на смартфоне. При этом документы сохраняются в истории приложения, но не отправляются на прокси сервера или сайты.
Для внешнего обращения из других приложений служит имя активити "org.gplvote.signdoc.DO_SIGN". Так-же в подписываемых документах параметр "site" должен быть прописан в виде "app:<идентификатор приложения>".
Для передачи команды служит Extra параметр "Command". Он может иметь следующие значения: "SignDoc", "ViewDoc", "SendConfirms" и "GetPublicKeyId".
Для передачи массива с документами на подписание служит Extra параметр "DocsList", в который данный массив помещается в виде JSON.
Для передачи массива с подтверждениями об обработке служит тот-же Extra параметр "DocsList", но для указания на то, что список содержит только подтверждения об обработке, устанавливается еще и параметр "Command" в значение "SendConfirms". В этом случае обработка происходит без визуализации активити приложения "Sign Doc".