diff --git a/APG-API-Lib/libs/android-support-v4.jar b/APG-API-Lib/libs/android-support-v4.jar new file mode 100644 index 000000000..99e063b33 Binary files /dev/null and b/APG-API-Lib/libs/android-support-v4.jar differ diff --git a/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgData.java b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgData.java index 538e591df..317f2c1c4 100644 --- a/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgData.java +++ b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgData.java @@ -22,7 +22,8 @@ import java.util.Arrays; public class ApgData implements Serializable { private static final long serialVersionUID = 6314045536270848410L; - protected long mPublicKeyIds[] = null; + protected long[] mPublicKeyIds = null; + protected String[] mPublicUserIds = null; protected long mSecretKeyId = 0; protected String mSecretKeyUserId = null; protected boolean mSignatureSuccess = false; @@ -38,7 +39,7 @@ public class ApgData implements Serializable { return mSecretKeyId; } - public void setPublicKeys(long keyIds[]) { + public void setPublicKeyIds(long[] keyIds) { mPublicKeyIds = keyIds; } @@ -46,6 +47,14 @@ public class ApgData implements Serializable { return mPublicKeyIds; } + public void setPublicUserIds(String[] userIds) { + mPublicUserIds = userIds; + } + + public String[] getPublicUserIds() { + return mPublicUserIds; + } + public boolean hasSecretKey() { return mSecretKeyId != 0; } 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 1b95e8986..27d5480fa 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 @@ -112,6 +112,22 @@ public class ApgIntentHelper { this.activity = activity; } + /** + * Start an activity.
+ * This method is defined to allow different methods of activity starting for newer versions of + * Android and for compatibility library. + * + * @param intent + * Intent to start. + * @param code + * Request code for the activity + * @see android.app.Activity#startActivityForResult(Intent, int) + * @see android.app.Fragment#startActivityForResult(Intent, int) + */ + protected void startActivityForResult(Intent intent, int code) { + startActivityForResult(intent, code); + } + /** * Open activity to scan qr code and import key in it * @@ -121,7 +137,7 @@ public class ApgIntentHelper { Intent intent = new Intent(ACTION_SCAN_QR_CODE); intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION); try { - activity.startActivityForResult(intent, -1); + startActivityForResult(intent, -1); return true; } catch (ActivityNotFoundException e) { activityNotFound(); @@ -146,7 +162,7 @@ public class ApgIntentHelper { intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION); try { - activity.startActivityForResult(intent, CREATE_KEY); + startActivityForResult(intent, CREATE_KEY); return true; } catch (ActivityNotFoundException e) { activityNotFound(); @@ -174,7 +190,7 @@ public class ApgIntentHelper { intent.putExtra(EXTRA_KEY_ID, keyId); intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION); try { - activity.startActivityForResult(intent, EDIT_KEY); + startActivityForResult(intent, EDIT_KEY); return true; } catch (ActivityNotFoundException e) { activityNotFound(); @@ -191,7 +207,7 @@ public class ApgIntentHelper { Intent intent = new Intent(ACTION_SELECT_SECRET_KEY); intent.putExtra(EXTRA_INTENT_VERSION, INTENT_VERSION); try { - activity.startActivityForResult(intent, SELECT_SECRET_KEY); + startActivityForResult(intent, SELECT_SECRET_KEY); return true; } catch (ActivityNotFoundException e) { activityNotFound(); @@ -225,7 +241,7 @@ public class ApgIntentHelper { intent.putExtra(EXTRA_ENCRYPTION_KEY_IDS, encryptionKeyIds); intent.putExtra(EXTRA_SIGNATURE_KEY_ID, signatureKeyId); try { - activity.startActivityForResult(intent, ENCRYPT_MESSAGE); + startActivityForResult(intent, ENCRYPT_MESSAGE); return true; } catch (ActivityNotFoundException e) { activityNotFound(); @@ -255,7 +271,7 @@ public class ApgIntentHelper { } try { intent.putExtra(EXTRA_TEXT, data); - activity.startActivityForResult(intent, DECRYPT_MESSAGE); + startActivityForResult(intent, DECRYPT_MESSAGE); return true; } catch (ActivityNotFoundException e) { activityNotFound(); @@ -294,15 +310,16 @@ public class ApgIntentHelper { break; case SELECT_PUBLIC_KEYS: if (resultCode != Activity.RESULT_OK || data == null) { - apgData.setPublicKeys(null); + apgData.setPublicKeyIds(null); break; } - apgData.setPublicKeys(data.getLongArrayExtra(RESULT_EXTRA_MASTER_KEY_IDS)); + apgData.setPublicKeyIds(data.getLongArrayExtra(RESULT_EXTRA_MASTER_KEY_IDS)); + apgData.setPublicUserIds(data.getStringArrayExtra(RESULT_EXTRA_USER_IDS)); break; case ENCRYPT_MESSAGE: if (resultCode != Activity.RESULT_OK || data == null) { - apgData.setPublicKeys(null); + apgData.setPublicKeyIds(null); break; } apgData.setEncryptedData(data.getStringExtra(EXTRA_ENCRYPTED_MESSAGE)); @@ -363,7 +380,7 @@ public class ApgIntentHelper { intent.putExtra(EXTRA_SELECTION, initialKeyIds); try { - activity.startActivityForResult(intent, SELECT_PUBLIC_KEYS); + startActivityForResult(intent, SELECT_PUBLIC_KEYS); return true; } catch (ActivityNotFoundException e) { activityNotFound(); diff --git a/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelperSupportV4.java b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelperSupportV4.java new file mode 100644 index 000000000..8a64a925a --- /dev/null +++ b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelperSupportV4.java @@ -0,0 +1,43 @@ +/* + * 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.integration; + +import android.content.Intent; +import android.support.v4.app.Fragment; + +/** + * ApgIntentHelper for the V4 Android compatibility package. + */ +public final class ApgIntentHelperSupportV4 extends ApgIntentHelper { + + private final Fragment fragment; + + /** + * @param fragment + * Fragment to handle activity response. + */ + public ApgIntentHelperSupportV4(Fragment fragment) { + super(fragment.getActivity()); + this.fragment = fragment; + } + + @Override + protected void startActivityForResult(Intent intent, int code) { + fragment.startActivityForResult(intent, code); + } + +} \ No newline at end of file diff --git a/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelperV30.java b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelperV30.java new file mode 100644 index 000000000..4c1fbea40 --- /dev/null +++ b/APG-API-Lib/src/org/thialfihar/android/apg/integration/ApgIntentHelperV30.java @@ -0,0 +1,46 @@ +/* + * 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.integration; + +import android.annotation.TargetApi; +import android.app.Fragment; +import android.content.Intent; +import android.os.Build; + +/** + * ApgIntentHelper for Android version 3.0 and beyond. + */ +@TargetApi(Build.VERSION_CODES.HONEYCOMB) +public final class ApgIntentHelperV30 extends ApgIntentHelper { + + private final Fragment fragment; + + /** + * @param fragment + * Fragment to handle activity response. + */ + public ApgIntentHelperV30(Fragment fragment) { + super(fragment.getActivity()); + this.fragment = fragment; + } + + @Override + protected void startActivityForResult(Intent intent, int code) { + fragment.startActivityForResult(intent, code); + } + +} \ No newline at end of file diff --git a/APG/src/org/thialfihar/android/apg/provider/ApgProvider.java b/APG/src/org/thialfihar/android/apg/provider/ApgProvider.java index a5bb26507..88cb3df21 100644 --- a/APG/src/org/thialfihar/android/apg/provider/ApgProvider.java +++ b/APG/src/org/thialfihar/android/apg/provider/ApgProvider.java @@ -115,6 +115,9 @@ public class ApgProvider extends ContentProvider { + ApgContract.PATH_BY_KEY_ID + "/*", PUBLIC_KEY_RING_BY_KEY_ID); matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC + "/" + ApgContract.PATH_BY_EMAILS + "/*", PUBLIC_KEY_RING_BY_EMAILS); + matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC + "/" + + ApgContract.PATH_BY_EMAILS, PUBLIC_KEY_RING_BY_EMAILS); // without emails + // specified matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC + "/" + ApgContract.PATH_BY_LIKE_EMAIL + "/*", PUBLIC_KEY_RING_BY_LIKE_EMAIL); @@ -167,6 +170,9 @@ public class ApgProvider extends ContentProvider { + ApgContract.PATH_BY_KEY_ID + "/*", SECRET_KEY_RING_BY_KEY_ID); matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET + "/" + ApgContract.PATH_BY_EMAILS + "/*", SECRET_KEY_RING_BY_EMAILS); + matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET + "/" + + ApgContract.PATH_BY_EMAILS, SECRET_KEY_RING_BY_EMAILS); // without emails + // specified matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET + "/" + ApgContract.PATH_BY_LIKE_EMAIL + "/*", SECRET_KEY_RING_BY_LIKE_EMAIL);