From ff4d0c26b93dc963d41243c87b268f898458ccd4 Mon Sep 17 00:00:00 2001 From: Dominik Date: Mon, 11 Jun 2012 02:45:56 +0300 Subject: [PATCH] new qr code icon --- LICENSE | 4 +- Resources/barcode scanner icon.png | Bin 3731 -> 0 bytes Resources/dashboard_scan_qrcode_default.svg | 1679 ++++++++++++++-- Resources/dashboard_scan_qrcode_pressed.svg | 1698 +++++++++++++++++ .../dashboard_scan_qrcode_default.png | Bin 6370 -> 4241 bytes .../dashboard_scan_qrcode_pressed.png | Bin 6370 -> 4418 bytes .../android/apg/ui/EncryptActivity.java | 3 - .../android/apg/ui/MailListActivity.java | 33 +- .../android/apg/ui/MainActivity.java | 3 +- .../apg/ui/dialog/FileDialogFragment.java | 211 ++ 10 files changed, 3427 insertions(+), 204 deletions(-) delete mode 100644 Resources/barcode scanner icon.png create mode 100644 Resources/dashboard_scan_qrcode_pressed.svg create mode 100644 org_apg/src/org/thialfihar/android/apg/ui/dialog/FileDialogFragment.java diff --git a/LICENSE b/LICENSE index 703673a2a..bbf4af663 100644 --- a/LICENSE +++ b/LICENSE @@ -12,7 +12,6 @@ Images: * icon.svg modified version of kgpg_key2_kopete.svgz - GPL * dashboard_manage_keys.svg, dashboard_my_keys.svg, key.svg http://rrze-icon-set.berlios.de/ @@ -23,4 +22,5 @@ Images: Public Domain * dashboard_scan_qrcode.svg - Barcode Scanner App \ No newline at end of file + New creation for APG + Apache License v2 \ No newline at end of file diff --git a/Resources/barcode scanner icon.png b/Resources/barcode scanner icon.png deleted file mode 100644 index 5932aadeadca0d1b7f95cab8aecb1c46d6f63b57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3731 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 diff --git a/Resources/dashboard_scan_qrcode_default.svg b/Resources/dashboard_scan_qrcode_default.svg index 035fcde9a..bc49aa6a6 100644 --- a/Resources/dashboard_scan_qrcode_default.svg +++ b/Resources/dashboard_scan_qrcode_default.svg @@ -10,17 +10,17 @@ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="144" - height="96" - id="svg97" - sodipodi:version="0.32" - inkscape:version="0.48.1 r9760" - sodipodi:docname="dashboard_scan_qrcode_default.svg" - inkscape:export-filename="/home/ds1/Projekte/APG Plus/org_apg/res/drawable-hdpi/dashboard_encrypt_decrypt_file.png" - inkscape:export-xdpi="90.000000" - inkscape:export-ydpi="90.000000" + version="1.1" inkscape:output_extension="org.inkscape.output.svg.inkscape" - version="1.1"> + inkscape:export-ydpi="90.000000" + inkscape:export-xdpi="90.000000" + inkscape:export-filename="/home/ds1/Projekte/APG Plus/org_apg/res/drawable-hdpi/dashboard_encrypt_decrypt_file.png" + sodipodi:docname="dashboard_scan_qrcode_default.svg" + inkscape:version="0.48.3.1 r9886" + sodipodi:version="0.32" + id="svg97" + height="96" + width="144"> - - + inkscape:collect="always" + id="linearGradient5562"> + id="stop5564" /> + id="stop5566" /> + + + + + + + id="radialGradient5029" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /> + id="stop5050" /> + style="stop-color:#000000;stop-opacity:1;" /> + id="stop5052" /> + id="linearGradient5027" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /> + style="stop-color:#777777;stop-opacity:1.0000000;" /> + style="stop-color:#373737;stop-opacity:1.0000000;" /> + id="radialGradient8234" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9757092,0,0,2.1357067,113.40468,-78.777288)" + cx="8.824419" + cy="3.7561285" + fx="8.824419" + fy="3.7561285" + r="37.751713" /> + style="stop-color:#b7b7b7;stop-opacity:1.0000000;" /> + id="stop8238" /> + style="stop-color:#969696;stop-opacity:1;" /> + id="linearGradient8236" + x1="25.875" + y1="10.625" + x2="25.25" + y2="30.875" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.0404464,0,0,2.5277172,22.881231,-60.155005)" /> + inkscape:collect="always" + id="linearGradient13842"> + id="stop13844" /> + id="stop13846" /> + id="stop9768" /> + id="stop9770" /> + id="stop149" /> + id="stop150" /> + id="stop336" /> + id="stop337" /> + id="stop1790" /> + id="stop1791" /> + id="stop138" /> + id="stop139" /> - + - + + id="linearGradient158" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.9845528,0,0.14095216,1.39499,22.881231,-44.07507)" + x1="5.2657914" + y1="18.725863" + x2="8.212224" + y2="52.625851" /> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -322,26 +1643,30 @@ - + - + inkscape:groupmode="layer" + transform="translate(0,48)"> + + + inkscape:label="pattern" + transform="translate(0,48)" /> diff --git a/Resources/dashboard_scan_qrcode_pressed.svg b/Resources/dashboard_scan_qrcode_pressed.svg new file mode 100644 index 000000000..c1bd869ac --- /dev/null +++ b/Resources/dashboard_scan_qrcode_pressed.svg @@ -0,0 +1,1698 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + 2005-01-31 + + + Jakub Steiner + + + + http://jimmac.musichall.cz + Active state - when files are being dragged to. + + + Novell, Inc. + + + + + + + + + + + + + + + + + diff --git a/org_apg/res/drawable-hdpi/dashboard_scan_qrcode_default.png b/org_apg/res/drawable-hdpi/dashboard_scan_qrcode_default.png index 65323e3d0b822ea041b363d7abe22dae2a776a4c..632a8ce6242c8b30b807eb96a6506c40b580a113 100644 GIT binary patch delta 3901 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 {r94onylnE}jC9W_C{tn<;+O|EnP)1D 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 U7% messages = new Vector(); for (int j = 0; j < messageCursor.getCount(); ++j) { messageCursor.moveToPosition(j); @@ -139,13 +133,10 @@ public class MailListActivity extends ListActivity { data = null; } } - Message message = - new Message(conversation, - messageCursor.getLong(idIndex), - messageCursor.getString(subjectIndex), - messageCursor.getString(fromAddressIndex), - messageCursor.getString(replyToIndex), - data, signedOnly); + Message message = new Message(conversation, messageCursor.getLong(idIndex), + messageCursor.getString(subjectIndex), + messageCursor.getString(fromAddressIndex), + messageCursor.getString(replyToIndex), data, signedOnly); messages.add(message); mMessages.add(message); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java index ff888cd81..51cba35db 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java @@ -24,6 +24,7 @@ import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.R; import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.app.SherlockActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; @@ -35,7 +36,7 @@ import android.view.ContextMenu.ContextMenuInfo; import android.view.View; import android.widget.TextView; -public class MainActivity extends BaseActivity { +public class MainActivity extends SherlockActivity { static { Security.addProvider(new BouncyCastleProvider()); } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/dialog/FileDialogFragment.java b/org_apg/src/org/thialfihar/android/apg/ui/dialog/FileDialogFragment.java new file mode 100644 index 000000000..ff4052257 --- /dev/null +++ b/org_apg/src/org/thialfihar/android/apg/ui/dialog/FileDialogFragment.java @@ -0,0 +1,211 @@ +/* + * Copyright (C) 2012 Dominik Schürmann + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.thialfihar.android.apg.ui.dialog; + +import org.spongycastle.openpgp.PGPException; +import org.spongycastle.openpgp.PGPPrivateKey; +import org.spongycastle.openpgp.PGPSecretKey; +import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor; +import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; +import org.thialfihar.android.apg.Apg; +import org.thialfihar.android.apg.Apg.GeneralException; +import org.thialfihar.android.apg.Constants; +import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.R; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.os.Bundle; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; +import android.support.v4.app.DialogFragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +public class FileDialogFragment extends DialogFragment { + + private Messenger mMessenger; + + private static final String ARG_MESSENGER = "messenger"; + private static final String ARG_SECRET_KEY_ID = "secret_key_id"; + + public static final int MESSAGE_OKAY = 1; + + /** + * Instantiates new instance of this dialog fragment + * + */ + public static FileDialogFragment newInstance(long secretKeyId, Messenger messenger){ + FileDialogFragment frag = new FileDialogFragment(); + Bundle args = new Bundle(); + args.putLong(ARG_SECRET_KEY_ID, secretKeyId); + args.putParcelable(ARG_MESSENGER, messenger); + + frag.setArguments(args); + + return frag; + } + + /** + * Checks if key has a passphrase + * + * @param secretKeyId + * @return true if it has a passphrase + */ + private static boolean hasPassphrase(long secretKeyId) { + // check if the key has no passphrase + try { + PGPSecretKey secretKey = Apg.getMasterKey(Apg.getSecretKeyRing(secretKeyId)); + + Log.d(Constants.TAG, "Check if key has no passphrase..."); + PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider( + "SC").build("".toCharArray()); + PGPPrivateKey testKey = secretKey.extractPrivateKey(keyDecryptor); + if (testKey != null) { + Log.d(Constants.TAG, "Key has no passphrase! Caches empty passphrase!"); + + // cache empty passphrase + Apg.setCachedPassPhrase(secretKey.getKeyID(), ""); + + return false; + } + } catch (PGPException e) { + // silently catch + } + + return true; + } + + /** + * Creates dialog + */ + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Activity activity = getActivity(); + + long secretKeyId = getArguments().getLong(ARG_SECRET_KEY_ID); + mMessenger = getArguments().getParcelable(ARG_MESSENGER); + + AlertDialog.Builder alert = new AlertDialog.Builder(activity); + + alert.setTitle(R.string.title_authentication); + + final PGPSecretKey secretKey; + + if (secretKeyId == Id.key.symmetric || secretKeyId == Id.key.none) { + secretKey = null; + alert.setMessage(getString(R.string.passPhraseForSymmetricEncryption)); + } else { + secretKey = Apg.getMasterKey(Apg.getSecretKeyRing(secretKeyId)); + if (secretKey == null) { + alert.setTitle(R.string.title_keyNotFound); + alert.setMessage(getString(R.string.keyNotFound, secretKeyId)); + alert.setPositiveButton(android.R.string.ok, new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dismiss(); + } + }); + alert.setCancelable(false); + return alert.create(); + } + String userId = Apg.getMainUserIdSafe(activity, secretKey); + alert.setMessage(getString(R.string.passPhraseFor, userId)); + } + + LayoutInflater inflater = activity.getLayoutInflater(); + View view = inflater.inflate(R.layout.passphrase, null); + final EditText input = (EditText) view.findViewById(R.id.passphrase_passphrase); + + final TextView labelNotUsed = (TextView) view + .findViewById(R.id.passphrase_label_passphrase_again); + labelNotUsed.setVisibility(View.GONE); + final EditText inputNotUsed = (EditText) view + .findViewById(R.id.passphrase_passphrase_again); + inputNotUsed.setVisibility(View.GONE); + + alert.setView(view); + + alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dismiss(); + + String passPhrase = input.getText().toString(); + long keyId; + if (secretKey != null) { + try { + PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder() + .setProvider("SC").build(passPhrase.toCharArray()); + PGPPrivateKey testKey = secretKey.extractPrivateKey(keyDecryptor); + if (testKey == null) { + Toast.makeText(activity, R.string.error_couldNotExtractPrivateKey, + Toast.LENGTH_SHORT).show(); + return; + } + } catch (PGPException e) { + Toast.makeText(activity, R.string.wrongPassPhrase, Toast.LENGTH_SHORT) + .show(); + return; + } + keyId = secretKey.getKeyID(); + } else { + keyId = Id.key.symmetric; + } + + // cache the new passphrase + Log.d(Constants.TAG, "Everything okay! Caching entered passphrase"); + Apg.setCachedPassPhrase(keyId, passPhrase); + + sendMessageToHandler(MESSAGE_OKAY); + } + }); + + alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dismiss(); + } + }); + + return alert.create(); + } + + /** + * Send message back to handler which is initialized in a activity + * + * @param what + * Message integer you want to send + */ + private void sendMessageToHandler(Integer what) { + Message msg = Message.obtain(); + msg.what = what; + + try { + mMessenger.send(msg); + } catch (RemoteException e) { + Log.w(Constants.TAG, "Exception sending message, Is handler present?", e); + } catch (NullPointerException e) { + Log.w(Constants.TAG, "Messenger is null!", e); + } + } +} \ No newline at end of file