From d515b267964fd5398da8338414acbaebe8edcb21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Tue, 8 Jan 2013 22:12:23 +0100 Subject: Generic share of keyring via Android Intent SEND, renaming of own share intents --- .../android/apg/integration/ApgIntentHelper.java | 11 ++-- APG/AndroidManifest.xml | 7 +- APG/res/values/strings.xml | 4 +- APG/src/org/thialfihar/android/apg/Id.java | 7 +- .../android/apg/ui/KeyListPublicFragment.java | 24 +++++-- .../thialfihar/android/apg/ui/ShareActivity.java | 74 ++++++++++++++++++++++ .../android/apg/ui/ShareNfcBeamActivity.java | 5 +- .../android/apg/ui/ShareQrCodeActivity.java | 65 ------------------- README.md | 5 +- 9 files changed, 116 insertions(+), 86 deletions(-) create mode 100644 APG/src/org/thialfihar/android/apg/ui/ShareActivity.java delete mode 100644 APG/src/org/thialfihar/android/apg/ui/ShareQrCodeActivity.java diff --git a/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelper.java b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelper.java index 1362412fb..d6cdc60ab 100644 --- a/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelper.java +++ b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelper.java @@ -81,8 +81,11 @@ public class ApgIntentHelper { /** * Share actions */ - public static final String ACTION_SHARE_WITH_QR_CODE = APG_INTENT_PREFIX + "SHARE_WITH_QR_CODE"; - public static final String ACTION_SHARE_WITH_NFC = APG_INTENT_PREFIX + "SHARE_WITH_NFC"; + public static final String ACTION_SHARE_KEYRING = APG_INTENT_PREFIX + "SHARE_KEYRING"; + public static final String ACTION_SHARE_KEYRING_WITH_QR_CODE = APG_INTENT_PREFIX + + "SHARE_KEYRING_WITH_QR_CODE"; + public static final String ACTION_SHARE_KEYRING_WITH_NFC = APG_INTENT_PREFIX + + "SHARE_KEYRING_WITH_NFC"; // used by SHARE_WITH_QR_CODE and SHARE_WITH_NFC public static final String EXTRA_MASTER_KEY_ID = "masterKeyId"; @@ -168,7 +171,7 @@ public class ApgIntentHelper { * @return true when activity was found and executed successfully */ public boolean shareWithQrCode(long masterKeyId) { - Intent intent = new Intent(ACTION_SHARE_WITH_QR_CODE); + Intent intent = new Intent(ACTION_SHARE_KEYRING_WITH_QR_CODE); intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION); intent.putExtra(EXTRA_MASTER_KEY_ID, masterKeyId); try { @@ -186,7 +189,7 @@ public class ApgIntentHelper { * @return true when activity was found and executed successfully */ public boolean shareWithNfc(long masterKeyId) { - Intent intent = new Intent(ACTION_SHARE_WITH_NFC); + Intent intent = new Intent(ACTION_SHARE_KEYRING_WITH_NFC); intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION); intent.putExtra(EXTRA_MASTER_KEY_ID, masterKeyId); try { diff --git a/APG/AndroidManifest.xml b/APG/AndroidManifest.xml index 6a31333fd..c29626ccf 100644 --- a/APG/AndroidManifest.xml +++ b/APG/AndroidManifest.xml @@ -364,7 +364,7 @@ android:launchMode="singleTop" android:uiOptions="splitActionBarWhenNarrow" > - + @@ -378,9 +378,10 @@ - + - + + diff --git a/APG/res/values/strings.xml b/APG/res/values/strings.xml index 6aac04808..c7d25ad44 100644 --- a/APG/res/values/strings.xml +++ b/APG/res/values/strings.xml @@ -102,6 +102,7 @@ Query Key Server Update from Server Export To Server + Share with… Share with QR Code Share with NFC Scan QR Code @@ -156,7 +157,7 @@ %s key server(s) Fingerprint: Secret Keyring: - + None Sign only @@ -321,6 +322,7 @@ Search Public Keyrings Search Secret Keyrings Filter: \"%s\" + Share keyring with… fast diff --git a/APG/src/org/thialfihar/android/apg/Id.java b/APG/src/org/thialfihar/android/apg/Id.java index d25bb24b0..db283da37 100644 --- a/APG/src/org/thialfihar/android/apg/Id.java +++ b/APG/src/org/thialfihar/android/apg/Id.java @@ -35,9 +35,10 @@ public final class Id { public static final int edit = 0x21070003; public static final int update = 0x21070004; public static final int exportToServer = 0x21070005; - public static final int share_qr_code = 0x21070006; - public static final int share_nfc = 0x21070007; - public static final int signKey = 0x21070008; + public static final int share = 0x21070006; + public static final int share_qr_code = 0x21070007; + public static final int share_nfc = 0x21070008; + public static final int signKey = 0x21070009; public static final class option { public static final int new_pass_phrase = 0x21070001; diff --git a/APG/src/org/thialfihar/android/apg/ui/KeyListPublicFragment.java b/APG/src/org/thialfihar/android/apg/ui/KeyListPublicFragment.java index 06bf7e7d9..7c23e6217 100644 --- a/APG/src/org/thialfihar/android/apg/ui/KeyListPublicFragment.java +++ b/APG/src/org/thialfihar/android/apg/ui/KeyListPublicFragment.java @@ -76,8 +76,9 @@ public class KeyListPublicFragment extends KeyListFragment implements menu.add(0, Id.menu.update, 1, R.string.menu_updateKey); menu.add(0, Id.menu.signKey, 2, R.string.menu_signKey); menu.add(0, Id.menu.exportToServer, 3, R.string.menu_exportKeyToServer); - menu.add(0, Id.menu.share_qr_code, 6, R.string.menu_shareQrCode); - menu.add(0, Id.menu.share_nfc, 7, R.string.menu_shareNfc); + menu.add(0, Id.menu.share, 6, R.string.menu_share); + menu.add(0, Id.menu.share_qr_code, 7, R.string.menu_shareQrCode); + menu.add(0, Id.menu.share_nfc, 8, R.string.menu_shareNfc); } @@ -142,9 +143,9 @@ public class KeyListPublicFragment extends KeyListFragment implements // get master key id using row id long masterKeyId = ProviderHelper.getPublicMasterKeyId(mKeyListActivity, keyRingRowId); - Intent qrCodeIntent = new Intent(mKeyListActivity, ShareQrCodeActivity.class); - qrCodeIntent.setAction(ShareQrCodeActivity.ACTION_SHARE_WITH_QR_CODE); - qrCodeIntent.putExtra(ShareQrCodeActivity.EXTRA_MASTER_KEY_ID, masterKeyId); + Intent qrCodeIntent = new Intent(mKeyListActivity, ShareActivity.class); + qrCodeIntent.setAction(ShareActivity.ACTION_SHARE_KEYRING_WITH_QR_CODE); + qrCodeIntent.putExtra(ShareActivity.EXTRA_MASTER_KEY_ID, masterKeyId); startActivityForResult(qrCodeIntent, 0); return true; @@ -154,12 +155,23 @@ public class KeyListPublicFragment extends KeyListFragment implements long masterKeyId2 = ProviderHelper.getPublicMasterKeyId(mKeyListActivity, keyRingRowId); Intent nfcIntent = new Intent(mKeyListActivity, ShareNfcBeamActivity.class); - nfcIntent.setAction(ShareNfcBeamActivity.ACTION_SHARE_WITH_NFC); + nfcIntent.setAction(ShareNfcBeamActivity.ACTION_SHARE_KEYRING_WITH_NFC); nfcIntent.putExtra(ShareNfcBeamActivity.EXTRA_MASTER_KEY_ID, masterKeyId2); startActivityForResult(nfcIntent, 0); return true; + case Id.menu.share: + // get master key id using row id + long masterKeyId3 = ProviderHelper.getPublicMasterKeyId(mKeyListActivity, keyRingRowId); + + Intent shareIntent = new Intent(mKeyListActivity, ShareActivity.class); + shareIntent.setAction(ShareActivity.ACTION_SHARE_KEYRING); + shareIntent.putExtra(ShareActivity.EXTRA_MASTER_KEY_ID, masterKeyId3); + startActivityForResult(shareIntent, 0); + + return true; + default: return super.onContextItemSelected(item); diff --git a/APG/src/org/thialfihar/android/apg/ui/ShareActivity.java b/APG/src/org/thialfihar/android/apg/ui/ShareActivity.java new file mode 100644 index 000000000..7fec42e47 --- /dev/null +++ b/APG/src/org/thialfihar/android/apg/ui/ShareActivity.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2013 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; + +import java.util.ArrayList; + +import org.thialfihar.android.apg.Constants; +import org.thialfihar.android.apg.R; +import org.thialfihar.android.apg.provider.ProviderHelper; + +import com.actionbarsherlock.app.SherlockFragmentActivity; +import com.google.zxing.integration.android.IntentIntegrator; + +import android.content.Intent; +import android.os.Bundle; + +public class ShareActivity extends SherlockFragmentActivity { + public static final String ACTION_SHARE_KEYRING = Constants.INTENT_PREFIX + "SHARE_KEYRING"; + public static final String ACTION_SHARE_KEYRING_WITH_QR_CODE = Constants.INTENT_PREFIX + + "SHARE_KEYRING_WITH_QR_CODE"; + + public static final String EXTRA_MASTER_KEY_ID = "masterKeyId"; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + handleActions(getIntent()); + } + + protected void handleActions(Intent intent) { + String action = intent.getAction(); + Bundle extras = intent.getExtras(); + + if (extras == null) { + extras = new Bundle(); + } + + long masterKeyId = extras.getLong(EXTRA_MASTER_KEY_ID); + + // get public keyring as ascii armored string + ArrayList keyringArmored = ProviderHelper.getPublicKeyRingsAsArmoredString(this, + new long[] { masterKeyId }); + + // close this activity + finish(); + + if (ACTION_SHARE_KEYRING.equals(action)) { + // let user choose application + Intent sendIntent = new Intent(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, keyringArmored.get(0)); + sendIntent.setType("text/plain"); + startActivity(Intent.createChooser(sendIntent, + getResources().getText(R.string.shareKeyringWith))); + } else if (ACTION_SHARE_KEYRING_WITH_QR_CODE.equals(action)) { + // use barcode scanner integration library + new IntentIntegrator(this).shareText(keyringArmored.get(0)); + } + } +} diff --git a/APG/src/org/thialfihar/android/apg/ui/ShareNfcBeamActivity.java b/APG/src/org/thialfihar/android/apg/ui/ShareNfcBeamActivity.java index bdf5f6227..abb2d6b82 100644 --- a/APG/src/org/thialfihar/android/apg/ui/ShareNfcBeamActivity.java +++ b/APG/src/org/thialfihar/android/apg/ui/ShareNfcBeamActivity.java @@ -54,7 +54,8 @@ import android.text.method.LinkMovementMethod; @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public class ShareNfcBeamActivity extends SherlockFragmentActivity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback { - public static final String ACTION_SHARE_WITH_NFC = Constants.INTENT_PREFIX + "SHARE_WITH_NFC"; + public static final String ACTION_SHARE_KEYRING_WITH_NFC = Constants.INTENT_PREFIX + + "SHARE_KEYRING_WITH_NFC"; public static final String EXTRA_MASTER_KEY_ID = "masterKeyId"; @@ -96,7 +97,7 @@ public class ShareNfcBeamActivity extends SherlockFragmentActivity implements extras = new Bundle(); } - if (ACTION_SHARE_WITH_NFC.equals(action)) { + if (ACTION_SHARE_KEYRING_WITH_NFC.equals(action)) { long masterKeyId = extras.getLong(EXTRA_MASTER_KEY_ID); // get public keyring as byte array diff --git a/APG/src/org/thialfihar/android/apg/ui/ShareQrCodeActivity.java b/APG/src/org/thialfihar/android/apg/ui/ShareQrCodeActivity.java deleted file mode 100644 index 7d4237b80..000000000 --- a/APG/src/org/thialfihar/android/apg/ui/ShareQrCodeActivity.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2013 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; - -import java.util.ArrayList; - -import org.thialfihar.android.apg.Constants; -import org.thialfihar.android.apg.provider.ProviderHelper; - -import com.actionbarsherlock.app.SherlockFragmentActivity; -import com.google.zxing.integration.android.IntentIntegrator; - -import android.content.Intent; -import android.os.Bundle; - -public class ShareQrCodeActivity extends SherlockFragmentActivity { - public static final String ACTION_SHARE_WITH_QR_CODE = Constants.INTENT_PREFIX - + "SHARE_WITH_QR_CODE"; - - public static final String EXTRA_MASTER_KEY_ID = "masterKeyId"; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - handleActions(getIntent()); - } - - protected void handleActions(Intent intent) { - String action = intent.getAction(); - Bundle extras = intent.getExtras(); - - if (extras == null) { - extras = new Bundle(); - } - - if (ACTION_SHARE_WITH_QR_CODE.equals(action)) { - long masterKeyId = extras.getLong(EXTRA_MASTER_KEY_ID); - - // get public keyring as ascii armored string - ArrayList keyringArmored = ProviderHelper.getPublicKeyRingsAsArmoredString( - this, new long[] { masterKeyId }); - // close this activity - finish(); - - // use barcode scanner integration library - new IntentIntegrator(this).shareText(keyringArmored.get(0)); - } - } - -} diff --git a/README.md b/README.md index 07ca28f63..e87eff98f 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,9 @@ Android primitives to exchange data: Intent, Intent with return values, Send (al * IMPORT_FROM_FILE * IMPORT_FROM_QR_CODE * IMPORT_FROM_NFC -* SHARE_WITH_QR_CODE -* SHARE_WITH_NFC +* SHARE_KEYRING +* SHARE_KEYRING_WITH_QR_CODE +* SHARE_KEYRING_WITH_NFC * EDIT_KEY * SELECT_PUBLIC_KEYS * SELECT_SECRET_KEY -- cgit v1.2.3