diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java index 1cb12a54d..014b7a312 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/HkpKeyserver.java @@ -354,6 +354,7 @@ public class HkpKeyserver extends Keyserver { } entry.setUserIds(userIds); entry.setPrimaryUserId(userIds.get(0)); + entry.setKeyserver(getUrlPrefix() + mHost + ":" + mPort); results.add(entry); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysList.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysList.java index 1a378d61d..e9e24a495 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysList.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysList.java @@ -70,6 +70,10 @@ public class ImportKeysList extends ArrayList { modified = true; } + if (incoming.getKeyserver() != null) { + existing.setKeyserver(incoming.getKeyserver()); + } + // keep track if this key result is from a HKP keyserver boolean incomingFromHkpServer = true; // we’re going to want to try to fetch the key from everywhere we found it, so remember diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java index 933eeeb82..076244344 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java @@ -27,6 +27,7 @@ import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; import org.sufficientlysecure.keychain.pgp.UncachedPublicKey; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; +import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; @@ -40,7 +41,8 @@ import java.util.Map; public class ImportKeysListEntry implements Serializable, Parcelable { private static final long serialVersionUID = -7797972103284992662L; - private byte[] mEncodedRing; + private ParcelableKeyRing mParcelableKeyRing; + private ArrayList mUserIds; private HashMap> mMergedUserIds; private ArrayList>> mSortedUserIds; @@ -55,73 +57,19 @@ public class ImportKeysListEntry implements Serializable, Parcelable { private String mAlgorithm; private boolean mSecretKey; private UserId mPrimaryUserId; + private String mKeyserver; private String mKeybaseName; private String mFbUsername; private String mQuery; private ArrayList mOrigins; private Integer mHashCode = null; - public int describeContents() { - return 0; + public ParcelableKeyRing getParcelableKeyRing() { + return mParcelableKeyRing; } - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeSerializable(mPrimaryUserId); - dest.writeStringList(mUserIds); - dest.writeSerializable(mMergedUserIds); - dest.writeByte((byte) (mRevoked ? 1 : 0)); - dest.writeByte((byte) (mExpired ? 1 : 0)); - dest.writeInt(mDate == null ? 0 : 1); - if (mDate != null) { - dest.writeLong(mDate.getTime()); - } - dest.writeString(mFingerprintHex); - dest.writeString(mKeyIdHex); - dest.writeInt(mBitStrength == null ? 0 : 1); - if (mBitStrength != null) { - dest.writeInt(mBitStrength); - } - dest.writeString(mAlgorithm); - dest.writeByte((byte) (mSecretKey ? 1 : 0)); - dest.writeString(mKeybaseName); - dest.writeString(mFbUsername); - dest.writeStringList(mOrigins); - } - - public static final Creator CREATOR = new Creator() { - public ImportKeysListEntry createFromParcel(final Parcel source) { - ImportKeysListEntry vr = new ImportKeysListEntry(); - vr.mPrimaryUserId = (UserId) source.readSerializable(); - vr.mUserIds = new ArrayList<>(); - source.readStringList(vr.mUserIds); - vr.mMergedUserIds = (HashMap>) source.readSerializable(); - vr.mRevoked = source.readByte() == 1; - vr.mExpired = source.readByte() == 1; - vr.mDate = source.readInt() != 0 ? new Date(source.readLong()) : null; - vr.mFingerprintHex = source.readString(); - vr.mKeyIdHex = source.readString(); - vr.mBitStrength = source.readInt() != 0 ? source.readInt() : null; - vr.mAlgorithm = source.readString(); - vr.mSecretKey = source.readByte() == 1; - vr.mKeybaseName = source.readString(); - vr.mFbUsername = source.readString(); - vr.mOrigins = new ArrayList<>(); - source.readStringList(vr.mOrigins); - - return vr; - } - - public ImportKeysListEntry[] newArray(final int size) { - return new ImportKeysListEntry[size]; - } - }; - - public int hashCode() { - if (mHashCode != null) { - return mHashCode; - } - return super.hashCode(); + public void setParcelableKeyRing(ParcelableKeyRing parcelableKeyRing) { + this.mParcelableKeyRing = parcelableKeyRing; } public boolean hasSameKeyAs(ImportKeysListEntry other) { @@ -163,10 +111,6 @@ public class ImportKeysListEntry implements Serializable, Parcelable { return mRevoked || mExpired; } - public byte[] getEncodedRing() { - return mEncodedRing; - } - public Date getDate() { return mDate; } @@ -227,18 +171,26 @@ public class ImportKeysListEntry implements Serializable, Parcelable { mPrimaryUserId = primaryUserId; } + public String getKeyserver() { + return mKeyserver; + } + + public void setKeyserver(String keyserver) { + mKeyserver = keyserver; + } + public String getKeybaseName() { return mKeybaseName; } - public String getFbUsername() { - return mFbUsername; - } - public void setKeybaseName(String keybaseName) { mKeybaseName = keybaseName; } + public String getFbUsername() { + return mFbUsername; + } + public void setFbUsername(String fbUsername) { mFbUsername = fbUsername; } @@ -259,6 +211,10 @@ public class ImportKeysListEntry implements Serializable, Parcelable { mOrigins.add(origin); } + public int hashCode() { + return mHashCode != null ? mHashCode : super.hashCode(); + } + public List getUserIds() { // To ensure choerency, use methods of this class to edit the list return Collections.unmodifiableList(mUserIds); @@ -314,14 +270,10 @@ public class ImportKeysListEntry implements Serializable, Parcelable { /** * Constructor based on key object, used for import from NFC, QR Codes, files */ - @SuppressWarnings("unchecked") - public ImportKeysListEntry(Context context, UncachedKeyRing ring, byte[] encodedRing) { - mEncodedRing = encodedRing; + public ImportKeysListEntry(Context ctx, UncachedKeyRing ring) { mSecretKey = ring.isSecret(); + UncachedPublicKey key = ring.getPublicKey(); - - mHashCode = key.hashCode(); - setPrimaryUserId(key.getPrimaryUserIdWithFallback()); setKeyId(key.getKeyId()); setFingerprint(key.getFingerprint()); @@ -332,10 +284,17 @@ public class ImportKeysListEntry implements Serializable, Parcelable { mBitStrength = key.getBitStrength(); mCurveOid = key.getCurveOid(); - final int algorithm = key.getAlgorithm(); - mAlgorithm = KeyFormattingUtils.getAlgorithmInfo(context, algorithm, mBitStrength, mCurveOid); + int algorithm = key.getAlgorithm(); + mAlgorithm = KeyFormattingUtils.getAlgorithmInfo(ctx, algorithm, mBitStrength, mCurveOid); + mHashCode = key.hashCode(); setUserIds(key.getUnorderedUserIds()); + + try { + byte[] encoded = ring.getEncoded(); + mParcelableKeyRing = new ParcelableKeyRing(encoded); + } catch (IOException ignored) { + } } private void updateMergedUserIds() { @@ -386,4 +345,62 @@ public class ImportKeysListEntry implements Serializable, Parcelable { }); } + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeParcelable(mParcelableKeyRing, flags); + dest.writeSerializable(mPrimaryUserId); + dest.writeStringList(mUserIds); + dest.writeSerializable(mMergedUserIds); + dest.writeByte((byte) (mRevoked ? 1 : 0)); + dest.writeByte((byte) (mExpired ? 1 : 0)); + dest.writeInt(mDate == null ? 0 : 1); + if (mDate != null) { + dest.writeLong(mDate.getTime()); + } + dest.writeString(mFingerprintHex); + dest.writeString(mKeyIdHex); + dest.writeInt(mBitStrength == null ? 0 : 1); + if (mBitStrength != null) { + dest.writeInt(mBitStrength); + } + dest.writeString(mAlgorithm); + dest.writeByte((byte) (mSecretKey ? 1 : 0)); + dest.writeString(mKeybaseName); + dest.writeString(mFbUsername); + dest.writeStringList(mOrigins); + } + + public static final Creator CREATOR = new Creator() { + public ImportKeysListEntry createFromParcel(final Parcel source) { + ImportKeysListEntry vr = new ImportKeysListEntry(); + vr.mParcelableKeyRing = source.readParcelable(ParcelableKeyRing.class.getClassLoader()); + vr.mPrimaryUserId = (UserId) source.readSerializable(); + vr.mUserIds = new ArrayList<>(); + source.readStringList(vr.mUserIds); + vr.mMergedUserIds = (HashMap>) source.readSerializable(); + vr.mRevoked = source.readByte() == 1; + vr.mExpired = source.readByte() == 1; + vr.mDate = source.readInt() != 0 ? new Date(source.readLong()) : null; + vr.mFingerprintHex = source.readString(); + vr.mKeyIdHex = source.readString(); + vr.mBitStrength = source.readInt() != 0 ? source.readInt() : null; + vr.mAlgorithm = source.readString(); + vr.mSecretKey = source.readByte() == 1; + vr.mKeybaseName = source.readString(); + vr.mFbUsername = source.readString(); + vr.mOrigins = new ArrayList<>(); + source.readStringList(vr.mOrigins); + + return vr; + } + + public ImportKeysListEntry[] newArray(final int size) { + return new ImportKeysListEntry[size]; + } + }; + + public int describeContents() { + return 0; + } + } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java index a94ce0dce..41a065314 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ParcelableKeyRing.java @@ -21,7 +21,8 @@ package org.sufficientlysecure.keychain.keyimport; import android.os.Parcel; import android.os.Parcelable; -/** This class is a parcelable representation of either a keyring as raw data, +/** + * This class is a parcelable representation of either a keyring as raw data, * or a (unique) reference to one as a fingerprint, keyid, or keybase name. */ public class ParcelableKeyRing implements Parcelable { @@ -35,36 +36,23 @@ public class ParcelableKeyRing implements Parcelable { public final String mFbUsername; public ParcelableKeyRing(byte[] bytes) { - this(null, bytes, false); - } - - /** - * @param disAmbiguator useless parameter intended to distinguish this overloaded constructor - * for when null is passed as first two arguments - */ - public ParcelableKeyRing(String expectedFingerprint, byte[] bytes, boolean disAmbiguator) { - mBytes = bytes; - mExpectedFingerprint = expectedFingerprint; - mKeyIdHex = null; - mKeybaseName = null; - mFbUsername = null; - } - - public ParcelableKeyRing(String expectedFingerprint, String keyIdHex) { - mBytes = null; - mExpectedFingerprint = expectedFingerprint; - mKeyIdHex = keyIdHex; - mKeybaseName = null; - mFbUsername = null; + this(bytes, null, null, null, null); } public ParcelableKeyRing(String expectedFingerprint, String keyIdHex, String keybaseName, String fbUsername) { - mBytes = null; - mExpectedFingerprint = expectedFingerprint; - mKeyIdHex = keyIdHex; - mKeybaseName = keybaseName; - mFbUsername = fbUsername; + + this(null, expectedFingerprint, keyIdHex, keybaseName, fbUsername); + } + + public ParcelableKeyRing(byte[] bytes, String expectedFingerprint, String keyIdHex, + String keybaseName, String fbUsername) { + + this.mBytes = bytes; + this.mExpectedFingerprint = expectedFingerprint; + this.mKeyIdHex = keyIdHex; + this.mKeybaseName = keybaseName; + this.mFbUsername = fbUsername; } private ParcelableKeyRing(Parcel source) { @@ -78,6 +66,7 @@ public class ParcelableKeyRing implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeByteArray(mBytes); + dest.writeString(mExpectedFingerprint); dest.writeString(mKeyIdHex); dest.writeString(mKeybaseName); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListCloudLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListCloudLoader.java index 3e0cdd187..b06489d60 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListCloudLoader.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListCloudLoader.java @@ -25,6 +25,7 @@ import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.keyimport.CloudSearch; import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry; import org.sufficientlysecure.keychain.keyimport.Keyserver; +import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; import org.sufficientlysecure.keychain.operations.results.GetKeyResult; import org.sufficientlysecure.keychain.operations.results.OperationResult; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; @@ -38,11 +39,11 @@ import java.util.ArrayList; public class ImportKeysListCloudLoader extends AsyncTaskLoader>> { - Context mContext; + private Context mContext; - Preferences.CloudSearchPrefs mCloudPrefs; - String mServerQuery; + private String mServerQuery; + private Preferences.CloudSearchPrefs mCloudPrefs; private ParcelableProxy mParcelableProxy; private ArrayList mEntryList = new ArrayList<>(); @@ -57,8 +58,10 @@ public class ImportKeysListCloudLoader * and whether to search keybase.io * @param parcelableProxy explicit proxy to use. If null, will retrieve from preferences */ - public ImportKeysListCloudLoader(Context context, String serverQuery, Preferences.CloudSearchPrefs cloudPrefs, + public ImportKeysListCloudLoader(Context context, String serverQuery, + Preferences.CloudSearchPrefs cloudPrefs, @Nullable ParcelableProxy parcelableProxy) { + super(context); mContext = context; mServerQuery = serverQuery; @@ -82,6 +85,12 @@ public class ImportKeysListCloudLoader queryServer(false); } + // Now we have all the data needed to build the parcelable key ring for this key + for (ImportKeysListEntry e : mEntryList) { + e.setParcelableKeyRing(new ParcelableKeyRing(e.getFingerprintHex(), e.getKeyIdHex(), + e.getKeybaseName(), e.getFbUsername())); + } + return mEntryListWrapper; } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListLoader.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListLoader.java index a3c35cd16..33e9c935a 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListLoader.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/processing/ImportKeysListLoader.java @@ -78,7 +78,7 @@ public class ImportKeysListLoader } try { - InputData inputData = getInputData(getContext(), mLoaderState); + InputData inputData = getInputData(mLoaderState); generateListOfKeyrings(inputData); } catch (FileNotFoundException e) { OperationLog log = new OperationLog(); @@ -133,10 +133,11 @@ public class ImportKeysListLoader IteratorWithIOThrow it = UncachedKeyRing.fromStream(bufferedInput); while (it.hasNext()) { UncachedKeyRing ring = it.next(); - byte[] encodedRing = ring.getEncoded(); - ImportKeysListEntry item = new ImportKeysListEntry(getContext(), ring, encodedRing); + + ImportKeysListEntry item = new ImportKeysListEntry(mContext, ring); mData.add(item); - mParcelableRings.put(item.hashCode(), new ParcelableKeyRing(encodedRing)); + + mParcelableRings.put(item.hashCode(), new ParcelableKeyRing(ring.getEncoded())); } } catch (IOException e) { Log.e(Constants.TAG, "IOException on parsing key file! Return NoValidKeysException!", e); @@ -149,13 +150,15 @@ public class ImportKeysListLoader } @NonNull - private static InputData getInputData(Context context, BytesLoaderState loaderState) throws FileNotFoundException { + private InputData getInputData(BytesLoaderState ls) + throws FileNotFoundException { + InputData inputData; - if (loaderState.mKeyBytes != null) { - inputData = new InputData(new ByteArrayInputStream(loaderState.mKeyBytes), loaderState.mKeyBytes.length); - } else if (loaderState.mDataUri != null) { - InputStream inputStream = context.getContentResolver().openInputStream(loaderState.mDataUri); - long length = FileHelper.getFileSize(context, loaderState.mDataUri, -1); + if (ls.mKeyBytes != null) { + inputData = new InputData(new ByteArrayInputStream(ls.mKeyBytes), ls.mKeyBytes.length); + } else if (ls.mDataUri != null) { + InputStream inputStream = mContext.getContentResolver().openInputStream(ls.mDataUri); + long length = FileHelper.getFileSize(mContext, ls.mDataUri, -1); inputData = new InputData(inputStream, length); } else { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java index 606f52fe2..81668f887 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/ImportKeyringParcel.java @@ -26,10 +26,11 @@ import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; import java.util.ArrayList; public class ImportKeyringParcel implements Parcelable { - // if null, keys are expected to be read from a cache file in ImportExportOperations + // If null, keys are expected to be read from a cache file in ImportExportOperations public ArrayList mKeyList; - public String mKeyserver; // must be set if keys are to be imported from a keyserver - public boolean mSkipSave = false; // don't save the key, only return it as part of result + public String mKeyserver; + // If false, don't save the key, only return it as part of result + public boolean mSkipSave = false; public ImportKeyringParcel(ArrayList keyList, String keyserver) { mKeyList = keyList; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeyserverSyncAdapterService.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeyserverSyncAdapterService.java index b71fbada8..ce6dfc645 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeyserverSyncAdapterService.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/service/KeyserverSyncAdapterService.java @@ -466,7 +466,7 @@ public class KeyserverSyncAdapterService extends Service { String hexKeyId = KeyFormattingUtils .convertKeyIdToHex(keyId); // we aren't updating from keybase as of now - keyList.add(new ParcelableKeyRing(fingerprint, hexKeyId)); + keyList.add(new ParcelableKeyRing(fingerprint, hexKeyId, null, null)); } keyCursor.close(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenImportResetFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenImportResetFragment.java index 17baf39b0..bf412dbe2 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenImportResetFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/CreateSecurityTokenImportResetFragment.java @@ -218,7 +218,7 @@ public class CreateSecurityTokenImportResetFragment public void importKey() { ArrayList keyList = new ArrayList<>(); - keyList.add(new ParcelableKeyRing(mTokenFingerprint, null)); + keyList.add(new ParcelableKeyRing(mTokenFingerprint, null, null, null)); mKeyList = keyList; mKeyserver = Preferences.getPreferences(getActivity()).getPreferredKeyserver(); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java index 163e86cc1..2e9107035 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptFragment.java @@ -144,7 +144,7 @@ public abstract class DecryptFragment extends Fragment implements LoaderManager. { ParcelableKeyRing keyEntry = new ParcelableKeyRing(null, - KeyFormattingUtils.convertKeyIdToHex(unknownKeyId)); + KeyFormattingUtils.convertKeyIdToHex(unknownKeyId), null, null); ArrayList selectedEntries = new ArrayList<>(); selectedEntries.add(keyEntry); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java index 79bf55d79..3d863df4c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/DecryptListFragment.java @@ -68,6 +68,7 @@ import android.widget.Toast; import android.widget.ViewAnimator; import com.cocosw.bottomsheet.BottomSheet; + import org.openintents.openpgp.OpenPgpMetadata; import org.openintents.openpgp.OpenPgpSignatureResult; import org.sufficientlysecure.keychain.BuildConfig; @@ -97,24 +98,24 @@ import org.sufficientlysecure.keychain.util.ParcelableHashMap; import org.sufficientlysecure.keychain.util.Preferences; -/** Displays a list of decrypted inputs. - * +/** + * Displays a list of decrypted inputs. + *

