aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2015-03-15 20:02:57 +0100
committerVincent Breitmoser <valodim@mugenguild.com>2015-03-15 20:02:57 +0100
commit4afd6b881edfd0bc404734a4e8959a7a0fa785a7 (patch)
tree63a051fb595d168f8ddbfd76a51bb2319889d40b /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui
parentba7d8a58673d55660bc7faf68970229f17458514 (diff)
parentdb39b779c984a758e13adc16837893509f3b364f (diff)
downloadopen-keychain-4afd6b881edfd0bc404734a4e8959a7a0fa785a7.tar.gz
open-keychain-4afd6b881edfd0bc404734a4e8959a7a0fa785a7.tar.bz2
open-keychain-4afd6b881edfd0bc404734a4e8959a7a0fa785a7.zip
Merge branch 'development' into linked-identities
Conflicts: OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java5
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java39
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java7
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java13
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java43
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/MultiUserIdsAdapter.java25
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/SelectKeyCursorAdapter.java32
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/UserIdsAdapter.java8
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java106
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteKeyDialogFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateFinalFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdViewFragment.java4
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java27
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/EncryptKeyCompletionView.java49
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/KeySpinner.java49
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java4
29 files changed, 316 insertions, 143 deletions
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 6ac7630bf..a2d4a3d7c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CertifyKeyFragment.java
@@ -394,7 +394,7 @@ public class CertifyKeyFragment extends LoaderFragment
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
Bundle data = message.getData();
CertifyResult result = data.getParcelable(CertifyResult.EXTRA_RESULT);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
index f0ef8b9ef..c55aad1f9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ConsolidateDialogActivity.java
@@ -57,7 +57,7 @@ public class ConsolidateDialogActivity extends FragmentActivity {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
/* don't care about the results (for now?)
// get returned data bundle
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 4853c61c5..ae42c891d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateKeyFinalFragment.java
@@ -214,7 +214,7 @@ public class CreateKeyFinalFragment extends Fragment {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle
Bundle returnData = message.getData();
if (returnData == null) {
@@ -284,7 +284,7 @@ public class CreateKeyFinalFragment extends Fragment {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// TODO: upload operation needs a result!
// TODO: then combine these results
//if (result.getResult() == OperationResultParcel.RESULT_OK) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java
index 5606523be..c808557a6 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFilesFragment.java
@@ -37,6 +37,7 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
+import org.sufficientlysecure.keychain.service.KeychainIntentService.IOType;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment;
import org.sufficientlysecure.keychain.ui.util.Notify;
@@ -182,10 +183,10 @@ public class DecryptFilesFragment extends DecryptFragment {
// data
Log.d(Constants.TAG, "mInputUri=" + mInputUri + ", mOutputUri=" + mOutputUri);
- data.putInt(KeychainIntentService.SOURCE, KeychainIntentService.IO_URI);
+ data.putInt(KeychainIntentService.SOURCE, IOType.URI.ordinal());
data.putParcelable(KeychainIntentService.ENCRYPT_DECRYPT_INPUT_URI, mInputUri);
- data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_URI);
+ data.putInt(KeychainIntentService.TARGET, IOType.URI.ordinal());
data.putParcelable(KeychainIntentService.ENCRYPT_DECRYPT_OUTPUT_URI, mOutputUri);
data.putString(KeychainIntentService.DECRYPT_PASSPHRASE, mPassphrase);
@@ -200,7 +201,7 @@ public class DecryptFilesFragment extends DecryptFragment {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle
Bundle returnData = message.getData();
@@ -256,10 +257,10 @@ public class DecryptFilesFragment extends DecryptFragment {
// data
Log.d(Constants.TAG, "mInputUri=" + mInputUri + ", mOutputUri=" + mOutputUri);
- data.putInt(KeychainIntentService.SOURCE, KeychainIntentService.IO_URI);
+ data.putInt(KeychainIntentService.SOURCE, IOType.URI.ordinal());
data.putParcelable(KeychainIntentService.ENCRYPT_DECRYPT_INPUT_URI, mInputUri);
- data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_URI);
+ data.putInt(KeychainIntentService.TARGET, IOType.URI.ordinal());
data.putParcelable(KeychainIntentService.ENCRYPT_DECRYPT_OUTPUT_URI, mOutputUri);
data.putString(KeychainIntentService.DECRYPT_PASSPHRASE, mPassphrase);
@@ -274,7 +275,7 @@ public class DecryptFilesFragment extends DecryptFragment {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle
Bundle returnData = message.getData();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java
index a15b23c06..1b34f6bf0 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptTextFragment.java
@@ -36,6 +36,7 @@ import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.ClipboardReflection;
import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
+import org.sufficientlysecure.keychain.service.KeychainIntentService.IOType;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.util.Log;
@@ -158,7 +159,7 @@ public class DecryptTextFragment extends DecryptFragment {
intent.setAction(KeychainIntentService.ACTION_DECRYPT_VERIFY);
// data
- data.putInt(KeychainIntentService.TARGET, KeychainIntentService.IO_BYTES);
+ data.putInt(KeychainIntentService.TARGET, IOType.BYTES.ordinal());
data.putByteArray(KeychainIntentService.DECRYPT_CIPHERTEXT_BYTES, mCiphertext.getBytes());
data.putString(KeychainIntentService.DECRYPT_PASSPHRASE, mPassphrase);
data.putByteArray(KeychainIntentService.DECRYPT_NFC_DECRYPTED_SESSION_KEY, mNfcDecryptedSessionKey);
@@ -172,7 +173,7 @@ public class DecryptTextFragment extends DecryptFragment {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle
Bundle returnData = message.getData();
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 d9a5519d6..de1eb64c2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EditKeyFragment.java
@@ -605,7 +605,7 @@ public class EditKeyFragment extends LoaderFragment implements
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle
Bundle returnData = message.getData();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
index ed5920cde..35dfcb87c 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptActivity.java
@@ -128,7 +128,7 @@ public abstract class EncryptActivity extends BaseActivity {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
SignEncryptResult result =
message.getData().getParcelable(SignEncryptResult.EXTRA_RESULT);
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 d95b5cda3..b862d5b11 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java
@@ -36,7 +36,6 @@ import org.sufficientlysecure.keychain.pgp.SignEncryptParcel;
import org.sufficientlysecure.keychain.ui.dialog.DeleteFileDialogFragment;
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;
@@ -177,22 +176,36 @@ public class EncryptFilesActivity extends EncryptActivity implements EncryptActi
}
@Override
- public void onEncryptSuccess(SignEncryptResult result) {
+ public void onEncryptSuccess(final SignEncryptResult result) {
if (mDeleteAfterEncrypt) {
- for (Uri inputUri : mInputUris) {
- DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment.newInstance(inputUri);
- deleteFileDialog.show(getSupportFragmentManager(), "deleteDialog");
- }
+ final Uri[] inputUris = mInputUris.toArray(new Uri[mInputUris.size()]);
+ DeleteFileDialogFragment deleteFileDialog = DeleteFileDialogFragment.newInstance(inputUris);
+ deleteFileDialog.setOnDeletedListener(new DeleteFileDialogFragment.OnDeletedListener() {
+
+ @Override
+ public void onDeleted() {
+ if (mShareAfterEncrypt) {
+ // Share encrypted message/file
+ startActivity(sendWithChooserExcludingEncrypt());
+ } else {
+ // Save encrypted file
+ result.createNotify(EncryptFilesActivity.this).show();
+ }
+ }
+
+ });
+ deleteFileDialog.show(getSupportFragmentManager(), "deleteDialog");
+
mInputUris.clear();
notifyUpdate();
- }
-
- if (mShareAfterEncrypt) {
- // Share encrypted message/file
- startActivity(sendWithChooserExcludingEncrypt());
} else {
- // Save encrypted file
- result.createNotify(EncryptFilesActivity.this).show();
+ if (mShareAfterEncrypt) {
+ // Share encrypted message/file
+ startActivity(sendWithChooserExcludingEncrypt());
+ } else {
+ // Save encrypted file
+ result.createNotify(EncryptFilesActivity.this).show();
+ }
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java
index ace58b165..48737d223 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesFragment.java
@@ -114,6 +114,13 @@ public class EncryptFilesFragment extends Fragment implements EncryptActivityInt
return;
}
+ if (mEncryptInterface.getInputUris().contains(inputUri)) {
+ Notify.showNotify(getActivity(),
+ getActivity().getString(R.string.error_file_added_already, FileHelper.getFilename(getActivity(), inputUri)),
+ Notify.Style.ERROR);
+ return;
+ }
+
mEncryptInterface.getInputUris().add(inputUri);
mEncryptInterface.notifyUpdate();
mSelectedFiles.requestFocus();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
index 71f6fd4bf..d51e2c7fc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -302,7 +302,7 @@ public class ImportKeysActivity extends BaseActivity {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle
Bundle returnData = message.getData();
if (returnData == null) {
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 948da94d8..cc8b47971 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java
@@ -222,7 +222,7 @@ public class ImportKeysProxyActivity extends FragmentActivity {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle
Bundle returnData = message.getData();
if (returnData == null) {
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 43d893fa6..8c34efba2 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java
@@ -270,7 +270,8 @@ public class KeyListFragment extends LoaderFragment
KeyRings.IS_REVOKED,
KeyRings.IS_EXPIRED,
KeyRings.VERIFIED,
- KeyRings.HAS_ANY_SECRET
+ KeyRings.HAS_ANY_SECRET,
+ KeyRings.HAS_DUPLICATE_USER_ID,
};
static final int INDEX_MASTER_KEY_ID = 1;
@@ -279,6 +280,7 @@ public class KeyListFragment extends LoaderFragment
static final int INDEX_IS_EXPIRED = 4;
static final int INDEX_VERIFIED = 5;
static final int INDEX_HAS_ANY_SECRET = 6;
+ static final int INDEX_HAS_DUPLICATE_USER_ID = 7;
static final String ORDER =
KeyRings.HAS_ANY_SECRET + " DESC, UPPER(" + KeyRings.USER_ID + ") ASC";
@@ -552,7 +554,7 @@ public class KeyListFragment extends LoaderFragment
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle
Bundle returnData = message.getData();
if (returnData == null) {
@@ -707,6 +709,7 @@ public class KeyListFragment extends LoaderFragment
boolean isRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0;
boolean isExpired = cursor.getInt(INDEX_IS_EXPIRED) != 0;
boolean isVerified = cursor.getInt(INDEX_VERIFIED) > 0;
+ boolean hasDuplicate = cursor.getInt(INDEX_HAS_DUPLICATE_USER_ID) == 1;
h.mMasterKeyId = masterKeyId;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java
index d1df2906d..d0cea5f05 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SafeSlingerActivity.java
@@ -132,7 +132,7 @@ public class SafeSlingerActivity extends BaseActivity {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle
Bundle returnData = message.getData();
if (returnData == null) {
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java
index 65d7eca37..6f48b7455 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SelectPublicKeyFragment.java
@@ -263,6 +263,8 @@ public class SelectPublicKeyFragment extends ListFragmentWorkaround implements T
KeyRings.IS_REVOKED,
KeyRings.HAS_ENCRYPT,
KeyRings.VERIFIED,
+ KeyRings.HAS_DUPLICATE_USER_ID,
+ KeyRings.CREATION,
};
String inMasterKeyList = null;
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
index e19793fd5..4fb2074a5 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/UploadKeyActivity.java
@@ -113,7 +113,7 @@ public class UploadKeyActivity extends BaseActivity {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
Toast.makeText(UploadKeyActivity.this, R.string.msg_crt_upload_success,
Toast.LENGTH_SHORT).show();
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 3edadec2f..70c590728 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java
@@ -25,6 +25,7 @@ import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ActivityOptions;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
@@ -74,6 +75,7 @@ import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
import org.sufficientlysecure.keychain.ui.linked.LinkedIdWizard;
+import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler.MessageStatus;
import org.sufficientlysecure.keychain.ui.util.FormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State;
@@ -364,6 +366,11 @@ public class ViewKeyActivity extends BaseActivity implements
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void invokeNfcBeam() {
+ // Check if device supports NFC
+ if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC)) {
+ Notify.createNotify(this, R.string.no_nfc_support, Notify.LENGTH_LONG, Notify.Style.ERROR).show();
+ return;
+ }
// Check for available NFC Adapter
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null || !mNfcAdapter.isEnabled()) {
@@ -420,7 +427,7 @@ public class ViewKeyActivity extends BaseActivity implements
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
Bundle data = message.getData();
CertifyResult result = data.getParcelable(CertifyResult.EXTRA_RESULT);
@@ -477,7 +484,7 @@ public class ViewKeyActivity extends BaseActivity implements
Handler returnHandler = new Handler() {
@Override
public void handleMessage(Message message) {
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
setResult(RESULT_CANCELED);
finish();
}
@@ -586,7 +593,7 @@ public class ViewKeyActivity extends BaseActivity implements
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle
Bundle returnData = message.getData();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
index 06db6eadc..8610b2fee 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
@@ -56,6 +56,8 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.ContactHelper;
import org.sufficientlysecure.keychain.util.Log;
+import java.util.List;
+
public class ViewKeyFragment extends LoaderFragment implements
LoaderManager.LoaderCallbacks<Cursor> {
@@ -67,7 +69,7 @@ public class ViewKeyFragment extends LoaderFragment implements
//private ListView mLinkedSystemContact;
boolean mIsSecret = false;
- private String mName;
+ boolean mSystemContactLoaded = false;
LinearLayout mSystemContactLayout;
ImageView mSystemContactPicture;
@@ -209,28 +211,48 @@ public class ViewKeyFragment extends LoaderFragment implements
/**
* Checks if a system contact exists for given masterKeyId, and if it does, sets name, picture
* and onClickListener for the linked system contact's layout
+ * In the case of a secret key, "me" contact details are loaded
*
- * @param name
* @param masterKeyId
*/
- private void loadLinkedSystemContact(String name, final long masterKeyId) {
+ private void loadLinkedSystemContact(final long masterKeyId) {
final Context context = mSystemContactName.getContext();
final ContentResolver resolver = context.getContentResolver();
- final long contactId = ContactHelper.findContactId(resolver, masterKeyId);
+ long contactId;
+ String contactName = null;
+
+ if (mIsSecret) {//all secret keys are linked to "me" profile in contacts
+ contactId = ContactHelper.getMainProfileContactId(resolver);
+ List<String> mainProfileNames = ContactHelper.getMainProfileContactName(context);
+ if (mainProfileNames != null && mainProfileNames.size() > 0) {
+ contactName = mainProfileNames.get(0);
+ }
- if (contactId != -1) {//contact exists for given master key
- mSystemContactName.setText(name);
+ } else {
+ contactId = ContactHelper.findContactId(resolver, masterKeyId);
+ contactName = ContactHelper.getContactName(resolver, contactId);
+ }
- Bitmap picture = ContactHelper.loadPhotoByMasterKeyId(resolver, masterKeyId, true);
+ if (contactName != null) {//contact name exists for given master key
+ mSystemContactName.setText(contactName);
+
+ Bitmap picture;
+ if (mIsSecret) {
+ picture = ContactHelper.loadMainProfilePhoto(resolver, false);
+ } else {
+ picture = ContactHelper.loadPhotoByMasterKeyId(resolver, masterKeyId, false);
+ }
if (picture != null) mSystemContactPicture.setImageBitmap(picture);
+ final long finalContactId = contactId;
mSystemContactLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- launchContactActivity(contactId, context);
+ launchContactActivity(finalContactId, context);
}
});
+ mSystemContactLoaded = true;
}
}
@@ -291,10 +313,7 @@ public class ViewKeyFragment extends LoaderFragment implements
switch (loader.getId()) {
case LOADER_ID_USER_IDS: {
mUserIdsAdapter.swapCursor(cursor);
-
- String guessedName = mUserIdsAdapter.getGuessedName();
- loadLinkedSystemContact(guessedName,
- KeyFormattingUtils.convertFingerprintToKeyId(mFingerprint));
+ loadLinkedSystemContact(KeyFormattingUtils.convertFingerprintToKeyId(mFingerprint));
break;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java
index d22f01a48..e20796f8f 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyTrustFragment.java
@@ -368,7 +368,7 @@ public class ViewKeyTrustFragment extends LoaderFragment implements
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
Bundle returnData = message.getData();
String msg = returnData.getString(KeychainIntentServiceHandler.DATA_MESSAGE);
SpannableStringBuilder ssb = new SpannableStringBuilder();
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 095cb0586..70b57aa93 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
@@ -81,16 +81,6 @@ public class MultiUserIdsAdapter extends CursorAdapter {
ArrayList<String> uids = p.createStringArrayList();
p.recycle();
- if (isHeader == 1) {
- long masterKeyId = cursor.getLong(0);
- vHeaderId.setVisibility(View.VISIBLE);
- String message = mContext.getString(R.string.section_uids_to_certify) +
- KeyFormattingUtils.beautifyKeyIdWithPrefix(mContext, masterKeyId);
- vHeaderId.setText(message);
- } else {
- vHeaderId.setVisibility(View.GONE);
- }
-
{ // first one
String userId = uids.get(0);
String[] splitUserId = KeyRing.splitUserId(userId);
@@ -99,6 +89,21 @@ public class MultiUserIdsAdapter extends CursorAdapter {
} else {
vName.setText(R.string.user_id_no_name);
}
+
+ if (isHeader == 1) {
+ vHeaderId.setVisibility(View.VISIBLE);
+ String message;
+ if (splitUserId[0] != null) {
+ message = mContext.getString(R.string.section_uids_to_certify) +
+ splitUserId[0];
+ } else {
+ message = mContext.getString(R.string.section_uids_to_certify) +
+ context.getString(R.string.user_id_no_name);
+ }
+ vHeaderId.setText(message);
+ } else {
+ vHeaderId.setVisibility(View.GONE);
+ }
}
StringBuilder lines = new StringBuilder();
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 226fda20b..892e30a54 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
@@ -20,6 +20,7 @@ package org.sufficientlysecure.keychain.ui.adapter;
import android.content.Context;
import android.database.Cursor;
import android.support.v4.widget.CursorAdapter;
+import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -35,6 +36,10 @@ import org.sufficientlysecure.keychain.ui.util.Highlighter;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
/**
* Yes this class is abstract!
@@ -44,7 +49,8 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
private String mQuery;
private LayoutInflater mInflater;
- protected int mIndexUserId, mIndexMasterKeyId, mIndexIsExpiry, mIndexIsRevoked;
+ protected int mIndexUserId, mIndexMasterKeyId, mIndexIsExpiry, mIndexIsRevoked,
+ mIndexDuplicateUserId, mIndexCreation;
public SelectKeyCursorAdapter(Context context, Cursor c, int flags, ListView listView) {
super(context, c, flags);
@@ -75,6 +81,8 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
mIndexMasterKeyId = cursor.getColumnIndexOrThrow(KeyRings.MASTER_KEY_ID);
mIndexIsExpiry = cursor.getColumnIndexOrThrow(KeyRings.IS_EXPIRED);
mIndexIsRevoked = cursor.getColumnIndexOrThrow(KeyRings.IS_REVOKED);
+ mIndexDuplicateUserId = cursor.getColumnIndexOrThrow(KeyRings.HAS_DUPLICATE_USER_ID);
+ mIndexCreation = cursor.getColumnIndexOrThrow(KeyRings.CREATION);
}
}
@@ -90,7 +98,7 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
public static class ViewHolderItem {
public View view;
- public TextView mainUserId, mainUserIdRest, keyId;
+ public TextView mainUserId, mainUserIdRest, creation;
public ImageView statusIcon;
public CheckBox selected;
@@ -99,7 +107,7 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
selected.setEnabled(enabled);
mainUserId.setEnabled(enabled);
mainUserIdRest.setEnabled(enabled);
- keyId.setEnabled(enabled);
+ creation.setEnabled(enabled);
statusIcon.setEnabled(enabled);
// Sorta special: We set an item as clickable to disable it in the ListView. This works
@@ -128,8 +136,20 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
h.mainUserIdRest.setVisibility(View.GONE);
}
- long masterKeyId = cursor.getLong(mIndexMasterKeyId);
- h.keyId.setText(KeyFormattingUtils.beautifyKeyIdWithPrefix(mContext, masterKeyId));
+ boolean duplicate = cursor.getLong(mIndexDuplicateUserId) > 0;
+ if (duplicate) {
+ Date creationDate = new Date(cursor.getLong(mIndexCreation) * 1000);
+ Calendar creationCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ creationCal.setTime(creationDate);
+ // convert from UTC to time zone of device
+ creationCal.setTimeZone(TimeZone.getDefault());
+
+ h.creation.setText(context.getString(R.string.label_creation) + ": "
+ + DateFormat.getDateFormat(context).format(creationCal.getTime()));
+ h.creation.setVisibility(View.VISIBLE);
+ } else {
+ h.creation.setVisibility(View.GONE);
+ }
boolean enabled;
if (cursor.getInt(mIndexIsRevoked) != 0) {
@@ -155,7 +175,7 @@ abstract public class SelectKeyCursorAdapter extends CursorAdapter {
holder.view = view;
holder.mainUserId = (TextView) view.findViewById(R.id.select_key_item_name);
holder.mainUserIdRest = (TextView) view.findViewById(R.id.select_key_item_email);
- holder.keyId = (TextView) view.findViewById(R.id.select_key_item_key_id);
+ holder.creation = (TextView) view.findViewById(R.id.select_key_item_creation);
holder.statusIcon = (ImageView) view.findViewById(R.id.select_key_item_status_icon);
holder.selected = (CheckBox) view.findViewById(R.id.selected);
view.setTag(holder);
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 7216bcfb3..1cf3f4d38 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
@@ -177,14 +177,6 @@ public class UserIdsAdapter extends UserAttributesAdapter {
return isRevokedPending;
}
- public String getGuessedName() {
- Cursor cursor = getCursor();
- cursor.moveToFirst();
- String userId = cursor.getString(INDEX_USER_ID);
- String[] splitUserId = KeyRing.splitUserId(userId);
- return splitUserId[0];
- }
-
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mInflater.inflate(R.layout.view_key_adv_user_id_item, null);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java
index c4b437593..bd4e5577b 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/dialog/DeleteFileDialogFragment.java
@@ -18,7 +18,6 @@
package org.sufficientlysecure.keychain.ui.dialog;
import android.app.Dialog;
-import android.content.ContentResolver;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Build;
@@ -34,18 +33,22 @@ import org.sufficientlysecure.keychain.util.FileHelper;
import org.sufficientlysecure.keychain.util.Log;
import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
public class DeleteFileDialogFragment extends DialogFragment {
- private static final String ARG_DELETE_URI = "delete_uri";
+ private static final String ARG_DELETE_URIS = "delete_uris";
+
+ private OnDeletedListener onDeletedListener;
/**
* Creates new instance of this delete file dialog fragment
*/
- public static DeleteFileDialogFragment newInstance(Uri deleteUri) {
+ public static DeleteFileDialogFragment newInstance(Uri... deleteUris) {
DeleteFileDialogFragment frag = new DeleteFileDialogFragment();
Bundle args = new Bundle();
- args.putParcelable(ARG_DELETE_URI, deleteUri);
+ args.putParcelableArray(ARG_DELETE_URIS, deleteUris);
frag.setArguments(args);
@@ -59,12 +62,21 @@ public class DeleteFileDialogFragment extends DialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) {
final FragmentActivity activity = getActivity();
- final Uri deleteUri = getArguments().getParcelable(ARG_DELETE_URI);
- final String deleteFilename = FileHelper.getFilename(getActivity(), deleteUri);
+ final Uri[] deleteUris = (Uri[]) getArguments().getParcelableArray(ARG_DELETE_URIS);
+
+ final StringBuilder deleteFileNames = new StringBuilder();
+ //Retrieving file names after deletion gives unexpected results
+ final HashMap<Uri, String> deleteFileNameMap = new HashMap<>();
+ for (Uri deleteUri : deleteUris) {
+ String deleteFileName = FileHelper.getFilename(getActivity(), deleteUri);
+ deleteFileNames.append('\n').append(deleteFileName);
+ deleteFileNameMap.put(deleteUri, deleteFileName);
+ }
CustomAlertDialogBuilder alert = new CustomAlertDialogBuilder(activity);
- alert.setMessage(this.getString(R.string.file_delete_confirmation, deleteFilename));
+ alert.setTitle(getString(R.string.file_delete_confirmation_title));
+ alert.setMessage(getString(R.string.file_delete_confirmation, deleteFileNames.toString()));
alert.setPositiveButton(R.string.btn_delete, new DialogInterface.OnClickListener() {
@@ -72,43 +84,55 @@ public class DeleteFileDialogFragment extends DialogFragment {
public void onClick(DialogInterface dialog, int id) {
dismiss();
- // NOTE: Use Toasts, not Snackbars. When sharing to another application snackbars
- // would not show up!
+ ArrayList<String> failedFileNameList = new ArrayList<>();
+
+ for (Uri deleteUri : deleteUris) {
+ // Use DocumentsContract on Android >= 4.4
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
+ try {
+ if (DocumentsContract.deleteDocument(getActivity().getContentResolver(), deleteUri)) {
+ continue;
+ }
+ } catch (Exception e) {
+ Log.d(Constants.TAG, "Catched Exception, can happen when delete is not supported!", e);
+ }
+ }
- // Use DocumentsContract on Android >= 4.4
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
try {
- if (DocumentsContract.deleteDocument(getActivity().getContentResolver(), deleteUri)) {
- Toast.makeText(getActivity(), getActivity().getString(R.string.file_delete_successful,
- deleteFilename), Toast.LENGTH_LONG).show();
- return;
+ if (getActivity().getContentResolver().delete(deleteUri, null, null) > 0) {
+ continue;
}
- } catch (UnsupportedOperationException e) {
- Log.d(Constants.TAG, "Catched UnsupportedOperationException, can happen when delete is not supported!", e);
+ } catch (Exception e) {
+ Log.d(Constants.TAG, "Catched Exception, can happen when delete is not supported!", e);
}
- }
- try {
- if (getActivity().getContentResolver().delete(deleteUri, null, null) > 0) {
- Toast.makeText(getActivity(), getActivity().getString(R.string.file_delete_successful,
- deleteFilename), Toast.LENGTH_LONG).show();
- return;
+ // some Uri's a ContentResolver fails to delete is handled by the java.io.File's delete
+ // via the path of the Uri
+ if (new File(deleteUri.getPath()).delete()) {
+ continue;
}
- } catch (UnsupportedOperationException e) {
- Log.d(Constants.TAG, "Catched UnsupportedOperationException, can happen when delete is not supported!", e);
+
+ // Note: We can't delete every file...
+ failedFileNameList.add(deleteFileNameMap.get(deleteUri));
}
- // some Uri's a ContentResolver fails to delete is handled by the java.io.File's delete
- // via the path of the Uri
- if (new File(deleteUri.getPath()).delete()) {
- Toast.makeText(getActivity(), getActivity().getString(R.string.file_delete_successful,
- deleteFilename), Toast.LENGTH_LONG).show();
- return;
+ StringBuilder failedFileNames = new StringBuilder();
+ if (!failedFileNameList.isEmpty()) {
+ for (String failedFileName : failedFileNameList) {
+ failedFileNames.append('\n').append(failedFileName);
+ }
+ failedFileNames.append('\n').append(getActivity().getString(R.string.error_file_delete_failed));
}
- // Note: We can't delete every file...
- Toast.makeText(getActivity(), getActivity().getString(R.string.error_file_delete_failed,
- deleteFilename), Toast.LENGTH_LONG).show();
+ // NOTE: Use Toasts, not Snackbars. When sharing to another application snackbars
+ // would not show up!
+ Toast.makeText(getActivity(), getActivity().getString(R.string.file_delete_successful,
+ deleteUris.length - failedFileNameList.size(), deleteUris.length, failedFileNames.toString()),
+ Toast.LENGTH_LONG).show();
+
+ if (onDeletedListener != null) {
+ onDeletedListener.onDeleted();
+ }
}
});
alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@@ -120,4 +144,18 @@ public class DeleteFileDialogFragment extends DialogFragment {
return alert.show();
}
+
+ public void setOnDeletedListener(OnDeletedListener onDeletedListener) {
+ this.onDeletedListener = onDeletedListener;
+ }
+
+ /**
+ * Callback for performing tasks after the deletion of files
+ */
+ public interface OnDeletedListener {
+
+ public void onDeleted();
+
+ }
+
}
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 32789d53b..20f20c32e 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
@@ -142,7 +142,7 @@ public class DeleteKeyDialogFragment extends DialogFragment {
public void handleMessage(Message message) {
super.handleMessage(message);
// handle messages by standard KeychainIntentServiceHandler first
- if (message.arg1 == MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
try {
Message msg = Message.obtain();
msg.copyFrom(message);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateFinalFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateFinalFragment.java
index 30dfd8dfd..28fbe6f19 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateFinalFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdCreateFinalFragment.java
@@ -188,7 +188,7 @@ public abstract class LinkedIdCreateFinalFragment extends Fragment {
// handle messages by standard KeychainIntentServiceHandler first
super.handleMessage(message);
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
// get returned data bundle
Bundle returnData = message.getData();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdViewFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdViewFragment.java
index 1cec12b26..c39e40761 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdViewFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/linked/LinkedIdViewFragment.java
@@ -557,7 +557,7 @@ public class LinkedIdViewFragment extends Fragment implements
Bundle data = message.getData();
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_UPDATE_PROGRESS) {
+ if (message.arg1 == MessageStatus.UPDATE_PROGRESS.ordinal()) {
if (data.containsKey(DATA_MESSAGE)) {
mViewHolder.vText.setText(data.getString(DATA_MESSAGE));
} else if (data.containsKey(DATA_MESSAGE_ID)) {
@@ -566,7 +566,7 @@ public class LinkedIdViewFragment extends Fragment implements
return;
}
- if (message.arg1 == KeychainIntentServiceHandler.MESSAGE_OKAY) {
+ if (message.arg1 == MessageStatus.OKAY.ordinal()) {
CertifyResult result = data.getParcelable(CertifyResult.EXTRA_RESULT);
result.createNotify(getActivity()).show();
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java
index fc912fccb..460163a47 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/CertifyKeySpinner.java
@@ -68,7 +68,9 @@ public class CertifyKeySpinner extends KeySpinner {
KeychainContract.KeyRings.IS_REVOKED,
KeychainContract.KeyRings.IS_EXPIRED,
KeychainContract.KeyRings.HAS_CERTIFY,
- KeychainContract.KeyRings.HAS_ANY_SECRET
+ KeychainContract.KeyRings.HAS_ANY_SECRET,
+ KeychainContract.KeyRings.HAS_DUPLICATE_USER_ID,
+ KeychainContract.KeyRings.CREATION
};
String where = KeychainContract.KeyRings.HAS_ANY_SECRET + " = 1 AND "
@@ -91,16 +93,31 @@ public class CertifyKeySpinner extends KeySpinner {
mIndexIsRevoked = data.getColumnIndex(KeychainContract.KeyRings.IS_REVOKED);
mIndexIsExpired = data.getColumnIndex(KeychainContract.KeyRings.IS_EXPIRED);
- // If there is only one choice, pick it by default
- if (mAdapter.getCount() == 2) {
+ // If:
+ // - no key has been pre-selected (e.g. by SageSlinger)
+ // - there are actually keys (not just "none" entry)
+ // Then:
+ // - select key that is capable of certifying, but only if there is only one key capable of it
+ if (mSelectedKeyId == Constants.key.none && mAdapter.getCount() > 1) {
// preselect if key can certify
- if (data.moveToPosition(0) && !data.isNull(mIndexHasCertify)) {
- setSelection(1);
+ int selection = -1;
+ while (data.moveToNext()) {
+ if (!data.isNull(mIndexHasCertify)) {
+ if (selection == -1) {
+ selection = data.getPosition() + 1;
+ } else {
+ // if selection is already set, we have more than one certify key!
+ // get back to "none"!
+ selection = 0;
+ }
+ }
}
+ setSelection(selection);
}
}
}
+
@Override
boolean setStatus(Context context, Cursor cursor, ImageView statusView) {
if (cursor.getInt(mIndexIsRevoked) != 0) {
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 d20e2bc99..94a321f29 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
@@ -28,6 +28,7 @@ import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
+import android.text.format.DateFormat;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
@@ -51,9 +52,12 @@ import org.sufficientlysecure.keychain.util.ContactHelper;
import org.sufficientlysecure.keychain.util.Log;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.Collections;
+import java.util.Date;
import java.util.List;
import java.util.Locale;
+import java.util.TimeZone;
public class EncryptKeyCompletionView extends TokenCompleteTextView {
public EncryptKeyCompletionView(Context context) {
@@ -125,7 +129,9 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
KeyRings.USER_ID,
KeyRings.FINGERPRINT,
KeyRings.IS_EXPIRED,
- KeyRings.HAS_ENCRYPT
+ KeyRings.HAS_ENCRYPT,
+ KeyRings.HAS_DUPLICATE_USER_ID,
+ KeyRings.CREATION
};
String where = KeyRings.HAS_ENCRYPT + " NOT NULL AND " + KeyRings.IS_EXPIRED + " = 0 AND "
@@ -153,7 +159,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
public void onFocusChanged(boolean hasFocus, int direction, Rect previous) {
super.onFocusChanged(hasFocus, direction, previous);
if (hasFocus) {
- ((InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE))
+ ((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE))
.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT);
}
}
@@ -180,25 +186,30 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
private String mUserIdFull;
private String[] mUserId;
private long mKeyId;
+ private boolean mHasDuplicate;
+ private Date mCreation;
private String mFingerprint;
- public EncryptionKey(String userId, long keyId, String fingerprint) {
- this.mUserId = KeyRing.splitUserId(userId);
- this.mUserIdFull = userId;
- this.mKeyId = keyId;
- this.mFingerprint = fingerprint;
+ public EncryptionKey(String userId, long keyId, boolean hasDuplicate, Date creation, String fingerprint) {
+ mUserId = KeyRing.splitUserId(userId);
+ mUserIdFull = userId;
+ mKeyId = keyId;
+ mHasDuplicate = hasDuplicate;
+ mCreation = creation;
+ mFingerprint = fingerprint;
}
public EncryptionKey(Cursor cursor) {
this(cursor.getString(cursor.getColumnIndexOrThrow(KeyRings.USER_ID)),
cursor.getLong(cursor.getColumnIndexOrThrow(KeyRings.KEY_ID)),
+ cursor.getLong(cursor.getColumnIndexOrThrow(KeyRings.HAS_DUPLICATE_USER_ID)) > 0,
+ new Date(cursor.getLong(cursor.getColumnIndexOrThrow(KeyRings.CREATION)) * 1000),
KeyFormattingUtils.convertFingerprintToHex(
cursor.getBlob(cursor.getColumnIndexOrThrow(KeyRings.FINGERPRINT))));
-
}
public EncryptionKey(CachedPublicKeyRing ring) throws PgpKeyNotFoundException {
- this(ring.getPrimaryUserId(), ring.extractOrGetMasterKeyId(),
+ this(ring.getPrimaryUserId(), ring.extractOrGetMasterKeyId(), false, null,
KeyFormattingUtils.convertFingerprintToHex(ring.getFingerprint()));
}
@@ -222,13 +233,13 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
if (mUserId[1] != null) {
return mUserId[1];
} else {
- return getKeyIdHex();
+ return getCreationDate();
}
}
public String getTertiary() {
if (mUserId[0] != null) {
- return getKeyIdHex();
+ return getCreationDate();
} else {
return null;
}
@@ -238,6 +249,20 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
return mKeyId;
}
+ public String getCreationDate() {
+ if (mHasDuplicate) {
+ Calendar creationCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ creationCal.setTime(mCreation);
+ // convert from UTC to time zone of device
+ creationCal.setTimeZone(TimeZone.getDefault());
+
+ return getContext().getString(R.string.label_creation) + ": "
+ + DateFormat.getDateFormat(getContext()).format(creationCal.getTime());
+ } else {
+ return null;
+ }
+ }
+
public String getKeyIdHex() {
return KeyFormattingUtils.beautifyKeyIdWithPrefix(getContext(), mKeyId);
}
@@ -278,7 +303,7 @@ public class EncryptKeyCompletionView extends TokenCompleteTextView {
protected boolean keepObject(EncryptionKey obj, String mask) {
String m = mask.toLowerCase(Locale.ENGLISH);
return obj.getUserId().toLowerCase(Locale.ENGLISH).contains(m) ||
- obj.getKeyIdHex().toString().contains(m) ||
+ obj.getKeyIdHex().contains(m) ||
obj.getKeyIdHexShort().startsWith(m);
}
}
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 364712a48..aeb013c71 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
@@ -25,6 +25,7 @@ import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.support.v7.internal.widget.TintSpinner;
+import android.text.format.DateFormat;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
@@ -41,6 +42,10 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Log;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
/**
* Use TintSpinner from AppCompat lib instead of Spinner. Fixes white dropdown icon.
* Related: http://stackoverflow.com/a/27713090
@@ -50,7 +55,7 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo
public void onKeyChanged(long masterKeyId);
}
- protected long mSelectedKeyId;
+ protected long mSelectedKeyId = Constants.key.none;
protected SelectKeyAdapter mAdapter = new SelectKeyAdapter();
protected OnKeyChangedListener mListener;
@@ -135,11 +140,12 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo
protected class SelectKeyAdapter extends BaseAdapter implements SpinnerAdapter {
private CursorAdapter inner;
private int mIndexUserId;
- private int mIndexKeyId;
+ private int mIndexDuplicate;
private int mIndexMasterKeyId;
+ private int mIndexCreationDate;
public SelectKeyAdapter() {
- inner = new CursorAdapter(null, null, 0) {
+ inner = new CursorAdapter(getContext(), null, 0) {
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return View.inflate(getContext(), R.layout.keyspinner_item, null);
@@ -150,12 +156,26 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo
TextView vKeyName = (TextView) view.findViewById(R.id.keyspinner_key_name);
ImageView vKeyStatus = (ImageView) view.findViewById(R.id.keyspinner_key_status);
TextView vKeyEmail = (TextView) view.findViewById(R.id.keyspinner_key_email);
- TextView vKeyId = (TextView) view.findViewById(R.id.keyspinner_key_id);
+ 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]);
- vKeyId.setText(KeyFormattingUtils.beautifyKeyIdWithPrefix(getContext(), cursor.getLong(mIndexKeyId)));
+
+ boolean duplicate = cursor.getLong(mIndexDuplicate) > 0;
+ if (duplicate) {
+ Date creationDate = new Date(cursor.getLong(mIndexCreationDate) * 1000);
+ Calendar creationCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ creationCal.setTime(creationDate);
+ // convert from UTC to time zone of device
+ creationCal.setTimeZone(TimeZone.getDefault());
+
+ vDuplicate.setText(context.getString(R.string.label_creation) + ": "
+ + DateFormat.getDateFormat(context).format(creationCal.getTime()));
+ vDuplicate.setVisibility(View.VISIBLE);
+ } else {
+ vDuplicate.setVisibility(View.GONE);
+ }
boolean valid = setStatus(getContext(), cursor, vKeyStatus);
setItemEnabled(view, valid);
@@ -177,18 +197,18 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo
TextView vKeyName = (TextView) view.findViewById(R.id.keyspinner_key_name);
ImageView vKeyStatus = (ImageView) view.findViewById(R.id.keyspinner_key_status);
TextView vKeyEmail = (TextView) view.findViewById(R.id.keyspinner_key_email);
- TextView vKeyId = (TextView) view.findViewById(R.id.keyspinner_key_id);
+ TextView vKeyDuplicate = (TextView) view.findViewById(R.id.keyspinner_duplicate);
if (enabled) {
vKeyName.setTextColor(Color.BLACK);
vKeyEmail.setTextColor(Color.BLACK);
- vKeyId.setTextColor(Color.BLACK);
+ vKeyDuplicate.setTextColor(Color.BLACK);
vKeyStatus.setVisibility(View.GONE);
view.setClickable(false);
} else {
vKeyName.setTextColor(Color.GRAY);
vKeyEmail.setTextColor(Color.GRAY);
- vKeyId.setTextColor(Color.GRAY);
+ vKeyDuplicate.setTextColor(Color.GRAY);
vKeyStatus.setVisibility(View.VISIBLE);
// this is a HACK. the trick is, if the element itself is clickable, the
// click is not passed on to the view list
@@ -199,10 +219,13 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo
public Cursor swapCursor(Cursor newCursor) {
if (newCursor == null) return inner.swapCursor(null);
- mIndexKeyId = newCursor.getColumnIndex(KeychainContract.KeyRings.KEY_ID);
+ mIndexDuplicate = newCursor.getColumnIndex(KeychainContract.KeyRings.HAS_DUPLICATE_USER_ID);
mIndexUserId = newCursor.getColumnIndex(KeychainContract.KeyRings.USER_ID);
mIndexMasterKeyId = newCursor.getColumnIndex(KeychainContract.KeyRings.MASTER_KEY_ID);
- if (newCursor.moveToFirst()) {
+ mIndexCreationDate = newCursor.getColumnIndex(KeychainContract.KeyRings.CREATION);
+
+ // pre-select key if mSelectedKeyId is given
+ if (mSelectedKeyId != Constants.key.none && newCursor.moveToFirst()) {
do {
if (newCursor.getLong(mIndexMasterKeyId) == mSelectedKeyId) {
setSelection(newCursor.getPosition() + 1);
@@ -253,19 +276,17 @@ public abstract class KeySpinner extends TintSpinner implements LoaderManager.Lo
TextView vKeyName = (TextView) view.findViewById(R.id.keyspinner_key_name);
ImageView vKeyStatus = (ImageView) view.findViewById(R.id.keyspinner_key_status);
TextView vKeyEmail = (TextView) view.findViewById(R.id.keyspinner_key_email);
- TextView vKeyId = (TextView) view.findViewById(R.id.keyspinner_key_id);
+ TextView vKeyDuplicate = (TextView) view.findViewById(R.id.keyspinner_duplicate);
vKeyName.setText(R.string.choice_none);
vKeyEmail.setVisibility(View.GONE);
- vKeyId.setVisibility(View.GONE);
+ vKeyDuplicate.setVisibility(View.GONE);
vKeyStatus.setVisibility(View.GONE);
setItemEnabled(view, true);
} else {
view = inner.getView(position - 1, convertView, parent);
TextView vKeyEmail = (TextView) view.findViewById(R.id.keyspinner_key_email);
- TextView vKeyId = (TextView) view.findViewById(R.id.keyspinner_key_id);
vKeyEmail.setVisibility(View.VISIBLE);
- vKeyId.setVisibility(View.VISIBLE);
}
return view;
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java
index 10327a6a4..df7347fa4 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/widget/SignKeySpinner.java
@@ -59,7 +59,9 @@ public class SignKeySpinner extends KeySpinner {
KeychainContract.KeyRings.IS_REVOKED,
KeychainContract.KeyRings.IS_EXPIRED,
KeychainContract.KeyRings.HAS_SIGN,
- KeychainContract.KeyRings.HAS_ANY_SECRET
+ KeychainContract.KeyRings.HAS_ANY_SECRET,
+ KeychainContract.KeyRings.HAS_DUPLICATE_USER_ID,
+ KeychainContract.KeyRings.CREATION
};
String where = KeychainContract.KeyRings.HAS_ANY_SECRET + " = 1";