aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2014-10-04 23:16:58 +0200
committerVincent Breitmoser <valodim@mugenguild.com>2014-10-04 23:18:07 +0200
commit015291eb61e39987cad42c0f9b0f98d24b6dbf99 (patch)
tree0d38efc41b462d886ad68e898aff0b68e2c34b7c /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui
parentbad8aeea781bad8db11d8d2df9cfc7ca579f6adc (diff)
parentfbf993e6211d03308d62a3edf270f9d5a8783fb2 (diff)
downloadopen-keychain-015291eb61e39987cad42c0f9b0f98d24b6dbf99.tar.gz
open-keychain-015291eb61e39987cad42c0f9b0f98d24b6dbf99.tar.bz2
open-keychain-015291eb61e39987cad42c0f9b0f98d24b6dbf99.zip
Merge branch 'jacobshack-certify' of github.com:open-keychain/open-keychain into jacobshack-certify
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/AddKeysActivity.java269
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java65
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MultiCertifyKeyFragment.java6
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/AsyncTaskResultWrapper.java12
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java32
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java18
6 files changed, 221 insertions, 181 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/AddKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/AddKeysActivity.java
index ecc72c24d..479a874d9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/AddKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/AddKeysActivity.java
@@ -31,32 +31,36 @@ import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.ImageView;
+import com.google.zxing.integration.android.IntentIntegrator;
+import com.google.zxing.integration.android.IntentResult;
+
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
-import org.sufficientlysecure.keychain.keyimport.Keyserver;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.service.KeychainIntentService;
import org.sufficientlysecure.keychain.service.KeychainIntentServiceHandler;
+import org.sufficientlysecure.keychain.service.results.GetKeyResult;
import org.sufficientlysecure.keychain.service.results.ImportKeyResult;
import org.sufficientlysecure.keychain.service.results.OperationResult;
import org.sufficientlysecure.keychain.ui.adapter.AsyncTaskResultWrapper;
-import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListCloudLoader;
import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListLoader;
import org.sufficientlysecure.keychain.ui.util.Notify;
import org.sufficientlysecure.keychain.ui.widget.ExchangeKeySpinner;
import org.sufficientlysecure.keychain.ui.widget.KeySpinner;
import org.sufficientlysecure.keychain.util.InputData;
+import org.sufficientlysecure.keychain.util.IntentIntegratorSupportV4;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.ParcelableFileCache;
+import org.sufficientlysecure.keychain.util.Preferences;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Iterator;
+import java.util.Locale;
import edu.cmu.cylab.starslinger.exchange.ExchangeActivity;
import edu.cmu.cylab.starslinger.exchange.ExchangeConfig;
@@ -68,6 +72,7 @@ public class AddKeysActivity extends ActionBarActivity implements
View mActionSafeSlinger;
ImageView mActionSafeSlingerIcon;
View mActionQrCode;
+ View mActionNfc;
View mActionSearchCloud;
ProviderHelper mProviderHelper;
@@ -75,14 +80,10 @@ public class AddKeysActivity extends ActionBarActivity implements
long mExchangeMasterKeyId = Constants.key.none;
byte[] mImportBytes;
- private LongSparseArray<ParcelableKeyRing> mCachedKeyData;
-
private static final int REQUEST_CODE_SAFE_SLINGER = 1;
-
private static final int LOADER_ID_BYTES = 0;
- private static final int LOADER_ID_CLOUD = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -90,7 +91,7 @@ public class AddKeysActivity extends ActionBarActivity implements
mProviderHelper = new ProviderHelper(this);
- setContentView(R.layout.add_key_activity);
+ setContentView(R.layout.add_keys_activity);
mSafeSlingerKeySpinner = (ExchangeKeySpinner) findViewById(R.id.add_keys_safeslinger_key_spinner);
mActionSafeSlinger = findViewById(R.id.add_keys_safeslinger);
@@ -99,6 +100,7 @@ public class AddKeysActivity extends ActionBarActivity implements
mActionSafeSlingerIcon.setColorFilter(getResources().getColor(R.color.tertiary_text_light),
PorterDuff.Mode.SRC_IN);
mActionQrCode = findViewById(R.id.add_keys_qr_code);
+ mActionNfc = findViewById(R.id.add_keys_nfc);
mActionSearchCloud = findViewById(R.id.add_keys_search_cloud);
mSafeSlingerKeySpinner.setOnKeyChangedListener(new KeySpinner.OnKeyChangedListener() {
@@ -122,6 +124,16 @@ public class AddKeysActivity extends ActionBarActivity implements
}
});
+ mActionNfc.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // show nfc help
+ Intent intent = new Intent(AddKeysActivity.this, HelpActivity.class);
+ intent.putExtra(HelpActivity.EXTRA_SELECTED_TAB, HelpActivity.TAB_NFC);
+ startActivityForResult(intent, 0);
+ }
+ });
+
mActionSearchCloud.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -153,10 +165,12 @@ public class AddKeysActivity extends ActionBarActivity implements
}
private void startQrCode() {
-
+ // scan using xzing's Barcode Scanner
+ new IntentIntegrator(this).initiateScan();
}
private void searchCloud() {
+ finish();
Intent importIntent = new Intent(this, ImportKeysActivity.class);
startActivity(importIntent);
}
@@ -169,28 +183,57 @@ public class AddKeysActivity extends ActionBarActivity implements
result.createNotify(this).show();
} else {
switch (requestCode) {
- case REQUEST_CODE_SAFE_SLINGER:
+ case REQUEST_CODE_SAFE_SLINGER: {
switch (resultCode) {
case ExchangeActivity.RESULT_EXCHANGE_OK:
// import exchanged keys
mImportBytes = getSlingedKeys(data);
getSupportLoaderManager().restartLoader(LOADER_ID_BYTES, null, this);
-// Intent importIntent = new Intent(this, ImportKeysActivity.class);
-// importIntent.setAction(ImportKeysActivity.ACTION_IMPORT_KEY);
-// importIntent.putExtra(ImportKeysActivity.EXTRA_KEY_BYTES, getSlingedKeys(data));
-// startActivity(importIntent);
break;
case ExchangeActivity.RESULT_EXCHANGE_CANCELED:
- // handle canceled result
- // ...
+ // do nothing
break;
}
break;
+ }
+ case IntentIntegratorSupportV4.REQUEST_CODE: {
+ IntentResult scanResult = IntentIntegratorSupportV4.parseActivityResult(requestCode,
+ resultCode, data);
+ if (scanResult != null && scanResult.getFormatName() != null) {
+ String scannedContent = scanResult.getContents();
+
+ Log.d(Constants.TAG, "scannedContent: " + scannedContent);
+
+ // look if it's fingerprint only
+ if (scannedContent.toLowerCase(Locale.ENGLISH).startsWith(Constants.FINGERPRINT_SCHEME)) {
+ importKeys(null, getFingerprintFromUri(Uri.parse(scanResult.getContents())));
+ return;
+ }
+
+ // is this a full key encoded as qr code?
+ if (scannedContent.startsWith("-----BEGIN PGP")) {
+ // TODO
+// mImportActivity.loadCallback(new ImportKeysListFragment.BytesLoaderState(scannedContent.getBytes(), null));
+ return;
+ }
+
+ // fail...
+ Notify.showNotify(this, R.string.import_qr_code_wrong, Notify.Style.ERROR);
+ }
+
+ break;
+ }
}
super.onActivityResult(requestCode, resultCode, data);
}
}
+ private String getFingerprintFromUri(Uri dataUri) {
+ String fingerprint = dataUri.toString().split(":")[1].toLowerCase(Locale.ENGLISH);
+ Log.d(Constants.TAG, "fingerprint: " + fingerprint);
+ return fingerprint;
+ }
+
private static byte[] getSlingedKeys(Intent data) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -221,10 +264,6 @@ public class AddKeysActivity extends ActionBarActivity implements
InputData inputData = new InputData(new ByteArrayInputStream(mImportBytes), mImportBytes.length);
return new ImportKeysListLoader(this, inputData);
}
- case LOADER_ID_CLOUD: {
-// ImportKeysListFragment.CloudLoaderState ls = (ImportKeysListFragment.CloudLoaderState) mLoaderState;
-// return new ImportKeysListCloudLoader(this, ls.mServerQuery, ls.mCloudPrefs);
- }
default:
return null;
@@ -232,74 +271,50 @@ public class AddKeysActivity extends ActionBarActivity implements
}
@Override
- public void onLoadFinished(Loader<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> loader, AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> data) {
-
+ public void onLoadFinished(Loader<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> loader,
+ AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> data) {
Log.d(Constants.TAG, "data: " + data.getResult());
- // swap in the real data!
-// mAdapter.setData(data.getResult());
-// mAdapter.notifyDataSetChanged();
-//
-// setListAdapter(mAdapter);
-//
-// // The list should now be shown.
-// if (isResumed()) {
-// setListShown(true);
-// } else {
-// setListShownNoAnimation(true);
-// }
-
- Exception error = data.getError();
-
- // free old cached key data
- mCachedKeyData = null;
+ GetKeyResult getKeyResult = (GetKeyResult) data.getOperationResult();
+ LongSparseArray<ParcelableKeyRing> cachedKeyData = null;
// TODO: Use parcels!!!!!!!!!!!!!!!
switch (loader.getId()) {
case LOADER_ID_BYTES:
- if (error == null) {
+ if (getKeyResult.success()) {
// No error
- mCachedKeyData = ((ImportKeysListLoader) loader).getParcelableRings();
- } else if (error instanceof ImportKeysListLoader.NoValidKeysException) {
- Notify.showNotify(this, R.string.error_import_no_valid_keys, Notify.Style.ERROR);
- } else if (error instanceof ImportKeysListLoader.NonPgpPartException) {
- Notify.showNotify(this,
- ((ImportKeysListLoader.NonPgpPartException) error).getCount() + " " + getResources().
- getQuantityString(R.plurals.error_import_non_pgp_part,
- ((ImportKeysListLoader.NonPgpPartException) error).getCount()),
- Notify.Style.OK
- );
+ cachedKeyData = ((ImportKeysListLoader) loader).getParcelableRings();
} else {
- Notify.showNotify(this, R.string.error_generic_report_bug, Notify.Style.ERROR);
+ getKeyResult.createNotify(this).show();
}
- break;
-
- case LOADER_ID_CLOUD:
- if (error == null) {
- // No error
- } else if (error instanceof Keyserver.QueryTooShortException) {
- Notify.showNotify(this, R.string.error_query_too_short, Notify.Style.ERROR);
- } else if (error instanceof Keyserver.TooManyResponsesException) {
- Notify.showNotify(this, R.string.error_too_many_responses, Notify.Style.ERROR);
- } else if (error instanceof Keyserver.QueryTooShortOrTooManyResponsesException) {
- Notify.showNotify(this, R.string.error_too_short_or_too_many_responses, Notify.Style.ERROR);
- } else if (error instanceof Keyserver.QueryFailedException) {
- Log.d(Constants.TAG,
- "Unrecoverable keyserver query error: " + error.getLocalizedMessage());
- String alert = this.getString(R.string.error_searching_keys);
- alert = alert + " (" + error.getLocalizedMessage() + ")";
- Notify.showNotify(this, alert, Notify.Style.ERROR);
- }
+// if (error == null) {
+// // No error
+// cachedKeyData = ((ImportKeysListLoader) loader).getParcelableRings();
+// Log.d(Constants.TAG, "no error!:" + cachedKeyData);
+//
+// } else if (error instanceof ImportKeysListLoader.NoValidKeysException) {
+// Notify.showNotify(this, R.string.error_import_no_valid_keys, Notify.Style.ERROR);
+// } else if (error instanceof ImportKeysListLoader.NonPgpPartException) {
+// Notify.showNotify(this,
+// ((ImportKeysListLoader.NonPgpPartException) error).getCount() + " " + getResources().
+// getQuantityString(R.plurals.error_import_non_pgp_part,
+// ((ImportKeysListLoader.NonPgpPartException) error).getCount()),
+// Notify.Style.OK
+// );
+// } else {
+// Notify.showNotify(this, R.string.error_generic_report_bug, Notify.Style.ERROR);
+// }
break;
+
default:
break;
}
- importKeys();
+ importKeys(cachedKeyData, null);
}
@Override
@@ -309,44 +324,42 @@ public class AddKeysActivity extends ActionBarActivity implements
// Clear the data in the adapter.
// mAdapter.clear();
break;
- case LOADER_ID_CLOUD:
- // Clear the data in the adapter.
-// mAdapter.clear();
- break;
default:
break;
}
}
- public ParcelableFileCache.IteratorWithSize<ParcelableKeyRing> getSelectedData() {
+ public ParcelableFileCache.IteratorWithSize<ParcelableKeyRing>
+ getSelectedData(final LongSparseArray<ParcelableKeyRing> keyData) {
return new ParcelableFileCache.IteratorWithSize<ParcelableKeyRing>() {
int i = 0;
@Override
public int getSize() {
- return mCachedKeyData.size();
+ return keyData.size();
}
@Override
public boolean hasNext() {
- return (mCachedKeyData.get(i + 1) != null);
+ return (i < getSize());
}
@Override
public ParcelableKeyRing next() {
- ParcelableKeyRing key = mCachedKeyData.get(i);
+ // get the object by the key.
+ ParcelableKeyRing key = keyData.valueAt(i);
i++;
return key;
}
@Override
public void remove() {
- mCachedKeyData.remove(i);
+ keyData.remove(i);
}
};
}
- public void importKeys() {
+ public void importKeys(final LongSparseArray<ParcelableKeyRing> keyData, String fingerprint) {
// Message is received after importing is done in KeychainIntentService
KeychainIntentServiceHandler saveHandler = new KeychainIntentServiceHandler(
this,
@@ -370,27 +383,18 @@ public class AddKeysActivity extends ActionBarActivity implements
return;
}
-// if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT.equals(getIntent().getAction())
-// || ACTION_IMPORT_KEY_FROM_FILE_AND_RETURN.equals(getIntent().getAction())) {
-// Intent intent = new Intent();
-// intent.putExtra(ImportKeyResult.EXTRA_RESULT, result);
-// ImportKeysActivity.this.setResult(RESULT_OK, intent);
-// ImportKeysActivity.this.finish();
-// return;
-// }
-// if (ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_TO_SERVICE.equals(getIntent().getAction())) {
-// ImportKeysActivity.this.setResult(RESULT_OK, mPendingIntentData);
-// ImportKeysActivity.this.finish();
-// return;
-// }
+ finish();
+ Intent certifyIntent = new Intent(); // TODO: certify
+ certifyIntent.putExtra(ImportKeyResult.EXTRA_RESULT, result);
+ certifyIntent.putExtra("key ids", result.getImportedMasterKeyIds()); // TODO: extra
+ startActivity(certifyIntent);
result.createNotify(AddKeysActivity.this).show();
}
}
};
-// ImportKeysListFragment.LoaderState ls = mListFragment.getLoaderState();
-// if (importBytes != null) {
+ if (keyData != null) {
Log.d(Constants.TAG, "importKeys started");
// Send all information needed to service to import key in other thread
@@ -401,9 +405,6 @@ public class AddKeysActivity extends ActionBarActivity implements
// fill values for this action
Bundle data = new Bundle();
- // get DATA from selected key entries
-// ParcelableFileCache.IteratorWithSize<ParcelableKeyRing> selectedEntries = mListFragment.getSelectedData();
-
// instead of giving the entries by Intent extra, cache them into a
// file to prevent Java Binder problems on heavy imports
// read FileImportCache for more info.
@@ -412,7 +413,7 @@ public class AddKeysActivity extends ActionBarActivity implements
// display here, we should be able to import.
ParcelableFileCache<ParcelableKeyRing> cache =
new ParcelableFileCache<ParcelableKeyRing>(this, "key_import.pcl");
- cache.writeCache(getSelectedData());
+ cache.writeCache(getSelectedData(keyData));
intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
@@ -429,36 +430,44 @@ public class AddKeysActivity extends ActionBarActivity implements
Log.e(Constants.TAG, "Problem writing cache file", e);
Notify.showNotify(this, "Problem writing cache file!", Notify.Style.ERROR);
}
-// } else if (ls instanceof ImportKeysListFragment.CloudLoaderState) {
-// ImportKeysListFragment.CloudLoaderState sls = (ImportKeysListFragment.CloudLoaderState) ls;
-//
-// // Send all information needed to service to query keys in other thread
-// Intent intent = new Intent(this, KeychainIntentService.class);
-//
-// intent.setAction(KeychainIntentService.ACTION_DOWNLOAD_AND_IMPORT_KEYS);
-//
-// // fill values for this action
-// Bundle data = new Bundle();
-//
-// data.putString(KeychainIntentService.DOWNLOAD_KEY_SERVER, sls.mCloudPrefs.keyserver);
-//
-// // get selected key entries
-// ArrayList<ImportKeysListEntry> selectedEntries = mListFragment.getSelectedEntries();
-// data.putParcelableArrayList(KeychainIntentService.DOWNLOAD_KEY_LIST, selectedEntries);
-//
-// intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
-//
-// // Create a new Messenger for the communication back
-// Messenger messenger = new Messenger(saveHandler);
-// intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
-//
-// // show progress dialog
-// saveHandler.showProgressDialog(this);
-//
-// // start service with intent
-// startService(intent);
-// } else {
-// Notify.showNotify(this, R.string.error_nothing_import, Notify.Style.ERROR);
-// }
+ } else if (fingerprint != null) {
+
+ // search config
+ Preferences prefs = Preferences.getPreferences(this);
+ Preferences.CloudSearchPrefs cloudPrefs = new Preferences.CloudSearchPrefs(true, true, prefs.getPreferredKeyserver());
+
+ // Send all information needed to service to query keys in other thread
+ Intent intent = new Intent(this, KeychainIntentService.class);
+
+ intent.setAction(KeychainIntentService.ACTION_DOWNLOAD_AND_IMPORT_KEYS);
+
+ // fill values for this action
+ Bundle data = new Bundle();
+
+ data.putString(KeychainIntentService.DOWNLOAD_KEY_SERVER, cloudPrefs.keyserver);
+
+ final ImportKeysListEntry keyEntry = new ImportKeysListEntry();
+ keyEntry.setFingerprintHex(fingerprint);
+ keyEntry.setBitStrength(1337);
+ keyEntry.addOrigin(cloudPrefs.keyserver);
+ ArrayList<ImportKeysListEntry> selectedEntries = new ArrayList<ImportKeysListEntry>();
+ selectedEntries.add(keyEntry);
+
+ data.putParcelableArrayList(KeychainIntentService.DOWNLOAD_KEY_LIST, selectedEntries);
+
+ intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
+
+ // Create a new Messenger for the communication back
+ Messenger messenger = new Messenger(saveHandler);
+ intent.putExtra(KeychainIntentService.EXTRA_MESSENGER, messenger);
+
+ // show progress dialog
+ saveHandler.showProgressDialog(this);
+
+ // start service with intent
+ startService(intent);
+ } else {
+ Notify.showNotify(this, R.string.error_nothing_import, Notify.Style.ERROR);
+ }
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
index 16ebd6aca..ad50ecd3d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
@@ -31,6 +31,7 @@ import android.widget.ListView;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.service.results.GetKeyResult;
import org.sufficientlysecure.keychain.util.ParcelableFileCache.IteratorWithSize;
import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
@@ -285,48 +286,60 @@ public class ImportKeysListFragment extends ListFragment implements
setListShownNoAnimation(true);
}
- Exception error = data.getError();
-
// free old cached key data
mCachedKeyData = null;
+ GetKeyResult getKeyResult = (GetKeyResult) data.getOperationResult();
switch (loader.getId()) {
case LOADER_ID_BYTES:
- if (error == null) {
+ if (getKeyResult.success()) {
// No error
mCachedKeyData = ((ImportKeysListLoader) loader).getParcelableRings();
- } else if (error instanceof ImportKeysListLoader.NoValidKeysException) {
- Notify.showNotify(getActivity(), R.string.error_import_no_valid_keys, Notify.Style.ERROR);
- } else if (error instanceof ImportKeysListLoader.NonPgpPartException) {
- Notify.showNotify(getActivity(),
- ((ImportKeysListLoader.NonPgpPartException) error).getCount() + " " + getResources().
- getQuantityString(R.plurals.error_import_non_pgp_part,
- ((ImportKeysListLoader.NonPgpPartException) error).getCount()),
- Notify.Style.OK
- );
} else {
- Notify.showNotify(getActivity(), R.string.error_generic_report_bug, Notify.Style.ERROR);
+ getKeyResult.createNotify(getActivity()).show();
}
+// if (error == null) {
+// // No error
+// mCachedKeyData = ((ImportKeysListLoader) loader).getParcelableRings();
+// } else if (error instanceof ImportKeysListLoader.NoValidKeysException) {
+// Notify.showNotify(getActivity(), R.string.error_import_no_valid_keys, Notify.Style.ERROR);
+// } else if (error instanceof ImportKeysListLoader.NonPgpPartException) {
+// Notify.showNotify(getActivity(),
+// ((ImportKeysListLoader.NonPgpPartException) error).getCount() + " " + getResources().
+// getQuantityString(R.plurals.error_import_non_pgp_part,
+// ((ImportKeysListLoader.NonPgpPartException) error).getCount()),
+// Notify.Style.OK
+// );
+// } else {
+// Notify.showNotify(getActivity(), R.string.error_generic_report_bug, Notify.Style.ERROR);
+// }
break;
case LOADER_ID_CLOUD:
- if (error == null) {
+ if (getKeyResult.success()) {
// No error
- } else if (error instanceof Keyserver.QueryTooShortException) {
- Notify.showNotify(getActivity(), R.string.error_query_too_short, Notify.Style.ERROR);
- } else if (error instanceof Keyserver.TooManyResponsesException) {
- Notify.showNotify(getActivity(), R.string.error_too_many_responses, Notify.Style.ERROR);
- } else if (error instanceof Keyserver.QueryTooShortOrTooManyResponsesException) {
- Notify.showNotify(getActivity(), R.string.error_too_short_or_too_many_responses, Notify.Style.ERROR);
- } else if (error instanceof Keyserver.QueryFailedException) {
- Log.d(Constants.TAG,
- "Unrecoverable keyserver query error: " + error.getLocalizedMessage());
- String alert = getActivity().getString(R.string.error_searching_keys);
- alert = alert + " (" + error.getLocalizedMessage() + ")";
- Notify.showNotify(getActivity(), alert, Notify.Style.ERROR);
+ } else {
+ getKeyResult.createNotify(getActivity()).show();
}
+
+
+// if (error == null) {
+// // No error
+// } else if (error instanceof Keyserver.QueryTooShortException) {
+// Notify.showNotify(getActivity(), R.string.error_query_too_short, Notify.Style.ERROR);
+// } else if (error instanceof Keyserver.TooManyResponsesException) {
+// Notify.showNotify(getActivity(), R.string.error_too_many_responses, Notify.Style.ERROR);
+// } else if (error instanceof Keyserver.QueryTooShortOrTooManyResponsesException) {
+// Notify.showNotify(getActivity(), R.string.error_too_short_or_too_many_responses, Notify.Style.ERROR);
+// } else if (error instanceof Keyserver.QueryFailedException) {
+// Log.d(Constants.TAG,
+// "Unrecoverable keyserver query error: " + error.getLocalizedMessage());
+// String alert = getActivity().getString(R.string.error_searching_keys);
+// alert = alert + " (" + error.getLocalizedMessage() + ")";
+// Notify.showNotify(getActivity(), alert, Notify.Style.ERROR);
+// }
break;
default:
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MultiCertifyKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MultiCertifyKeyFragment.java
index 03cd6c431..a835f3652 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MultiCertifyKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/MultiCertifyKeyFragment.java
@@ -239,12 +239,6 @@ public class MultiCertifyKeyFragment extends LoaderFragment
if (!subGrouped) {
// 1. This name should NOT be grouped with the previous, so we flush the buffer
- /*/ Special case: only a single user id (first && last)
- if (data.isFirst()) {
- lastMasterKeyId = masterKeyId;
- uids.add(userId);
- }*/
-
Parcel p = Parcel.obtain();
p.writeStringList(uids);
byte[] d = p.marshall();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/AsyncTaskResultWrapper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/AsyncTaskResultWrapper.java
index 5f2aec4fe..dc0c5846a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/AsyncTaskResultWrapper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/AsyncTaskResultWrapper.java
@@ -17,6 +17,8 @@
package org.sufficientlysecure.keychain.ui.adapter;
+import org.sufficientlysecure.keychain.service.results.OperationResult;
+
/**
* The AsyncTaskResultWrapper is used to wrap a result from a AsyncTask (for example: Loader).
* You can pass the result and an exception in it if an error occurred.
@@ -28,19 +30,19 @@ package org.sufficientlysecure.keychain.ui.adapter;
public class AsyncTaskResultWrapper<T> {
private final T mResult;
- private final Exception mError;
+ private final OperationResult mOperationResult;
- public AsyncTaskResultWrapper(T result, Exception error) {
+ public AsyncTaskResultWrapper(T result, OperationResult operationResult) {
this.mResult = result;
- this.mError = error;
+ this.mOperationResult = operationResult;
}
public T getResult() {
return mResult;
}
- public Exception getError() {
- return mError;
+ public OperationResult getOperationResult() {
+ return mOperationResult;
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java
index 0332e8882..cb51a15a9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListCloudLoader.java
@@ -21,6 +21,9 @@ import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.keyimport.Keyserver;
+import org.sufficientlysecure.keychain.service.results.GetKeyResult;
+import org.sufficientlysecure.keychain.service.results.OperationResult;
import org.sufficientlysecure.keychain.util.Preferences;
import org.sufficientlysecure.keychain.keyimport.CloudSearch;
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
@@ -93,7 +96,8 @@ public class ImportKeysListCloudLoader
*/
private void queryServer(boolean enforceFingerprint) {
try {
- ArrayList<ImportKeysListEntry> searchResult = CloudSearch.search(mServerQuery, mCloudPrefs);
+ ArrayList<ImportKeysListEntry> searchResult
+ = CloudSearch.search(mServerQuery, mCloudPrefs);
mEntryList.clear();
// add result to data
@@ -114,9 +118,29 @@ public class ImportKeysListCloudLoader
} else {
mEntryList.addAll(searchResult);
}
- mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, null);
- } catch (Exception e) {
- mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, e);
+ GetKeyResult getKeyResult = new GetKeyResult(GetKeyResult.RESULT_OK, null);
+ mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, getKeyResult);
+ } catch (Keyserver.CloudSearchFailureException e) {
+ // convert exception to result parcel
+ int error = GetKeyResult.RESULT_ERROR;
+ OperationResult.LogType logType = null;
+ if (e instanceof Keyserver.QueryFailedException) {
+ error = GetKeyResult.RESULT_ERROR_QUERY_FAILED;
+ logType = OperationResult.LogType.MSG_GET_QUERY_FAILED;
+ } else if (e instanceof Keyserver.TooManyResponsesException) {
+ error = GetKeyResult.RESULT_ERROR_TOO_MANY_RESPONSES;
+ logType = OperationResult.LogType.MSG_GET_TOO_MANY_RESPONSES;
+ } else if (e instanceof Keyserver.QueryTooShortException) {
+ error = GetKeyResult.RESULT_ERROR_QUERY_TOO_SHORT;
+ logType = OperationResult.LogType.MSG_GET_QUERY_TOO_SHORT;
+ } else if (e instanceof Keyserver.QueryTooShortOrTooManyResponsesException) {
+ error = GetKeyResult.RESULT_ERROR_TOO_SHORT_OR_TOO_MANY_RESPONSES;
+ logType = OperationResult.LogType.MSG_GET_QUERY_TOO_SHORT_OR_TOO_MANY_RESPONSES;
+ }
+ OperationResult.OperationLog log = new OperationResult.OperationLog();
+ log.add(logType, 0);
+ GetKeyResult getKeyResult = new GetKeyResult(error, log);
+ mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mEntryList, getKeyResult);
}
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
index 04947da93..6664cb61a 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysListLoader.java
@@ -25,6 +25,8 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry;
import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing;
import org.sufficientlysecure.keychain.pgp.UncachedKeyRing;
+import org.sufficientlysecure.keychain.service.results.GetKeyResult;
+import org.sufficientlysecure.keychain.service.results.OperationResult;
import org.sufficientlysecure.keychain.util.InputData;
import org.sufficientlysecure.keychain.util.Log;
import org.sufficientlysecure.keychain.util.PositionAwareInputStream;
@@ -37,9 +39,6 @@ import java.util.Iterator;
public class ImportKeysListLoader
extends AsyncTaskLoader<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> {
- public static class NoValidKeysException extends Exception {
- }
-
public static class NonPgpPartException extends Exception {
private int mCount;
@@ -72,7 +71,8 @@ public class ImportKeysListLoader
return mEntryListWrapper;
}
- mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mData, null);
+ GetKeyResult getKeyResult = new GetKeyResult(GetKeyResult.RESULT_OK, null);
+ mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mData, getKeyResult);
if (mInputData == null) {
Log.e(Constants.TAG, "Input data is null!");
@@ -136,13 +136,11 @@ public class ImportKeysListLoader
}
} catch (IOException e) {
Log.e(Constants.TAG, "IOException on parsing key file! Return NoValidKeysException!", e);
-
- NoValidKeysException e1 = new NoValidKeysException();
+ OperationResult.OperationLog log = new OperationResult.OperationLog();
+ log.add(OperationResult.LogType.MSG_GET_NO_VALID_KEYS, 0);
+ GetKeyResult getKeyResult = new GetKeyResult(GetKeyResult.RESULT_ERROR_NO_VALID_KEYS, log);
mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>
- (mData, e1);
- } catch (Exception e) {
- Log.e(Constants.TAG, "Other Exception on parsing key file!", e);
- mEntryListWrapper = new AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>(mData, e);
+ (mData, getKeyResult);
}
}