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 fc3b05c48..dd8094e42 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keyimport/ImportKeysListEntry.java @@ -37,6 +37,7 @@ import java.util.HashSet; public class ImportKeysListEntry implements Serializable, Parcelable { private static final long serialVersionUID = -7797972103284992662L; + private byte[] mEncodedRing; private ArrayList mUserIds; private HashMap> mMergedUserIds; private long mKeyId; @@ -140,6 +141,10 @@ public class ImportKeysListEntry implements Serializable, Parcelable { mExpired = expired; } + public byte[] getEncodedRing() { + return mEncodedRing; + } + public long getKeyId() { return mKeyId; } @@ -272,7 +277,8 @@ 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) { + public ImportKeysListEntry(Context context, UncachedKeyRing ring, byte[] encodedRing) { + mEncodedRing = encodedRing; mSecretKey = ring.isSecret(); UncachedPublicKey key = ring.getPublicKey(); 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 bba52a65e..a3c35cd16 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 @@ -18,13 +18,6 @@ package org.sufficientlysecure.keychain.keyimport.processing; -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; - import android.content.Context; import android.support.annotation.NonNull; import android.support.v4.content.AsyncTaskLoader; @@ -44,6 +37,13 @@ import org.sufficientlysecure.keychain.util.InputData; import org.sufficientlysecure.keychain.util.Log; import org.sufficientlysecure.keychain.util.PositionAwareInputStream; +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; + public class ImportKeysListLoader extends AsyncTaskLoader>> { @@ -117,7 +117,9 @@ public class ImportKeysListLoader return mParcelableRings; } - /** Reads all PGPKeyRing objects from the bytes of an InputData object. */ + /** + * Reads all PGPKeyRing objects from the bytes of an InputData object. + */ private void generateListOfKeyrings(InputData inputData) { PositionAwareInputStream progressIn = new PositionAwareInputStream( inputData.getInputStream()); @@ -131,9 +133,10 @@ public class ImportKeysListLoader IteratorWithIOThrow it = UncachedKeyRing.fromStream(bufferedInput); while (it.hasNext()) { UncachedKeyRing ring = it.next(); - ImportKeysListEntry item = new ImportKeysListEntry(getContext(), ring); + byte[] encodedRing = ring.getEncoded(); + ImportKeysListEntry item = new ImportKeysListEntry(getContext(), ring, encodedRing); mData.add(item); - mParcelableRings.put(item.hashCode(), new ParcelableKeyRing(ring.getEncoded())); + mParcelableRings.put(item.hashCode(), new ParcelableKeyRing(encodedRing)); } } catch (IOException e) { Log.e(Constants.TAG, "IOException on parsing key file! Return NoValidKeysException!", e); 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 cfe9bf1ca..097d33784 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java @@ -45,6 +45,7 @@ import org.sufficientlysecure.keychain.keyimport.processing.BytesLoaderState; import org.sufficientlysecure.keychain.keyimport.processing.CloudLoaderState; import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListCloudLoader; import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListLoader; +import org.sufficientlysecure.keychain.keyimport.processing.ImportKeysListener; import org.sufficientlysecure.keychain.keyimport.processing.LoaderState; import org.sufficientlysecure.keychain.operations.results.GetKeyResult; import org.sufficientlysecure.keychain.service.input.RequiredInputParcel; @@ -70,6 +71,7 @@ public class ImportKeysListFragment extends Fragment implements public static final String ARG_CLOUD_SEARCH_PREFS = "cloud_search_prefs"; private FragmentActivity mActivity; + private ImportKeysListener mCallback; private ImportKeysListFragmentBinding binding; private ParcelableProxy mParcelableProxy; @@ -200,7 +202,7 @@ public class ImportKeysListFragment extends Fragment implements mRecyclerView.setLayoutManager(layoutManager); // Create an empty adapter we will use to display the loaded data. - mAdapter = new ImportKeysAdapter(mActivity, nonInteractive); + mAdapter = new ImportKeysAdapter(mActivity, mCallback, nonInteractive); mRecyclerView.setAdapter(mAdapter); if (dataUri != null || bytes != null) { @@ -222,6 +224,18 @@ public class ImportKeysListFragment extends Fragment implements return view; } + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + + try { + mCallback = (ImportKeysListener) activity; + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + + " must implement ImportKeysListener"); + } + } + @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @@ -297,6 +311,8 @@ 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 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 4f98eb650..1467a35c7 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 @@ -19,12 +19,11 @@ package org.sufficientlysecure.keychain.ui.adapter; import android.content.Context; import android.graphics.Color; -import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -32,6 +31,11 @@ import android.widget.TextView; import org.openintents.openpgp.util.OpenPgpUtils; import org.sufficientlysecure.keychain.R; 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.LoaderState; import org.sufficientlysecure.keychain.operations.ImportOperation; import org.sufficientlysecure.keychain.pgp.KeyRing; import org.sufficientlysecure.keychain.ui.util.FormattingUtils; @@ -49,11 +53,16 @@ import java.util.Map; public class ImportKeysAdapter extends RecyclerView.Adapter { private Context mContext; + private ImportKeysListener mListener; private boolean mNonInteractive; + + private LoaderState mLoaderState; private List mData; - public ImportKeysAdapter(Context mContext, boolean mNonInteractive) { + public ImportKeysAdapter(Context mContext, ImportKeysListener listener, boolean mNonInteractive) { + this.mContext = mContext; + this.mListener = listener; this.mNonInteractive = mNonInteractive; } @@ -68,6 +77,7 @@ public class ImportKeysAdapter extends RecyclerView.Adapter data) { this.mData = data; notifyDataSetChanged(); @@ -119,6 +133,7 @@ public class ImportKeysAdapter extends RecyclerView.Adapter