From 75368034bd620d3d958ba6962f19e82edcb3a562 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Sun, 15 Mar 2015 19:35:03 +0100
Subject: [PATCH 01/42] Put API activites in normal process to allow
hydrate/dehydrate of logs
---
OpenKeychain/src/main/AndroidManifest.xml | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/OpenKeychain/src/main/AndroidManifest.xml b/OpenKeychain/src/main/AndroidManifest.xml
index 0e7baf039..cd4dc6940 100644
--- a/OpenKeychain/src/main/AndroidManifest.xml
+++ b/OpenKeychain/src/main/AndroidManifest.xml
@@ -710,14 +710,12 @@
android:name=".remote.ui.RemoteServiceActivity"
android:exported="false"
android:label="@string/app_name"
- android:launchMode="singleTop"
- android:process=":remote_api" />
+ android:launchMode="singleTop" />
+ android:launchMode="singleTop" />
Date: Sun, 15 Mar 2015 21:17:24 +0100
Subject: [PATCH 02/42] Clarify MIME usage
---
.../main/java/org/sufficientlysecure/keychain/Constants.java | 5 +++++
.../sufficientlysecure/keychain/ui/EncryptFilesActivity.java | 2 +-
.../sufficientlysecure/keychain/ui/EncryptTextActivity.java | 2 +-
3 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
index 30d855a74..2ae20bec3 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java
@@ -42,6 +42,11 @@ public final class Constants {
// as defined in http://tools.ietf.org/html/rfc3156, section 7
public static final String NFC_MIME = "application/pgp-keys";
+ // as defined in http://tools.ietf.org/html/rfc3156
+ // we don't use application/pgp-encrypted as it only holds the version number
+ public static final String ENCRYPTED_FILES_MIME = "application/octet-stream";
+ public static final String ENCRYPTED_TEXT_MIME = "text/plain";
+
// used by QR Codes (Guardian Project, Monkeysphere compatiblity)
public static final String FINGERPRINT_SCHEME = "openpgp4fpr";
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
index b862d5b11..416ddcb3f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
@@ -268,7 +268,7 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
sendIntent.putExtra(Intent.EXTRA_STREAM, mOutputUris);
}
- sendIntent.setType("application/octet-stream");
+ sendIntent.setType(Constants.ENCRYPTED_FILES_MIME);
if (!isModeSymmetric() && mEncryptionUserIds != null) {
Set users = new HashSet<>();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
index ee15cf7b5..cd11a60c9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
@@ -247,7 +247,7 @@ public class EncryptTextActivity extends EncryptActivity implements EncryptActiv
private Intent createSendIntent(byte[] resultBytes) {
Intent sendIntent;
sendIntent = new Intent(Intent.ACTION_SEND);
- sendIntent.setType("text/plain");
+ sendIntent.setType(Constants.ENCRYPTED_TEXT_MIME);
sendIntent.putExtra(Intent.EXTRA_TEXT, new String(resultBytes));
if (!isModeSymmetric() && mEncryptionUserIds != null) {
From ad9c35f522645ccf551767bf4bbc15d7b73d48ca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Sun, 15 Mar 2015 22:05:12 +0100
Subject: [PATCH 03/42] Allow selection of none in SelectSignKeyIdActivity
---
.../remote/ui/SelectSignKeyIdActivity.java | 17 ++++++++++++--
.../layout/api_select_sign_key_activity.xml | 22 +++++++++++++++++++
2 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdActivity.java
index 5ec47f4c9..b3096ef99 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdActivity.java
@@ -42,9 +42,11 @@ public class SelectSignKeyIdActivity extends BaseActivity {
private Uri mAppUri;
private String mPreferredUserId;
+ private Intent mData;
private SelectSignKeyIdListFragment mListFragment;
private TextView mActionCreateKey;
+ private TextView mNone;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -67,18 +69,29 @@ public class SelectSignKeyIdActivity extends BaseActivity {
createKey(mPreferredUserId);
}
});
+ mNone = (TextView) findViewById(R.id.api_select_sign_key_none);
+ mNone.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // 0 is "none"
+ mData.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, 0);
+
+ setResult(Activity.RESULT_OK, mData);
+ finish();
+ }
+ });
Intent intent = getIntent();
mAppUri = intent.getData();
mPreferredUserId = intent.getStringExtra(EXTRA_USER_ID);
- Intent data = intent.getParcelableExtra(EXTRA_DATA);
+ mData = intent.getParcelableExtra(EXTRA_DATA);
if (mAppUri == null) {
Log.e(Constants.TAG, "Intent data missing. Should be Uri of app!");
finish();
return;
} else {
Log.d(Constants.TAG, "uri: " + mAppUri);
- startListFragments(savedInstanceState, mAppUri, data);
+ startListFragments(savedInstanceState, mAppUri, mData);
}
}
diff --git a/OpenKeychain/src/main/res/layout/api_select_sign_key_activity.xml b/OpenKeychain/src/main/res/layout/api_select_sign_key_activity.xml
index 0528fc11e..981e01dd1 100644
--- a/OpenKeychain/src/main/res/layout/api_select_sign_key_activity.xml
+++ b/OpenKeychain/src/main/res/layout/api_select_sign_key_activity.xml
@@ -35,6 +35,28 @@
android:text="@string/api_select_sign_key_text"
android:textAppearance="?android:attr/textAppearanceMedium" />
+
+
+
+
+
+
Date: Mon, 16 Mar 2015 00:16:20 +0100
Subject: [PATCH 04/42] Fix nullpointer when scanning malformed qr codes
---
.../sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
index cc8b47971..1c1e5fe99 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
@@ -154,7 +154,7 @@ public class ImportKeysProxyActivity extends FragmentActivity {
String fingerprint = null;
// example: openpgp4fpr:73EE2314F65FA92EC2390D3A718C070100012282
- if (uri.getScheme().toLowerCase(Locale.ENGLISH).equals(Constants.FINGERPRINT_SCHEME)) {
+ if (uri != null && uri.getScheme() != null && uri.getScheme().toLowerCase(Locale.ENGLISH).equals(Constants.FINGERPRINT_SCHEME)) {
fingerprint = uri.getEncodedSchemeSpecificPart().toLowerCase(Locale.ENGLISH);
}
From 0e71fcd638195003af36f4cf8f3192a381794516 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Mon, 16 Mar 2015 13:03:17 +0100
Subject: [PATCH 05/42] Update openpgp-api lib
---
extern/openpgp-api-lib | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/extern/openpgp-api-lib b/extern/openpgp-api-lib
index 71af80882..bc177ed5e 160000
--- a/extern/openpgp-api-lib
+++ b/extern/openpgp-api-lib
@@ -1 +1 @@
-Subproject commit 71af808820032de9b508bcde7f283f5aa8ccf159
+Subproject commit bc177ed5e3f110cf372d6303c8e9d21e46fc76d2
From a655664c0bd177278826720dbac6b22f4e9e1cd2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Mon, 16 Mar 2015 13:54:01 +0100
Subject: [PATCH 06/42] object oriented split user id
---
.../keyimport/ImportKeysListEntry.java | 18 +++---
.../keychain/pgp/KeyRing.java | 64 +++++++++----------
.../remote/ui/AccountSettingsFragment.java | 6 +-
.../remote/ui/SelectSignKeyIdActivity.java | 6 +-
.../keychain/ui/CertifyKeyFragment.java | 7 +-
.../keychain/ui/CreateKeyFinalFragment.java | 4 +-
.../keychain/ui/DecryptFragment.java | 10 +--
.../keychain/ui/EditKeyFragment.java | 2 +-
.../keychain/ui/EncryptFilesActivity.java | 6 +-
.../keychain/ui/EncryptTextActivity.java | 7 +-
.../keychain/ui/KeyListFragment.java | 10 +--
.../keychain/ui/PassphraseDialogActivity.java | 6 +-
.../keychain/ui/ViewKeyActivity.java | 6 +-
.../keychain/ui/ViewKeyAdvActivity.java | 6 +-
.../keychain/ui/ViewKeyAdvCertsFragment.java | 6 +-
.../ui/adapter/ImportKeysAdapter.java | 12 ++--
.../ui/adapter/MultiUserIdsAdapter.java | 21 +++---
.../ui/adapter/SelectKeyCursorAdapter.java | 10 +--
.../keychain/ui/adapter/UserIdsAdapter.java | 14 ++--
.../ui/adapter/UserIdsAddedAdapter.java | 14 ++--
.../ui/dialog/AddUserIdDialogFragment.java | 4 +-
.../ui/dialog/DeleteKeyDialogFragment.java | 6 +-
.../ui/widget/EncryptKeyCompletionView.java | 14 ++--
.../keychain/ui/widget/KeySpinner.java | 7 +-
.../keychain/util/ContactHelper.java | 21 +++---
extern/openpgp-api-lib | 2 +-
26 files changed, 140 insertions(+), 149 deletions(-)
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
index 7dac8b1e0..bb86d272f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java
@@ -307,24 +307,22 @@ public class ImportKeysListEntry implements Serializable, Parcelable {
public void updateMergedUserIds() {
mMergedUserIds = new HashMap<>();
for (String userId : mUserIds) {
- String[] userIdSplit = KeyRing.splitUserId(userId);
+ KeyRing.UserId userIdSplit = KeyRing.splitUserId(userId);
// TODO: comment field?
- // name
- if (userIdSplit[0] != null) {
- // email
- if (userIdSplit[1] != null) {
- if (!mMergedUserIds.containsKey(userIdSplit[0])) {
+ if (userIdSplit.name != null) {
+ if (userIdSplit.email != null) {
+ if (!mMergedUserIds.containsKey(userIdSplit.name)) {
HashSet emails = new HashSet<>();
- emails.add(userIdSplit[1]);
- mMergedUserIds.put(userIdSplit[0], emails);
+ emails.add(userIdSplit.email);
+ mMergedUserIds.put(userIdSplit.name, emails);
} else {
- mMergedUserIds.get(userIdSplit[0]).add(userIdSplit[1]);
+ mMergedUserIds.get(userIdSplit.name).add(userIdSplit.email);
}
} else {
// name only
- mMergedUserIds.put(userIdSplit[0], new HashSet());
+ mMergedUserIds.put(userIdSplit.name, new HashSet());
}
} else {
// fallback
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/KeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/KeyRing.java
index 26375219b..eb1f93a8b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/KeyRing.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/pgp/KeyRing.java
@@ -44,7 +44,7 @@ public abstract class KeyRing {
abstract public String getPrimaryUserIdWithFallback() throws PgpKeyNotFoundException;
- public String[] getSplitPrimaryUserIdWithFallback() throws PgpKeyNotFoundException {
+ public UserId getSplitPrimaryUserIdWithFallback() throws PgpKeyNotFoundException {
return splitUserId(getPrimaryUserIdWithFallback());
}
@@ -62,35 +62,21 @@ public abstract class KeyRing {
/**
* Splits userId string into naming part, email part, and comment part
+ *
+ * User ID matching:
+ * http://fiddle.re/t4p6f
*
* @param userId
- * @return array with naming (0), email (1), comment (2)
+ * @return theParsedUserInfo
*/
- public static String[] splitUserId(String userId) {
- String[] result = new String[]{null, null, null};
-
- if (userId == null || userId.equals("")) {
- return result;
+ public static UserId splitUserId(final String userId) {
+ if (!TextUtils.isEmpty(userId)) {
+ final Matcher matcher = USER_ID_PATTERN.matcher(userId);
+ if (matcher.matches()) {
+ return new UserId(matcher.group(1), matcher.group(3), matcher.group(2));
+ }
}
-
- /*
- * User ID matching:
- * http://fiddle.re/t4p6f
- *
- * test cases:
- * "Max Mustermann (this is a comment) "
- * "Max Mustermann "
- * "Max Mustermann (this is a comment)"
- * "Max Mustermann [this is nothing]"
- */
- Matcher matcher = USER_ID_PATTERN.matcher(userId);
- if (matcher.matches()) {
- result[0] = matcher.group(1);
- result[1] = matcher.group(3);
- result[2] = matcher.group(2);
- }
-
- return result;
+ return new UserId(null, null, null);
}
/**
@@ -101,16 +87,28 @@ public abstract class KeyRing {
* @param comment
* @return
*/
- public static String createUserId(String name, String email, String comment) {
- String userId = name; // consider name a required value
- if (userId != null && !TextUtils.isEmpty(comment)) {
- userId += " (" + comment + ")";
+ public static String createUserId(UserId userId) {
+ String userIdString = userId.name; // consider name a required value
+ if (userIdString != null && !TextUtils.isEmpty(userId.comment)) {
+ userIdString += " (" + userId.comment + ")";
}
- if (userId != null && !TextUtils.isEmpty(email)) {
- userId += " <" + email + ">";
+ if (userIdString != null && !TextUtils.isEmpty(userId.email)) {
+ userIdString += " <" + userId.email + ">";
}
- return userId;
+ return userIdString;
+ }
+
+ public static class UserId {
+ public final String name;
+ public final String email;
+ public final String comment;
+
+ public UserId(String name, String email, String comment) {
+ this.name = name;
+ this.email = email;
+ this.comment = comment;
+ }
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java
index 4bb64bcaa..81181d61d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/AccountSettingsFragment.java
@@ -92,11 +92,11 @@ public class AccountSettingsFragment extends Fragment {
}
private void createKey() {
- String[] userId = KeyRing.splitUserId(mAccSettings.getAccountName());
+ KeyRing.UserId userId = KeyRing.splitUserId(mAccSettings.getAccountName());
Intent intent = new Intent(getActivity(), CreateKeyActivity.class);
- intent.putExtra(CreateKeyActivity.EXTRA_NAME, userId[0]);
- intent.putExtra(CreateKeyActivity.EXTRA_EMAIL, userId[1]);
+ intent.putExtra(CreateKeyActivity.EXTRA_NAME, userId.name);
+ intent.putExtra(CreateKeyActivity.EXTRA_EMAIL, userId.email);
startActivityForResult(intent, REQUEST_CODE_CREATE_KEY);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdActivity.java
index b3096ef99..98a44466d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/remote/ui/SelectSignKeyIdActivity.java
@@ -96,11 +96,11 @@ public class SelectSignKeyIdActivity extends BaseActivity {
}
private void createKey(String userId) {
- String[] userIdSplit = KeyRing.splitUserId(userId);
+ KeyRing.UserId userIdSplit = KeyRing.splitUserId(userId);
Intent intent = new Intent(this, CreateKeyActivity.class);
- intent.putExtra(CreateKeyActivity.EXTRA_NAME, userIdSplit[0]);
- intent.putExtra(CreateKeyActivity.EXTRA_EMAIL, userIdSplit[1]);
+ intent.putExtra(CreateKeyActivity.EXTRA_NAME, userIdSplit.name);
+ intent.putExtra(CreateKeyActivity.EXTRA_EMAIL, userIdSplit.email);
startActivityForResult(intent, REQUEST_CODE_CREATE_KEY);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java
index 1e1bd32c1..9cb4e5f65 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java
@@ -31,7 +31,6 @@ import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.os.Parcel;
-import android.os.Parcelable;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
@@ -247,14 +246,14 @@ public class CertifyKeyFragment extends LoaderFragment
while (!data.isAfterLast()) {
long masterKeyId = data.getLong(INDEX_MASTER_KEY_ID);
String userId = data.getString(INDEX_USER_ID);
- String[] pieces = KeyRing.splitUserId(userId);
+ KeyRing.UserId pieces = KeyRing.splitUserId(userId);
// Two cases:
boolean grouped = masterKeyId == lastMasterKeyId;
- boolean subGrouped = data.isFirst() || grouped && lastName.equals(pieces[0]);
+ boolean subGrouped = data.isFirst() || grouped && lastName.equals(pieces.name);
// Remember for next loop
- lastName = pieces[0];
+ lastName = pieces.name;
Log.d(Constants.TAG, Long.toString(masterKeyId, 16) + (grouped ? "grouped" : "not grouped"));
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
index ae42c891d..4871b5ae2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
@@ -186,12 +186,12 @@ public class CreateKeyFinalFragment extends Fragment {
Algorithm.RSA, 4096, null, KeyFlags.SIGN_DATA, 0L));
mSaveKeyringParcel.mAddSubKeys.add(new SaveKeyringParcel.SubkeyAdd(
Algorithm.RSA, 4096, null, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE, 0L));
- String userId = KeyRing.createUserId(mName, mEmail, null);
+ String userId = KeyRing.createUserId(new KeyRing.UserId(mName, mEmail, null));
mSaveKeyringParcel.mAddUserIds.add(userId);
mSaveKeyringParcel.mChangePrimaryUserId = userId;
if (mAdditionalEmails != null && mAdditionalEmails.size() > 0) {
for (String email : mAdditionalEmails) {
- String thisUserId = KeyRing.createUserId(mName, email, null);
+ String thisUserId = KeyRing.createUserId(new KeyRing.UserId(mName, email, null));
mSaveKeyringParcel.mAddUserIds.add(thisUserId);
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
index 60103f344..513300cc5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java
@@ -128,14 +128,14 @@ public abstract class DecryptFragment extends Fragment {
mSignatureKeyId = signatureResult.getKeyId();
String userId = signatureResult.getPrimaryUserId();
- String[] userIdSplit = KeyRing.splitUserId(userId);
- if (userIdSplit[0] != null) {
- mSignatureName.setText(userIdSplit[0]);
+ KeyRing.UserId userIdSplit = KeyRing.splitUserId(userId);
+ if (userIdSplit.name != null) {
+ mSignatureName.setText(userIdSplit.name);
} else {
mSignatureName.setText(R.string.user_id_no_name);
}
- if (userIdSplit[1] != null) {
- mSignatureEmail.setText(userIdSplit[1]);
+ if (userIdSplit.email != null) {
+ mSignatureEmail.setText(userIdSplit.email);
} else {
mSignatureEmail.setText(KeyFormattingUtils.beautifyKeyIdWithPrefix(getActivity(), mSignatureKeyId));
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
index 8b9323f19..8d16fe47e 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
@@ -545,7 +545,7 @@ public class EditKeyFragment extends LoaderFragment implements
Messenger messenger = new Messenger(returnHandler);
// pre-fill out primary name
- String predefinedName = KeyRing.splitUserId(mPrimaryUserId)[0];
+ String predefinedName = KeyRing.splitUserId(mPrimaryUserId).name;
AddUserIdDialogFragment addUserIdDialog = AddUserIdDialogFragment.newInstance(messenger,
predefinedName);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
index 416ddcb3f..fa7717726 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
@@ -273,9 +273,9 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
if (!isModeSymmetric() && mEncryptionUserIds != null) {
Set users = new HashSet<>();
for (String user : mEncryptionUserIds) {
- String[] userId = KeyRing.splitUserId(user);
- if (userId[1] != null) {
- users.add(userId[1]);
+ KeyRing.UserId userId = KeyRing.splitUserId(user);
+ if (userId.email != null) {
+ users.add(userId.email);
}
}
sendIntent.putExtra(Intent.EXTRA_EMAIL, users.toArray(new String[users.size()]));
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
index cd11a60c9..d3dfd73df 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptTextActivity.java
@@ -36,7 +36,6 @@ import org.sufficientlysecure.keychain.pgp.PgpConstants;
import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log;
-import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.util.ShareHelper;
import java.util.ArrayList;
@@ -253,9 +252,9 @@ public class EncryptTextActivity extends EncryptActivity implements EncryptActiv
if (!isModeSymmetric() && mEncryptionUserIds != null) {
Set users = new HashSet<>();
for (String user : mEncryptionUserIds) {
- String[] userId = KeyRing.splitUserId(user);
- if (userId[1] != null) {
- users.add(userId[1]);
+ KeyRing.UserId userId = KeyRing.splitUserId(user);
+ if (userId.email != null) {
+ users.add(userId.email);
}
}
// pass trough email addresses as extra for email applications
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
index 8c34efba2..4b604add8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
@@ -688,14 +688,14 @@ public class KeyListFragment extends LoaderFragment
{ // set name and stuff, common to both key types
String userId = cursor.getString(INDEX_USER_ID);
- String[] userIdSplit = KeyRing.splitUserId(userId);
- if (userIdSplit[0] != null) {
- h.mMainUserId.setText(highlighter.highlight(userIdSplit[0]));
+ KeyRing.UserId userIdSplit = KeyRing.splitUserId(userId);
+ if (userIdSplit.name != null) {
+ h.mMainUserId.setText(highlighter.highlight(userIdSplit.name));
} else {
h.mMainUserId.setText(R.string.user_id_no_name);
}
- if (userIdSplit[1] != null) {
- h.mMainUserIdRest.setText(highlighter.highlight(userIdSplit[1]));
+ if (userIdSplit.email != null) {
+ h.mMainUserIdRest.setText(highlighter.highlight(userIdSplit.email));
h.mMainUserIdRest.setVisibility(View.VISIBLE);
} else {
h.mMainUserIdRest.setVisibility(View.GONE);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java
index bb669f6b8..48509710a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/PassphraseDialogActivity.java
@@ -211,9 +211,9 @@ public class PassphraseDialogActivity extends FragmentActivity {
// the catch clause doesn't return.
try {
String mainUserId = mSecretRing.getPrimaryUserIdWithFallback();
- String[] mainUserIdSplit = KeyRing.splitUserId(mainUserId);
- if (mainUserIdSplit[0] != null) {
- userId = mainUserIdSplit[0];
+ KeyRing.UserId mainUserIdSplit = KeyRing.splitUserId(mainUserId);
+ if (mainUserIdSplit.name != null) {
+ userId = mainUserIdSplit.name;
} else {
userId = getString(R.string.user_id_no_name);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
index b25f6bbf2..13a5ac269 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -841,9 +841,9 @@ public class ViewKeyActivity extends BaseActivity implements
case LOADER_ID_UNIFIED: {
if (data.moveToFirst()) {
// get name, email, and comment from USER_ID
- String[] mainUserId = KeyRing.splitUserId(data.getString(INDEX_USER_ID));
- if (mainUserId[0] != null) {
- mName.setText(mainUserId[0]);
+ KeyRing.UserId mainUserId = KeyRing.splitUserId(data.getString(INDEX_USER_ID));
+ if (mainUserId.name != null) {
+ mName.setText(mainUserId.name);
} else {
mName.setText(R.string.user_id_no_name);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java
index 0654f0c9a..f17d6e0fd 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvActivity.java
@@ -197,9 +197,9 @@ public class ViewKeyAdvActivity extends BaseActivity implements
case LOADER_ID_UNIFIED: {
if (data.moveToFirst()) {
// get name, email, and comment from USER_ID
- String[] mainUserId = KeyRing.splitUserId(data.getString(INDEX_USER_ID));
- if (mainUserId[0] != null) {
- setTitle(mainUserId[0]);
+ KeyRing.UserId mainUserId = KeyRing.splitUserId(data.getString(INDEX_USER_ID));
+ if (mainUserId.name != null) {
+ setTitle(mainUserId.name);
} else {
setTitle(R.string.user_id_no_name);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvCertsFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvCertsFragment.java
index 90d7a400f..f5c8a87b1 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvCertsFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyAdvCertsFragment.java
@@ -237,9 +237,9 @@ public class ViewKeyAdvCertsFragment extends LoaderFragment implements
TextView wSignStatus = (TextView) view.findViewById(R.id.signStatus);
String signerKeyId = KeyFormattingUtils.beautifyKeyIdWithPrefix(getActivity(), cursor.getLong(mIndexSignerKeyId));
- String[] userId = KeyRing.splitUserId(cursor.getString(mIndexSignerUserId));
- if (userId[0] != null) {
- wSignerName.setText(userId[0]);
+ KeyRing.UserId userId = KeyRing.splitUserId(cursor.getString(mIndexSignerUserId));
+ if (userId.name != null) {
+ wSignerName.setText(userId.name);
} else {
wSignerName.setText(R.string.user_id_no_name);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
index 429feb075..db88de676 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java
@@ -140,25 +140,25 @@ public class ImportKeysAdapter extends ArrayAdapter {
// main user id
String userId = entry.getUserIds().get(0);
- String[] userIdSplit = KeyRing.splitUserId(userId);
+ KeyRing.UserId userIdSplit = KeyRing.splitUserId(userId);
// name
- if (userIdSplit[0] != null) {
+ if (userIdSplit.name != null) {
// show red user id if it is a secret key
if (entry.isSecretKey()) {
holder.mainUserId.setText(mActivity.getString(R.string.secret_key)
- + " " + userIdSplit[0]);
+ + " " + userIdSplit.name);
} else {
- holder.mainUserId.setText(highlighter.highlight(userIdSplit[0]));
+ holder.mainUserId.setText(highlighter.highlight(userIdSplit.name));
}
} else {
holder.mainUserId.setText(R.string.user_id_no_name);
}
// email
- if (userIdSplit[1] != null) {
+ if (userIdSplit.email != null) {
holder.mainUserIdRest.setVisibility(View.VISIBLE);
- holder.mainUserIdRest.setText(highlighter.highlight(userIdSplit[1]));
+ holder.mainUserIdRest.setText(highlighter.highlight(userIdSplit.email));
} else {
holder.mainUserIdRest.setVisibility(View.GONE);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java
index 5a0782e54..028f0fc9c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java
@@ -33,7 +33,6 @@ import android.widget.TextView;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import java.util.ArrayList;
@@ -83,9 +82,9 @@ public class MultiUserIdsAdapter extends CursorAdapter {
{ // first one
String userId = uids.get(0);
- String[] splitUserId = KeyRing.splitUserId(userId);
- if (splitUserId[0] != null) {
- vName.setText(splitUserId[0]);
+ KeyRing.UserId splitUserId = KeyRing.splitUserId(userId);
+ if (splitUserId.name != null) {
+ vName.setText(splitUserId.name);
} else {
vName.setText(R.string.user_id_no_name);
}
@@ -93,9 +92,9 @@ public class MultiUserIdsAdapter extends CursorAdapter {
if (isHeader == 1) {
vHeaderId.setVisibility(View.VISIBLE);
String message;
- if (splitUserId[0] != null) {
+ if (splitUserId.name != null) {
message = mContext.getString(R.string.section_uids_to_certify) +
- splitUserId[0];
+ splitUserId.name;
} else {
message = mContext.getString(R.string.section_uids_to_certify) +
context.getString(R.string.user_id_no_name);
@@ -108,13 +107,13 @@ public class MultiUserIdsAdapter extends CursorAdapter {
StringBuilder lines = new StringBuilder();
for (String uid : uids) {
- String[] splitUserId = KeyRing.splitUserId(uid);
- if (splitUserId[1] == null) {
+ KeyRing.UserId splitUserId = KeyRing.splitUserId(uid);
+ if (splitUserId.email == null) {
continue;
}
- lines.append(splitUserId[1]);
- if (splitUserId[2] != null) {
- lines.append(" (").append(splitUserId[2]).append(")");
+ lines.append(splitUserId.email);
+ if (splitUserId.comment != null) {
+ lines.append(" (").append(splitUserId.comment).append(")");
}
lines.append('\n');
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java
index 892e30a54..3308a4500 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java
@@ -122,16 +122,16 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
ViewHolderItem h = (ViewHolderItem) view.getTag();
String userId = cursor.getString(mIndexUserId);
- String[] userIdSplit = KeyRing.splitUserId(userId);
+ KeyRing.UserId userIdSplit = KeyRing.splitUserId(userId);
- if (userIdSplit[0] != null) {
- h.mainUserId.setText(highlighter.highlight(userIdSplit[0]));
+ if (userIdSplit.name != null) {
+ h.mainUserId.setText(highlighter.highlight(userIdSplit.name));
} else {
h.mainUserId.setText(R.string.user_id_no_name);
}
- if (userIdSplit[1] != null) {
+ if (userIdSplit.email != null) {
h.mainUserIdRest.setVisibility(View.VISIBLE);
- h.mainUserIdRest.setText(highlighter.highlight(userIdSplit[1]));
+ h.mainUserIdRest.setText(highlighter.highlight(userIdSplit.email));
} else {
h.mainUserIdRest.setVisibility(View.GONE);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java
index 3486f1516..d1103ac1f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java
@@ -72,20 +72,20 @@ public class UserIdsAdapter extends UserAttributesAdapter {
vDeleteButton.setVisibility(View.GONE); // not used
String userId = cursor.getString(INDEX_USER_ID);
- String[] splitUserId = KeyRing.splitUserId(userId);
- if (splitUserId[0] != null) {
- vName.setText(splitUserId[0]);
+ KeyRing.UserId splitUserId = KeyRing.splitUserId(userId);
+ if (splitUserId.name != null) {
+ vName.setText(splitUserId.name);
} else {
vName.setText(R.string.user_id_no_name);
}
- if (splitUserId[1] != null) {
- vAddress.setText(splitUserId[1]);
+ if (splitUserId.email != null) {
+ vAddress.setText(splitUserId.email);
vAddress.setVisibility(View.VISIBLE);
} else {
vAddress.setVisibility(View.GONE);
}
- if (splitUserId[2] != null) {
- vComment.setText(splitUserId[2]);
+ if (splitUserId.comment != null) {
+ vComment.setText(splitUserId.comment);
vComment.setVisibility(View.VISIBLE);
} else {
vComment.setVisibility(View.GONE);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java
index 970855c77..c7197b46d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAddedAdapter.java
@@ -92,20 +92,20 @@ public class UserIdsAddedAdapter extends ArrayAdapter {
// save reference to model item
holder.mModel = getItem(position);
- String[] splitUserId = KeyRing.splitUserId(holder.mModel);
- if (splitUserId[0] != null) {
- holder.vName.setText(splitUserId[0]);
+ KeyRing.UserId splitUserId = KeyRing.splitUserId(holder.mModel);
+ if (splitUserId.name != null) {
+ holder.vName.setText(splitUserId.name);
} else {
holder.vName.setText(R.string.user_id_no_name);
}
- if (splitUserId[1] != null) {
- holder.vAddress.setText(splitUserId[1]);
+ if (splitUserId.email != null) {
+ holder.vAddress.setText(splitUserId.email);
holder.vAddress.setVisibility(View.VISIBLE);
} else {
holder.vAddress.setVisibility(View.GONE);
}
- if (splitUserId[2] != null) {
- holder.vComment.setText(splitUserId[2]);
+ if (splitUserId.comment != null) {
+ holder.vComment.setText(splitUserId.comment);
holder.vComment.setVisibility(View.VISIBLE);
} else {
holder.vComment.setVisibility(View.GONE);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java
index 5dd675fd3..fe4ba0262 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/AddUserIdDialogFragment.java
@@ -100,8 +100,8 @@ public class AddUserIdDialogFragment extends DialogFragment implements OnEditorA
// return new user id back to activity
Bundle data = new Bundle();
- String userId = KeyRing.createUserId(mName.getText().toString(),
- mEmail.getText().toString(), mComment.getText().toString());
+ String userId = KeyRing.createUserId(new KeyRing.UserId(mName.getText().toString(),
+ mEmail.getText().toString(), mComment.getText().toString()));
data.putString(MESSAGE_DATA_USER_ID, userId);
sendMessageToHandler(MESSAGE_OKAY, data);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
index 20f20c32e..f512ecca2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java
@@ -100,9 +100,9 @@ public class DeleteKeyDialogFragment extends DialogFragment {
}
);
String name;
- String[] mainUserId = KeyRing.splitUserId((String) data.get(KeyRings.USER_ID));
- if (mainUserId[0] != null) {
- name = mainUserId[0];
+ KeyRing.UserId mainUserId = KeyRing.splitUserId((String) data.get(KeyRings.USER_ID));
+ if (mainUserId.name != null) {
+ name = mainUserId.name;
} else {
name = getString(R.string.user_id_no_name);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java
index 94a321f29..ceace1d26 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java
@@ -184,7 +184,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
public class EncryptionKey {
private String mUserIdFull;
- private String[] mUserId;
+ private KeyRing.UserId mUserId;
private long mKeyId;
private boolean mHasDuplicate;
private Date mCreation;
@@ -222,23 +222,23 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
}
public String getPrimary() {
- if (mUserId[0] != null) {
- return mUserId[0];
+ if (mUserId.name != null) {
+ return mUserId.name;
} else {
- return mUserId[1];
+ return mUserId.email;
}
}
public String getSecondary() {
- if (mUserId[1] != null) {
- return mUserId[1];
+ if (mUserId.email != null) {
+ return mUserId.email;
} else {
return getCreationDate();
}
}
public String getTertiary() {
- if (mUserId[0] != null) {
+ if (mUserId.name != null) {
return getCreationDate();
} else {
return null;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java
index 226588aaa..2c75c3a7d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java
@@ -39,7 +39,6 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Log;
import java.util.Calendar;
@@ -162,9 +161,9 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo
TextView vKeyEmail = (TextView) view.findViewById(R.id.keyspinner_key_email);
TextView vDuplicate = (TextView) view.findViewById(R.id.keyspinner_duplicate);
- String[] userId = KeyRing.splitUserId(cursor.getString(mIndexUserId));
- vKeyName.setText(userId[2] == null ? userId[0] : (userId[0] + " (" + userId[2] + ")"));
- vKeyEmail.setText(userId[1]);
+ KeyRing.UserId userId = KeyRing.splitUserId(cursor.getString(mIndexUserId));
+ vKeyName.setText(userId.name);
+ vKeyEmail.setText(userId.email);
boolean duplicate = cursor.getLong(mIndexDuplicate) > 0;
if (duplicate) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
index 6efc0a5ea..894a7d0d9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
@@ -37,7 +37,6 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
-import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import java.io.InputStream;
import java.util.ArrayList;
@@ -447,7 +446,7 @@ public class ContactHelper {
if (cursor != null) {
while (cursor.moveToNext()) {
long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID);
- String[] userIdSplit = KeyRing.splitUserId(cursor.getString(INDEX_USER_ID));
+ KeyRing.UserId userIdSplit = KeyRing.splitUserId(cursor.getString(INDEX_USER_ID));
boolean isExpired = cursor.getInt(INDEX_IS_EXPIRED) != 0;
boolean isRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0;
boolean isVerified = cursor.getInt(INDEX_VERIFIED) > 0;
@@ -470,19 +469,19 @@ public class ContactHelper {
if (rawContactId != -1) {
deleteRawContactById(resolver, rawContactId);
}
- } else if (userIdSplit[0] != null) {
+ } else if (userIdSplit.name != null) {
// Create a new rawcontact with corresponding key if it does not exist yet
if (rawContactId == -1) {
Log.d(Constants.TAG, "Insert new raw contact with masterKeyId " + masterKeyId);
insertContact(ops, context, masterKeyId);
- writeContactKey(ops, context, rawContactId, masterKeyId, userIdSplit[0]);
+ writeContactKey(ops, context, rawContactId, masterKeyId, userIdSplit.name);
}
// We always update the display name (which is derived from primary user id)
// and email addresses from user id
- writeContactDisplayName(ops, rawContactId, userIdSplit[0]);
+ writeContactDisplayName(ops, rawContactId, userIdSplit.name);
writeContactEmail(ops, resolver, rawContactId, masterKeyId);
try {
resolver.applyBatch(ContactsContract.AUTHORITY, ops);
@@ -521,9 +520,9 @@ public class ContactHelper {
long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID);
boolean isExpired = cursor.getInt(INDEX_IS_EXPIRED) != 0;
boolean isRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0;
- String[] userIdSplit = KeyRing.splitUserId(cursor.getString(INDEX_USER_ID));
+ KeyRing.UserId userIdSplit = KeyRing.splitUserId(cursor.getString(INDEX_USER_ID));
- if (!isExpired && !isRevoked && userIdSplit[0] != null) {
+ if (!isExpired && !isRevoked && userIdSplit.name != null) {
// if expired or revoked will not be removed from keysToDelete or inserted
// into main profile ("me" contact)
boolean existsInMainProfile = keysToDelete.remove(masterKeyId);
@@ -534,7 +533,7 @@ public class ContactHelper {
ArrayList ops = new ArrayList<>();
insertMainProfileRawContact(ops, masterKeyId);
- writeContactKey(ops, context, rawContactId, masterKeyId, userIdSplit[0]);
+ writeContactKey(ops, context, rawContactId, masterKeyId, userIdSplit.name);
try {
resolver.applyBatch(ContactsContract.AUTHORITY, ops);
@@ -776,14 +775,14 @@ public class ContactHelper {
null, null);
if (ids != null) {
while (ids.moveToNext()) {
- String[] userId = KeyRing.splitUserId(ids.getString(0));
- if (userId[1] != null) {
+ KeyRing.UserId userId = KeyRing.splitUserId(ids.getString(0));
+ if (userId.email != null) {
ops.add(referenceRawContact(
ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI),
rawContactId)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
- .withValue(ContactsContract.CommonDataKinds.Email.DATA, userId[1])
+ .withValue(ContactsContract.CommonDataKinds.Email.DATA, userId.email)
.build());
}
}
diff --git a/extern/openpgp-api-lib b/extern/openpgp-api-lib
index bc177ed5e..10be5948d 160000
--- a/extern/openpgp-api-lib
+++ b/extern/openpgp-api-lib
@@ -1 +1 @@
-Subproject commit bc177ed5e3f110cf372d6303c8e9d21e46fc76d2
+Subproject commit 10be5948d68bb5e80aed77fdf93cada598ee7667
From 484c3092eecbf775f355879587c2bea7612edac7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Mon, 16 Mar 2015 13:54:12 +0100
Subject: [PATCH 07/42] object oriented split user id
---
.../keychain/pgp/KeyRingTest.java | 53 +++++++++++++++++++
1 file changed, 53 insertions(+)
create mode 100644 OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/pgp/KeyRingTest.java
diff --git a/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/pgp/KeyRingTest.java b/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/pgp/KeyRingTest.java
new file mode 100644
index 000000000..6656c5131
--- /dev/null
+++ b/OpenKeychain-Test/src/test/java/org/sufficientlysecure/keychain/pgp/KeyRingTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 Dominik Schürmann
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package org.sufficientlysecure.keychain.pgp;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+@org.robolectric.annotation.Config(emulateSdk = 18) // Robolectric doesn't yet support 19
+public class KeyRingTest {
+
+ @Test
+ public void splitCompleteUserIdShouldReturnAll3Components() throws Exception {
+ KeyRing.UserId info = KeyRing.splitUserId("Max Mustermann (this is a comment) ");
+ Assert.assertEquals("Max Mustermann", info.name);
+ Assert.assertEquals("this is a comment", info.comment);
+ Assert.assertEquals("max@example.com", info.email);
+ }
+
+ @Test
+ public void splitUserIdWithAllButCommentShouldReturnNameAndEmail() throws Exception {
+ KeyRing.UserId info = KeyRing.splitUserId("Max Mustermann ");
+ Assert.assertEquals("Max Mustermann", info.name);
+ Assert.assertNull(info.comment);
+ Assert.assertEquals("max@example.com", info.email);
+ }
+
+ @Test
+ public void splitUserIdWithAllButEmailShouldReturnNameAndComment() throws Exception {
+ KeyRing.UserId info = KeyRing.splitUserId("Max Mustermann (this is a comment)");
+ Assert.assertEquals(info.name, "Max Mustermann");
+ Assert.assertEquals(info.comment, "this is a comment");
+ Assert.assertNull(info.email);
+ }
+
+}
\ No newline at end of file
From ae0b85a2e0e01cd05905b7d9af6e09fcd1280eb7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Mon, 16 Mar 2015 14:06:55 +0100
Subject: [PATCH 08/42] Update api lib
---
extern/openpgp-api-lib | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/extern/openpgp-api-lib b/extern/openpgp-api-lib
index 10be5948d..57a7da59b 160000
--- a/extern/openpgp-api-lib
+++ b/extern/openpgp-api-lib
@@ -1 +1 @@
-Subproject commit 10be5948d68bb5e80aed77fdf93cada598ee7667
+Subproject commit 57a7da59bd6d2a8b4e0d81d82abeb154215d920f
From 98b942982e82927be12f1d16302387e3f16e106e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Mon, 16 Mar 2015 14:27:26 +0100
Subject: [PATCH 09/42] Update api lib
---
extern/openpgp-api-lib | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/extern/openpgp-api-lib b/extern/openpgp-api-lib
index 57a7da59b..d10df1d40 160000
--- a/extern/openpgp-api-lib
+++ b/extern/openpgp-api-lib
@@ -1 +1 @@
-Subproject commit 57a7da59bd6d2a8b4e0d81d82abeb154215d920f
+Subproject commit d10df1d40f23475445d0abca217683e911ffa0a0
From 146fa8d6c0ace2f9560341171a491e9ddb0361ae Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?=
Date: Mon, 16 Mar 2015 15:05:39 +0100
Subject: [PATCH 10/42] Clarify certification help screen
---
OpenKeychain/src/main/res/raw/help_certification.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/OpenKeychain/src/main/res/raw/help_certification.html b/OpenKeychain/src/main/res/raw/help_certification.html
index 8228a4ac1..d4aff1ad7 100644
--- a/OpenKeychain/src/main/res/raw/help_certification.html
+++ b/OpenKeychain/src/main/res/raw/help_certification.html
@@ -22,10 +22,10 @@ To confirm keys between more than two persons, we suggest to use the key exchang
This certification is a "generic certification (0x10)" described in the standard by:
"The issuer of this certification does not make any particular assertion as to how well the certifier has checked that the owner of the key is in fact the person described by the User ID."
-Traditionally, certifications (often with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
+
Traditionally, certifications (also with higher certification levels, such as "positive certifications" (0x13)) are organized in OpenPGP's Web of Trust.
Our model of key confirmation is a much simpler concept to avoid common usability problems related to this Web of Trust.
We assume that keys are verified only to a certain degree that is still usable enough to be executed "on the go".
-We also do not implement (potentially transitive) trust signatures or any other internal trust model.
+We also do not implement (potentially transitive) trust signatures or an ownertrust database like in GnuPG.
Furthermore, keys which contain at least one user ID certified by a trusted key will be marked as "confirmed" in the key listings.