From 1a33f4d886ce45596dd7f6dfc3356fe32ec71c1c Mon Sep 17 00:00:00 2001 From: Dominik Date: Thu, 12 Apr 2012 15:23:00 +0200 Subject: [PATCH] intent to create a new key --- org_apg/AndroidManifest.xml | 8 ++- org_apg/res/layout/edit_key.xml | 22 ------ org_apg/src/org/apg/Apg.java | 3 +- org_apg/src/org/apg/ui/DecryptActivity.java | 7 ++ org_apg/src/org/apg/ui/EditKeyActivity.java | 40 +++++++---- org_apg/src/org/apg/ui/EncryptActivity.java | 18 ++--- .../apg/ui/SelectPublicKeyListActivity.java | 1 + .../apg/ui/SelectSecretKeyListActivity.java | 1 + .../SelectPublicKeyListAdapter.java | 2 +- .../SelectSecretKeyListAdapter.java | 2 +- .../src/org/apg/ui/widget/UserIdEditor.java | 9 ++- .../libs/org_apg_integration_lib.jar | Bin 8258 -> 0 bytes org_apg_integration_demo/project.properties | 1 + .../res/layout/intent_demo.xml | 7 ++ .../org/apg/api_demo/IntentDemoActivity.java | 5 ++ .../org/apg/integration/ApgIntentHelper.java | 68 +++++++++++++++--- .../src/org/apg/integration/Constants.java | 3 + 17 files changed, 139 insertions(+), 58 deletions(-) rename org_apg/src/org/apg/ui/{ => widget}/SelectPublicKeyListAdapter.java (99%) rename org_apg/src/org/apg/ui/{ => widget}/SelectSecretKeyListAdapter.java (99%) delete mode 100644 org_apg_integration_demo/libs/org_apg_integration_lib.jar diff --git a/org_apg/AndroidManifest.xml b/org_apg/AndroidManifest.xml index 2f250ae1a..60c76079b 100644 --- a/org_apg/AndroidManifest.xml +++ b/org_apg/AndroidManifest.xml @@ -75,7 +75,13 @@ android:name=".ui.EditKeyActivity" android:configChanges="keyboardHidden|orientation|keyboard" android:label="@string/title_editKey" - android:uiOptions="splitActionBarWhenNarrow" /> + android:uiOptions="splitActionBarWhenNarrow" > + + + + + + - - - - - - - - - - - - - - - - - - - - - - diff --git a/org_apg/src/org/apg/Apg.java b/org_apg/src/org/apg/Apg.java index e3a2b5eb8..dbe60e65e 100644 --- a/org_apg/src/org/apg/Apg.java +++ b/org_apg/src/org/apg/Apg.java @@ -125,6 +125,7 @@ public class Apg { public static final String GENERATE_SIGNATURE = "org.apg.intent.GENERATE_SIGNATURE"; public static final String EXPORT_KEY_TO_SERVER = "org.apg.intent.EXPORT_KEY_TO_SERVER"; public static final String IMPORT_FROM_QR_CODE = "org.apg.intent.IMPORT_FROM_QR_CODE"; + public static final String EDIT_KEY = "org.apg.intent.EDIT_KEY"; } public static final String EXTRA_TEXT = "text"; @@ -153,7 +154,7 @@ public class Apg { public static final String EXTRA_ASCII_ARMOUR = "asciiArmour"; public static final String EXTRA_BINARY = "binary"; public static final String EXTRA_KEY_SERVERS = "keyServers"; - public static final String EXTRA_EXPECTED_FINGERPRINT = "org.apg.EXPECTED_FINGERPRINT"; + public static final String EXTRA_EXPECTED_FINGERPRINT = "expectedFingerprint"; public static final String AUTHORITY = DataProvider.AUTHORITY; diff --git a/org_apg/src/org/apg/ui/DecryptActivity.java b/org_apg/src/org/apg/ui/DecryptActivity.java index 53df18867..b1726194b 100644 --- a/org_apg/src/org/apg/ui/DecryptActivity.java +++ b/org_apg/src/org/apg/ui/DecryptActivity.java @@ -31,6 +31,7 @@ import org.spongycastle.openpgp.PGPException; import org.spongycastle.openpgp.PGPPublicKeyRing; import org.apg.R; +import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; @@ -249,6 +250,12 @@ public class DecryptActivity extends BaseActivity { Log.d(Constants.TAG, "got extras"); } + // disable home button on actionbar because this activity is run from another app + final ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayShowTitleEnabled(true); + actionBar.setDisplayHomeAsUpEnabled(false); + actionBar.setHomeButtonEnabled(false); + mData = extras.getByteArray(Apg.EXTRA_DATA); String textData = null; if (mData == null) { diff --git a/org_apg/src/org/apg/ui/EditKeyActivity.java b/org_apg/src/org/apg/ui/EditKeyActivity.java index 8f7a642f9..b0e59a7bf 100644 --- a/org_apg/src/org/apg/ui/EditKeyActivity.java +++ b/org_apg/src/org/apg/ui/EditKeyActivity.java @@ -28,6 +28,7 @@ import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; import org.apg.R; +import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; @@ -36,6 +37,7 @@ import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.os.Message; import android.view.LayoutInflater; @@ -53,6 +55,7 @@ import java.security.SignatureException; import java.util.Vector; public class EditKeyActivity extends BaseActivity { + private Intent mIntent = null; private PGPSecretKeyRing mKeyRing = null; @@ -66,12 +69,10 @@ public class EditKeyActivity extends BaseActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { - menu.add(1, Id.menu.option.cancel, 0, R.string.btn_doNotSave) - // .setIcon(R.drawable.ic_menu_search_holo_light) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); - menu.add(1, Id.menu.option.save, 1, R.string.btn_save) - // .setIcon(R.drawable.ic_suggestions_add) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); + menu.add(1, Id.menu.option.cancel, 0, R.string.btn_doNotSave).setShowAsAction( + MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); + menu.add(1, Id.menu.option.save, 1, R.string.btn_save).setShowAsAction( + MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); return true; } @@ -128,6 +129,26 @@ public class EditKeyActivity extends BaseActivity { } } + // Catch Intents opened from other apps + mIntent = getIntent(); + if (Apg.Intent.EDIT_KEY.equals(mIntent.getAction())) { + Bundle extras = mIntent.getExtras(); + if (extras == null) { + extras = new Bundle(); + } + + // disable home button on actionbar because this activity is run from another app + final ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayShowTitleEnabled(true); + actionBar.setDisplayHomeAsUpEnabled(false); + actionBar.setHomeButtonEnabled(false); + + // if userId is given, prefill the fields + if (extras.containsKey(Apg.EXTRA_USER_IDS)) { + userIds.add(extras.getString(Apg.EXTRA_USER_IDS)); + } + } + mChangePassPhrase = (Button) findViewById(R.id.btn_change_pass_phrase); mChangePassPhrase.setOnClickListener(new OnClickListener() { public void onClick(View v) { @@ -135,12 +156,7 @@ public class EditKeyActivity extends BaseActivity { } }); - // mSaveButton = (Button) findViewById(R.id.btn_save); - // mDiscardButton = (Button) findViewById(R.id.btn_discard); - - // mSaveButton.setOnClickListener(this); - // mDiscardButton.setOnClickListener(this); - + // Build layout based on given userIds and keys LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); LinearLayout container = (LinearLayout) findViewById(R.id.container); diff --git a/org_apg/src/org/apg/ui/EncryptActivity.java b/org_apg/src/org/apg/ui/EncryptActivity.java index a4194d778..c437ebe27 100644 --- a/org_apg/src/org/apg/ui/EncryptActivity.java +++ b/org_apg/src/org/apg/ui/EncryptActivity.java @@ -33,6 +33,7 @@ import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; import org.apg.R; +import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; @@ -125,15 +126,12 @@ public class EncryptActivity extends BaseActivity { if (mEncryptToClipboardEnabled) { menu.add(1, Id.menu.option.encrypt_to_clipboard, 0, mEncryptToClipboardString) - // .setIcon(R.drawable.ic_menu_encrypt) .setShowAsAction( MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); } if (mEncryptEnabled) { - menu.add(1, Id.menu.option.encrypt, 1, mEncryptString) - // .setIcon(R.drawable.ic_menu_decrypt) - .setShowAsAction( - MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); + menu.add(1, Id.menu.option.encrypt, 1, mEncryptString).setShowAsAction( + MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT); } return true; @@ -233,8 +231,6 @@ public class EncryptActivity extends BaseActivity { mMessage = (EditText) findViewById(R.id.message); mSelectKeysButton = (Button) findViewById(R.id.btn_selectEncryptKeys); - // mEncryptButton = (Button) findViewById(R.id.btn_encrypt); - // mEncryptToClipboardButton = (Button) findViewById(R.id.btn_encryptToClipboard); mSign = (CheckBox) findViewById(R.id.sign); mMainUserId = (TextView) findViewById(R.id.mainUserId); mMainUserIdRest = (TextView) findViewById(R.id.mainUserIdRest); @@ -317,6 +313,12 @@ public class EncryptActivity extends BaseActivity { extras = new Bundle(); } + // disable home button on actionbar because this activity is run from another app + final ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayShowTitleEnabled(true); + actionBar.setDisplayHomeAsUpEnabled(false); + actionBar.setHomeButtonEnabled(false); + if (Apg.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction()) || Apg.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { mReturnResult = true; @@ -483,8 +485,6 @@ public class EncryptActivity extends BaseActivity { mEncryptEnabled = true; mEncryptToClipboardEnabled = false; - // mEncryptToClipboardButton.setVisibility(View.INVISIBLE); - // mEncryptButton.setText(R.string.btn_encrypt); break; } diff --git a/org_apg/src/org/apg/ui/SelectPublicKeyListActivity.java b/org_apg/src/org/apg/ui/SelectPublicKeyListActivity.java index 0b6d6c43a..e2dcc8d4d 100644 --- a/org_apg/src/org/apg/ui/SelectPublicKeyListActivity.java +++ b/org_apg/src/org/apg/ui/SelectPublicKeyListActivity.java @@ -21,6 +21,7 @@ import java.util.Vector; import org.apg.Apg; import org.apg.Id; import org.apg.R; +import org.apg.ui.widget.SelectPublicKeyListAdapter; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.view.Menu; diff --git a/org_apg/src/org/apg/ui/SelectSecretKeyListActivity.java b/org_apg/src/org/apg/ui/SelectSecretKeyListActivity.java index 774ce6e41..dadc6f5bf 100644 --- a/org_apg/src/org/apg/ui/SelectSecretKeyListActivity.java +++ b/org_apg/src/org/apg/ui/SelectSecretKeyListActivity.java @@ -19,6 +19,7 @@ package org.apg.ui; import org.apg.Apg; import org.apg.Id; import org.apg.R; +import org.apg.ui.widget.SelectSecretKeyListAdapter; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.view.Menu; diff --git a/org_apg/src/org/apg/ui/SelectPublicKeyListAdapter.java b/org_apg/src/org/apg/ui/widget/SelectPublicKeyListAdapter.java similarity index 99% rename from org_apg/src/org/apg/ui/SelectPublicKeyListAdapter.java rename to org_apg/src/org/apg/ui/widget/SelectPublicKeyListAdapter.java index 93844601b..b98a76661 100644 --- a/org_apg/src/org/apg/ui/SelectPublicKeyListAdapter.java +++ b/org_apg/src/org/apg/ui/widget/SelectPublicKeyListAdapter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.apg.ui; +package org.apg.ui.widget; import java.util.Date; diff --git a/org_apg/src/org/apg/ui/SelectSecretKeyListAdapter.java b/org_apg/src/org/apg/ui/widget/SelectSecretKeyListAdapter.java similarity index 99% rename from org_apg/src/org/apg/ui/SelectSecretKeyListAdapter.java rename to org_apg/src/org/apg/ui/widget/SelectSecretKeyListAdapter.java index 3c0b803eb..1b6d115b7 100644 --- a/org_apg/src/org/apg/ui/SelectSecretKeyListAdapter.java +++ b/org_apg/src/org/apg/ui/widget/SelectSecretKeyListAdapter.java @@ -12,7 +12,7 @@ * limitations under the License. */ -package org.apg.ui; +package org.apg.ui.widget; import java.util.Date; diff --git a/org_apg/src/org/apg/ui/widget/UserIdEditor.java b/org_apg/src/org/apg/ui/widget/UserIdEditor.java index ebbc608f0..ce5594c8e 100644 --- a/org_apg/src/org/apg/ui/widget/UserIdEditor.java +++ b/org_apg/src/org/apg/ui/widget/UserIdEditor.java @@ -40,9 +40,12 @@ public class UserIdEditor extends LinearLayout implements Editor, OnClickListene private EditText mEmail; private EditText mComment; - private static final Pattern EMAIL_PATTERN = Pattern.compile( - "^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+[.]([a-zA-Z])+([a-zA-Z])+", - Pattern.CASE_INSENSITIVE); + // see http://www.regular-expressions.info/email.html + // RFC 2822 if we omit the syntax using double quotes and square brackets + private static final Pattern EMAIL_PATTERN = Pattern + .compile( + "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", + Pattern.CASE_INSENSITIVE); public static class NoNameException extends Exception { static final long serialVersionUID = 0xf812773343L; diff --git a/org_apg_integration_demo/libs/org_apg_integration_lib.jar b/org_apg_integration_demo/libs/org_apg_integration_lib.jar deleted file mode 100644 index 43bcec37bc57b9df7d5d233f5d7ea947de18261e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8258 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 + +