* This class has a complex control flow to manage its input URIs. Each URI * which is in mInputUris is also in exactly one of mPendingInputUris, * mCancelledInputUris, mCurrentInputUri, or a key in mInputDataResults. - * + *

* Processing of URIs happens using a looping approach: * - There is always exactly one method running which works on mCurrentInputUri * - Processing starts in cryptoOperation(), which pops a new mCurrentInputUri - * from the list of mPendingInputUris. + * from the list of mPendingInputUris. * - Once a mCurrentInputUri is finished processing, it should be set to null and - * control handed back to cryptoOperation() + * control handed back to cryptoOperation() * - Control flow can move through asynchronous calls, and resume in callbacks - * like onActivityResult() or onPermissionRequestResult(). - * + * like onActivityResult() or onPermissionRequestResult(). */ public class DecryptListFragment - extends QueueingCryptoOperationFragment + extends QueueingCryptoOperationFragment implements OnMenuItemClickListener { public static final String ARG_INPUT_URIS = "input_uris"; @@ -188,7 +189,7 @@ public class DecryptListFragment outState.putParcelableArrayList(ARG_INPUT_URIS, mInputUris); - HashMap results = new HashMap<>(mInputUris.size()); + HashMap results = new HashMap<>(mInputUris.size()); for (Uri uri : mInputUris) { if (mPendingInputUris.contains(uri)) { continue; @@ -218,7 +219,7 @@ public class DecryptListFragment ArrayList inputUris = getArguments().getParcelableArrayList(ARG_INPUT_URIS); ArrayList cancelledUris = args.getParcelableArrayList(ARG_CANCELLED_URIS); - ParcelableHashMap results = args.getParcelable(ARG_RESULTS); + ParcelableHashMap results = args.getParcelable(ARG_RESULTS); mCanDelete = args.getBoolean(ARG_CAN_DELETE, false); @@ -230,11 +231,11 @@ public class DecryptListFragment private void displayInputUris( ArrayList inputUris, ArrayList cancelledUris, - HashMap results) { + HashMap results) { mInputUris = inputUris; mCurrentInputUri = null; - mInputDataResults = results != null ? results : new HashMap(inputUris.size()); + mInputDataResults = results != null ? results : new HashMap(inputUris.size()); mCancelledInputUris = cancelledUris != null ? cancelledUris : new ArrayList(); mPendingInputUris = new ArrayList<>(); @@ -294,7 +295,7 @@ public class DecryptListFragment String filename = metadata.getFilename(); if (TextUtils.isEmpty(filename)) { String ext = MimeTypeMap.getSingleton().getExtensionFromMimeType(metadata.getMimeType()); - filename = "decrypted" + (ext != null ? "."+ext : ""); + filename = "decrypted" + (ext != null ? "." + ext : ""); } // requires >=kitkat @@ -394,7 +395,7 @@ public class DecryptListFragment } - HashMap mIconCache = new HashMap<>(); + HashMap mIconCache = new HashMap<>(); private void processResult(final Uri uri) { @@ -561,7 +562,7 @@ public class DecryptListFragment Intent chooserIntent = Intent.createChooser(intent, getString(R.string.intent_show)); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, - new Parcelable[] { internalIntent }); + new Parcelable[]{internalIntent}); startActivity(chooserIntent); @@ -605,7 +606,7 @@ public class DecryptListFragment .putExtra(DisplayTextActivity.EXTRA_METADATA, metadata), BuildConfig.APPLICATION_ID, R.string.view_internal, R.mipmap.ic_launcher); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, - new Parcelable[] { internalIntent }); + new Parcelable[]{internalIntent}); } startActivity(chooserIntent); @@ -632,7 +633,7 @@ public class DecryptListFragment Log.d(Constants.TAG, "mCurrentInputUri=" + mCurrentInputUri); - if ( ! checkAndRequestReadPermission(activity, mCurrentInputUri)) { + if (!checkAndRequestReadPermission(activity, mCurrentInputUri)) { return null; } @@ -644,15 +645,15 @@ public class DecryptListFragment /** * Request READ_EXTERNAL_STORAGE permission on Android >= 6.0 to read content from "file" Uris. - * + *

* This method returns true on Android < 6, or if permission is already granted. It * requests the permission and returns false otherwise, taking over responsibility * for mCurrentInputUri. - * + *

* see https://commonsware.com/blog/2015/10/07/runtime-permissions-files-action-send.html */ private boolean checkAndRequestReadPermission(Activity activity, final Uri uri) { - if ( ! ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { + if (!ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { return true; } @@ -667,7 +668,7 @@ public class DecryptListFragment } requestPermissions( - new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION_READ_EXTERNAL_STORAGE); return false; @@ -676,8 +677,8 @@ public class DecryptListFragment @Override public void onRequestPermissionsResult(int requestCode, - @NonNull String[] permissions, - @NonNull int[] grantResults) { + @NonNull String[] permissions, + @NonNull int[] grantResults) { if (requestCode != REQUEST_PERMISSION_READ_EXTERNAL_STORAGE) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); @@ -693,7 +694,7 @@ public class DecryptListFragment Iterator it = mCancelledInputUris.iterator(); while (it.hasNext()) { Uri uri = it.next(); - if ( ! ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { + if (!ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { continue; } it.remove(); @@ -711,7 +712,7 @@ public class DecryptListFragment Iterator it = mPendingInputUris.iterator(); while (it.hasNext()) { Uri uri = it.next(); - if ( ! ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { + if (!ContentResolver.SCHEME_FILE.equals(uri.getScheme())) { continue; } it.remove(); @@ -766,7 +767,7 @@ public class DecryptListFragment { ParcelableKeyRing keyEntry = new ParcelableKeyRing(null, - KeyFormattingUtils.convertKeyIdToHex(unknownKeyId)); + KeyFormattingUtils.convertKeyIdToHex(unknownKeyId), null, null); ArrayList selectedEntries = new ArrayList<>(); selectedEntries.add(keyEntry); @@ -974,7 +975,7 @@ public class DecryptListFragment String filename; if (metadata == null) { filename = getString(R.string.filename_unknown); - } else if ( ! TextUtils.isEmpty(metadata.getFilename())) { + } else if (!TextUtils.isEmpty(metadata.getFilename())) { filename = metadata.getFilename(); } else if (ClipDescription.compareMimeTypes(metadata.getMimeType(), Constants.MIME_TYPE_KEYS)) { filename = getString(R.string.filename_keys); @@ -1226,7 +1227,7 @@ public class DecryptListFragment vSigStatusText = (TextView) itemView.findViewById(R.id.result_signature_text); vSignatureLayout = itemView.findViewById(R.id.result_signature_layout); vSignatureName = (TextView) itemView.findViewById(R.id.result_signature_name); - vSignatureMail= (TextView) itemView.findViewById(R.id.result_signature_email); + vSignatureMail = (TextView) itemView.findViewById(R.id.result_signature_email); vSignatureAction = (ViewAnimator) itemView.findViewById(R.id.result_signature_action); vFileList = (LinearLayout) itemView.findViewById(R.id.file_list); 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 4b29ddb56..0429cf82c 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java @@ -362,12 +362,11 @@ public class ImportKeysListFragment extends Fragment implements ArrayList result = data.getResult(); binding.setStatus(result.size() > 0 ? STATUS_LOADED : STATUS_EMPTY); - mAdapter.setLoaderState(mLoaderState); - mAdapter.setData(result); - // free old cached key data mCachedKeyData = null; + mAdapter.setData(result); + GetKeyResult getKeyResult = (GetKeyResult) data.getOperationResult(); switch (loader.getId()) { case LOADER_ID_BYTES: 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 3969f4039..ac2111b6b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysProxyActivity.java @@ -197,7 +197,7 @@ public class ImportKeysProxyActivity extends FragmentActivity } public void importKeys(String fingerprint) { - ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null); + ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null, null); ArrayList selectedEntries = new ArrayList<>(); selectedEntries.add(keyEntry); 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 77139f5de..14d1e649f 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -54,6 +54,7 @@ import android.widget.ViewAnimator; import com.getbase.floatingactionbutton.FloatingActionButton; import com.getbase.floatingactionbutton.FloatingActionsMenu; + import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; @@ -77,6 +78,7 @@ import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.util.FabContainer; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.Preferences; + import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter; import se.emilsjolander.stickylistheaders.StickyListHeadersListView; @@ -244,7 +246,7 @@ public class KeyListFragment extends LoaderFragment @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, - boolean checked) { + boolean checked) { if (checked) { mAdapter.setNewSelection(position, true); } else { @@ -333,7 +335,7 @@ public class KeyListFragment extends LoaderFragment headerCursor.addRow(row); Cursor dataCursor = data; - data = new MergeCursor(new Cursor[] { + data = new MergeCursor(new Cursor[]{ headerCursor, dataCursor }); } @@ -575,7 +577,7 @@ public class KeyListFragment extends LoaderFragment while (cursor.moveToNext()) { byte[] blob = cursor.getBlob(0);//fingerprint column is 0 String fingerprint = KeyFormattingUtils.convertFingerprintToHex(blob); - ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null); + ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null, null); keyList.add(keyEntry); } mKeyList = keyList; 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 4dceb94f0..cd70e7060 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyActivity.java @@ -19,11 +19,6 @@ package org.sufficientlysecure.keychain.ui; -import java.io.IOException; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; - import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; import android.annotation.SuppressLint; @@ -89,10 +84,10 @@ import org.sufficientlysecure.keychain.ui.ViewKeyFragment.PostponeType; import org.sufficientlysecure.keychain.ui.base.BaseSecurityTokenActivity; import org.sufficientlysecure.keychain.ui.base.CryptoOperationHelper; import org.sufficientlysecure.keychain.ui.dialog.SetPassphraseDialogFragment; +import org.sufficientlysecure.keychain.ui.util.ContentDescriptionHint; import org.sufficientlysecure.keychain.ui.util.FormattingUtils; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State; -import org.sufficientlysecure.keychain.ui.util.ContentDescriptionHint; import org.sufficientlysecure.keychain.ui.util.Notify; import org.sufficientlysecure.keychain.ui.util.Notify.ActionListener; import org.sufficientlysecure.keychain.ui.util.Notify.Style; @@ -103,6 +98,11 @@ import org.sufficientlysecure.keychain.util.NfcHelper; import org.sufficientlysecure.keychain.util.Passphrase; import org.sufficientlysecure.keychain.util.Preferences; +import java.io.IOException; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; + public class ViewKeyActivity extends BaseSecurityTokenActivity implements LoaderManager.LoaderCallbacks, @@ -114,7 +114,9 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity implements @Retention(RetentionPolicy.SOURCE) @IntDef({REQUEST_QR_FINGERPRINT, REQUEST_BACKUP, REQUEST_CERTIFY, REQUEST_DELETE}) - private @interface RequestType {} + private @interface RequestType { + } + static final int REQUEST_QR_FINGERPRINT = 1; static final int REQUEST_BACKUP = 2; static final int REQUEST_CERTIFY = 3; @@ -564,7 +566,7 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity implements private void startBackupActivity() { Intent intent = new Intent(this, BackupActivity.class); - intent.putExtra(BackupActivity.EXTRA_MASTER_KEY_IDS, new long[] { mMasterKeyId }); + intent.putExtra(BackupActivity.EXTRA_MASTER_KEY_IDS, new long[]{mMasterKeyId}); intent.putExtra(BackupActivity.EXTRA_SECRET, true); startActivity(intent); } @@ -721,7 +723,7 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity implements manager.beginTransaction() .addToBackStack("security_token") .replace(R.id.view_key_fragment, frag) - // if this is called while the activity wasn't resumed, just forget it happened + // if this is called while the activity wasn't resumed, just forget it happened .commitAllowingStateLoss(); } }); @@ -1104,7 +1106,7 @@ public class ViewKeyActivity extends BaseSecurityTokenActivity implements KeychainContract.Keys.FINGERPRINT, ProviderHelper.FIELD_TYPE_BLOB); String fingerprint = KeyFormattingUtils.convertFingerprintToHex(blob); - ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null); + ParcelableKeyRing keyEntry = new ParcelableKeyRing(fingerprint, null, null, null); ArrayList entries = new ArrayList<>(); entries.add(keyEntry); mKeyList = entries; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java index 267e9503f..1d6af1f21 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java @@ -29,12 +29,9 @@ import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.databinding.ImportKeysListItemBinding; import org.sufficientlysecure.keychain.keyimport.ImportKeysListEntry; import org.sufficientlysecure.keychain.keyimport.ParcelableKeyRing; -import org.sufficientlysecure.keychain.keyimport.processing.BytesLoaderState; -import org.sufficientlysecure.keychain.keyimport.processing.CloudLoaderState; import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListener; import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysOperationCallback; import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysResultListener; -import org.sufficientlysecure.keychain.keyimport.processing.LoaderState; import org.sufficientlysecure.keychain.operations.ImportOperation; import org.sufficientlysecure.keychain.operations.results.ImportKeyResult; import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing; @@ -54,7 +51,6 @@ public class ImportKeysAdapter extends RecyclerView.Adapter mData; private KeyState[] mKeyStates; @@ -73,11 +69,6 @@ public class ImportKeysAdapter extends RecyclerView.Adapter data) { this.mData = data; this.mKeyStates = new KeyState[data.size()]; @@ -145,7 +136,7 @@ public class ImportKeysAdapter extends RecyclerView.Adapter keysList = null; String keyserver = null; - if (mLoaderState instanceof BytesLoaderState) { + ParcelableKeyRing keyRing = entry.getParcelableKeyRing(); + if (keyRing.mBytes != null) { // 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. @@ -217,10 +198,10 @@ public class ImportKeysAdapter extends RecyclerView.Adapter(); keysList.add(keyRing); - keyserver = ((CloudLoaderState) mLoaderState).mCloudPrefs.keyserver; + keyserver = entry.getKeyserver(); } return new ImportKeyringParcel(keysList, keyserver, skipSave); diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java index 0faa27e5f..0df67f2ee 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/EmailKeyHelper.java @@ -57,11 +57,13 @@ public class EmailKeyHelper { // Put them in a list and import ArrayList keys = new ArrayList<>(entries.size()); for (ImportKeysListEntry entry : entries) { - keys.add(new ParcelableKeyRing(entry.getFingerprintHex(), entry.getKeyIdHex())); + keys.add(new ParcelableKeyRing(entry.getFingerprintHex(), entry.getKeyIdHex(), null, + null)); } mKeyList = keys; mKeyserver = keyserver; } + @Override public ImportKeyringParcel createOperationInput() { return new ImportKeyringParcel(mKeyList, mKeyserver);