ImportKeys: Add import single key from file

- Refactoring needed
This commit is contained in:
Andrea Torlaschi
2016-07-07 23:43:29 +02:00
parent 40d6d1f750
commit a5b1f46642
5 changed files with 68 additions and 16 deletions

View File

@@ -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<String> mUserIds;
private HashMap<String, HashSet<String>> 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();

View File

@@ -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<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> {
@@ -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<UncachedKeyRing> 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);

View File

@@ -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<ImportKeysListEntry> result = data.getResult();
binding.setStatus(result.size() > 0 ? STATUS_LOADED : STATUS_EMPTY);
mAdapter.setLoaderState(mLoaderState);
mAdapter.setData(result);
// free old cached key data

View File

@@ -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<ImportKeysAdapter.ViewHolder> {
private Context mContext;
private ImportKeysListener mListener;
private boolean mNonInteractive;
private LoaderState mLoaderState;
private List<ImportKeysListEntry> 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<ImportKeysAdapter.Vi
public ImageView status;
public View userIdsDivider;
public LinearLayout userIdsList;
public Button importButton;
public ViewHolder(View container) {
super(container);
@@ -80,6 +90,10 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
notifyDataSetChanged();
}
public void setLoaderState(LoaderState loaderState) {
this.mLoaderState = loaderState;
}
public void setData(List<ImportKeysListEntry> data) {
this.mData = data;
notifyDataSetChanged();
@@ -119,6 +133,7 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
vh.status = (ImageView) v.findViewById(R.id.import_item_status);
vh.userIdsDivider = v.findViewById(R.id.import_item_status_divider);
vh.userIdsList = (LinearLayout) v.findViewById(R.id.import_item_user_ids_list);
vh.importButton = (Button) v.findViewById(R.id.import_item_button);
return vh;
}
@@ -126,8 +141,19 @@ public class ImportKeysAdapter extends RecyclerView.Adapter<ImportKeysAdapter.Vi
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final ImportKeysListEntry entry = mData.get(position);
Highlighter highlighter = new Highlighter(mContext, entry.getQuery());
holder.importButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mLoaderState instanceof BytesLoaderState) {
mListener.importKey(new ParcelableKeyRing(entry.getEncodedRing()));
} else if (mLoaderState instanceof CloudLoaderState) {
//TODO
}
}
});
Highlighter highlighter = new Highlighter(mContext, entry.getQuery());
// main user id
String userId = entry.getUserIds().get(0);
OpenPgpUtils.UserId userIdSplit = KeyRing.splitUserId(userId);

View File

@@ -105,6 +105,7 @@
android:padding="8dp">
<Button
android:id="@+id/import_item_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"