fix loading of multiple keys simultaneously

This commit is contained in:
Vincent Breitmoser
2016-12-31 19:11:30 +01:00
parent 5fb8efa816
commit b4b13b6afe
5 changed files with 30 additions and 26 deletions

View File

@@ -24,15 +24,18 @@ import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper;
public class ImportKeysOperationCallback implements
CryptoOperationHelper.Callback<ImportKeyringParcel, ImportKeyResult> {
private ImportKeysResultListener mResultListener;
private ImportKeyringParcel mKeyringParcel;
private final ImportKeysResultListener mResultListener;
private final ImportKeyringParcel mKeyringParcel;
private final Integer mPosition;
public ImportKeysOperationCallback(
ImportKeysResultListener resultListener,
ImportKeyringParcel inputParcel
ImportKeyringParcel inputParcel,
Integer position
) {
this.mResultListener = resultListener;
this.mKeyringParcel = inputParcel;
this.mPosition = position;
}
@Override
@@ -42,7 +45,7 @@ public class ImportKeysOperationCallback implements
@Override
public void onCryptoOperationSuccess(ImportKeyResult result) {
mResultListener.handleResult(result);
mResultListener.handleResult(result, mPosition);
}
@Override
@@ -52,7 +55,7 @@ public class ImportKeysOperationCallback implements
@Override
public void onCryptoOperationError(ImportKeyResult result) {
mResultListener.handleResult(result);
mResultListener.handleResult(result, mPosition);
}
@Override

View File

@@ -21,6 +21,6 @@ import org.sufficientlysecure.keychain.operations.results.ImportKeyResult;
public interface ImportKeysResultListener {
void handleResult(ImportKeyResult result);
void handleResult(ImportKeyResult result, Integer position);
}

View File

@@ -37,7 +37,7 @@ public class RemoteImportKeysActivity extends ImportKeysActivity {
}
@Override
public void handleResult(ImportKeyResult result) {
public void handleResult(ImportKeyResult result, Integer position) {
setResult(RESULT_OK, mPendingIntentData);
finish();
}

View File

@@ -359,13 +359,13 @@ public class ImportKeysActivity extends BaseActivity implements ImportKeysListen
}
ImportKeyringParcel inputParcel = new ImportKeyringParcel(null, null);
ImportKeysOperationCallback callback = new ImportKeysOperationCallback(this, inputParcel);
ImportKeysOperationCallback callback = new ImportKeysOperationCallback(this, inputParcel, null);
mOpHelper = new CryptoOperationHelper<>(1, this, callback, R.string.progress_importing);
mOpHelper.cryptoOperation();
}
@Override
public void handleResult(ImportKeyResult result) {
public void handleResult(ImportKeyResult result, Integer position) {
String intentAction = getIntent().getAction();
if (ImportKeysActivity.ACTION_IMPORT_KEY_FROM_KEYSERVER_AND_RETURN_RESULT.equals(intentAction)

View File

@@ -64,7 +64,6 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
private List<ImportKeysListEntry> mData;
private KeyState[] mKeyStates;
private int mCurrent;
private ProviderHelper mProviderHelper;
@@ -83,9 +82,9 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
mKeyStates = new KeyState[data.size()];
for (int i = 0; i < mKeyStates.length; i++) {
mKeyStates[i] = new KeyState();
ImportKeysListEntry entry = mData.get(i);
KeyState keyState = new KeyState();
long keyId = KeyFormattingUtils.convertKeyIdHexToKeyId(entry.getKeyIdHex());
try {
KeyRing keyRing;
@@ -94,15 +93,16 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
} else {
keyRing = mProviderHelper.getCachedPublicKeyRing(keyId);
}
mKeyStates[i].mAlreadyPresent = true;
mKeyStates[i].mVerified = keyRing.getVerified() > 0;
keyState.mAlreadyPresent = true;
keyState.mVerified = keyRing.getVerified() > 0;
} catch (ProviderHelper.NotFoundException | PgpKeyNotFoundException ignored) {
}
mKeyStates[i] = keyState;
}
// If there is only one key, get it automatically
if (mData.size() == 1) {
mCurrent = 0;
getKeyWithProgress(0, mData.get(0), true);
}
@@ -164,8 +164,6 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
@Override
public void onClick(View v) {
if (!keyState.mDownloaded) {
mCurrent = position;
getKeyWithProgress(position, entry, true);
} else {
changeShowed(position, !keyState.mShowed);
@@ -202,13 +200,13 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
private void getKeyWithProgress(int position, ImportKeysListEntry entry, boolean skipSave) {
changeProgress(position, true);
getKey(entry, skipSave);
getKey(position, entry, skipSave);
}
private void getKey(ImportKeysListEntry entry, boolean skipSave) {
private void getKey(int position, ImportKeysListEntry entry, boolean skipSave) {
ImportKeyringParcel inputParcel = prepareKeyOperation(entry, skipSave);
ImportKeysResultListener listener = skipSave ? this : mListener;
ImportKeysOperationCallback cb = new ImportKeysOperationCallback(listener, inputParcel);
ImportKeysOperationCallback cb = new ImportKeysOperationCallback(listener, inputParcel, position);
CryptoOperationHelper opHelper = new CryptoOperationHelper<>(1, mActivity, cb, null);
opHelper.cryptoOperation();
}
@@ -242,7 +240,11 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
}
@Override
public void handleResult(ImportKeyResult result) {
public void handleResult(ImportKeyResult result, Integer position) {
if (position == null) {
throw new IllegalArgumentException("position parameter must be non-null!");
}
boolean resultStatus = result.success();
Log.e(Constants.TAG, "getKey result: " + resultStatus);
if (resultStatus) {
@@ -252,13 +254,13 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
Log.e(Constants.TAG, "Key ID: " + keyRing.getMasterKeyId() +
"| isRev: " + keyRing.isRevoked() + "| isExp: " + keyRing.isExpired());
ImportKeysListEntry entry = mData.get(mCurrent);
ImportKeysListEntry entry = mData.get(position);
entry.setUpdated(result.isOkUpdated());
mergeEntryWithKey(entry, keyRing);
mKeyStates[mCurrent].mDownloaded = true;
changeShowed(mCurrent, true);
mKeyStates[position].mDownloaded = true;
changeShowed(position, true);
} else {
throw new RuntimeException("getKey retrieved more than one key ("
+ canKeyRings.size() + ")");
@@ -267,7 +269,7 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
result.createNotify(mActivity).show();
}
changeProgress(mCurrent, false);
changeProgress(position, false);
}
private void mergeEntryWithKey(ImportKeysListEntry entry, CanonicalizedKeyRing keyRing) {
@@ -308,5 +310,4 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
keyState.mProgress = progress;
notifyItemChanged(position);
}
}