aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2014-04-06 12:57:42 +0200
committerDominik Schürmann <dominik@dominikschuermann.de>2014-04-06 12:57:42 +0200
commit6d1137190529dc7add74926cea52c377883319be (patch)
treefd88b29a048f3aec1daa2a84bbaf22c0efa3663f /OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
parent17997dd362fe62d72113a0536069d0fdb9c3211b (diff)
downloadopen-keychain-6d1137190529dc7add74926cea52c377883319be.tar.gz
open-keychain-6d1137190529dc7add74926cea52c377883319be.tar.bz2
open-keychain-6d1137190529dc7add74926cea52c377883319be.zip
Rename folder structure from OpenPGP Keychain to OpenKeychain
Diffstat (limited to 'OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java305
1 files changed, 305 insertions, 0 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
new file mode 100644
index 000000000..077fa0cab
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
@@ -0,0 +1,305 @@
+/*
+ * Copyright (C) 2012-2014 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.sufficientlysecure.keychain.ui;
+
+import android.app.Activity;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.ListFragment;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.Loader;
+import android.view.View;
+import android.widget.ListView;
+import com.devspark.appmsg.AppMsg;
+import org.sufficientlysecure.keychain.Constants;
+import org.sufficientlysecure.keychain.R;
+import org.sufficientlysecure.keychain.helper.Preferences;
+import org.sufficientlysecure.keychain.ui.adapter.AsyncTaskResultWrapper;
+import org.sufficientlysecure.keychain.ui.adapter.ImportKeysAdapter;
+import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListEntry;
+import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListLoader;
+import org.sufficientlysecure.keychain.ui.adapter.ImportKeysListServerLoader;
+import org.sufficientlysecure.keychain.util.InputData;
+import org.sufficientlysecure.keychain.util.KeyServer;
+import org.sufficientlysecure.keychain.util.Log;
+
+import java.io.ByteArrayInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ImportKeysListFragment extends ListFragment implements
+ LoaderManager.LoaderCallbacks<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> {
+ private static final String ARG_DATA_URI = "uri";
+ private static final String ARG_BYTES = "bytes";
+ private static final String ARG_SERVER_QUERY = "query";
+
+ private Activity mActivity;
+ private ImportKeysAdapter mAdapter;
+
+ private byte[] mKeyBytes;
+ private Uri mDataUri;
+ private String mServerQuery;
+ private String mKeyServer;
+
+ private static final int LOADER_ID_BYTES = 0;
+ private static final int LOADER_ID_SERVER_QUERY = 1;
+
+ public byte[] getKeyBytes() {
+ return mKeyBytes;
+ }
+
+ public Uri getDataUri() {
+ return mDataUri;
+ }
+
+ public String getServerQuery() {
+ return mServerQuery;
+ }
+
+ public String getKeyServer() {
+ return mKeyServer;
+ }
+
+ public List<ImportKeysListEntry> getData() {
+ return mAdapter.getData();
+ }
+
+ public ArrayList<ImportKeysListEntry> getSelectedData() {
+ return mAdapter.getSelectedData();
+ }
+
+ /**
+ * Creates new instance of this fragment
+ */
+ public static ImportKeysListFragment newInstance(byte[] bytes, Uri dataUri, String serverQuery) {
+ ImportKeysListFragment frag = new ImportKeysListFragment();
+
+ Bundle args = new Bundle();
+ args.putByteArray(ARG_BYTES, bytes);
+ args.putParcelable(ARG_DATA_URI, dataUri);
+ args.putString(ARG_SERVER_QUERY, serverQuery);
+
+ frag.setArguments(args);
+
+ return frag;
+ }
+
+ /**
+ * Define Adapter and Loader on create of Activity
+ */
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ mActivity = getActivity();
+
+ // Give some text to display if there is no data. In a real
+ // application this would come from a resource.
+ setEmptyText(mActivity.getString(R.string.error_nothing_import));
+
+ // Create an empty adapter we will use to display the loaded data.
+ mAdapter = new ImportKeysAdapter(mActivity);
+ setListAdapter(mAdapter);
+
+ mDataUri = getArguments().getParcelable(ARG_DATA_URI);
+ mKeyBytes = getArguments().getByteArray(ARG_BYTES);
+ mServerQuery = getArguments().getString(ARG_SERVER_QUERY);
+
+ // TODO: this is used when scanning QR Code. Currently it simply uses keyserver nr 0
+ mKeyServer = Preferences.getPreferences(getActivity())
+ .getKeyServers()[0];
+
+ if (mDataUri != null || mKeyBytes != null) {
+ // Start out with a progress indicator.
+ setListShown(false);
+
+ // Prepare the loader. Either re-connect with an existing one,
+ // or start a new one.
+ // give arguments to onCreateLoader()
+ getLoaderManager().initLoader(LOADER_ID_BYTES, null, this);
+ }
+
+ if (mServerQuery != null && mKeyServer != null) {
+ // Start out with a progress indicator.
+ setListShown(false);
+
+ // Prepare the loader. Either re-connect with an existing one,
+ // or start a new one.
+ // give arguments to onCreateLoader()
+ getLoaderManager().initLoader(LOADER_ID_SERVER_QUERY, null, this);
+ }
+ }
+
+ @Override
+ public void onListItemClick(ListView l, View v, int position, long id) {
+ super.onListItemClick(l, v, position, id);
+
+ // Select checkbox!
+ // Update underlying data and notify adapter of change. The adapter will
+ // update the view automatically.
+ ImportKeysListEntry entry = mAdapter.getItem(position);
+ entry.setSelected(!entry.isSelected());
+ mAdapter.notifyDataSetChanged();
+ }
+
+ public void loadNew(byte[] keyBytes, Uri dataUri, String serverQuery, String keyServer) {
+ mKeyBytes = keyBytes;
+ mDataUri = dataUri;
+ mServerQuery = serverQuery;
+ mKeyServer = keyServer;
+
+ if (mKeyBytes != null || mDataUri != null) {
+ // Start out with a progress indicator.
+ setListShown(false);
+
+ getLoaderManager().restartLoader(LOADER_ID_BYTES, null, this);
+ }
+
+ if (mServerQuery != null && mKeyServer != null) {
+ // Start out with a progress indicator.
+ setListShown(false);
+
+ getLoaderManager().restartLoader(LOADER_ID_SERVER_QUERY, null, this);
+ }
+ }
+
+ @Override
+ public Loader<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>>
+ onCreateLoader(int id, Bundle args) {
+ switch (id) {
+ case LOADER_ID_BYTES: {
+ InputData inputData = getInputData(mKeyBytes, mDataUri);
+ return new ImportKeysListLoader(mActivity, inputData);
+ }
+ case LOADER_ID_SERVER_QUERY: {
+ return new ImportKeysListServerLoader(getActivity(), mServerQuery, mKeyServer);
+ }
+
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public void onLoadFinished(Loader<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> loader,
+ AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>> data) {
+ // Swap the new cursor in. (The framework will take care of closing the
+ // old cursor once we return.)
+
+ 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();
+
+ switch (loader.getId()) {
+ case LOADER_ID_BYTES:
+
+ if (error == null) {
+ // No error
+ } else if (error instanceof ImportKeysListLoader.FileHasNoContent) {
+ AppMsg.makeText(getActivity(), R.string.error_import_file_no_content,
+ AppMsg.STYLE_ALERT).show();
+ } else if (error instanceof ImportKeysListLoader.NonPgpPart) {
+ AppMsg.makeText(getActivity(),
+ ((ImportKeysListLoader.NonPgpPart) error).getCount() + " " + getResources().
+ getQuantityString(R.plurals.error_import_non_pgp_part,
+ ((ImportKeysListLoader.NonPgpPart) error).getCount()),
+ new AppMsg.Style(AppMsg.LENGTH_LONG, R.color.confirm)).show();
+ } else {
+ AppMsg.makeText(getActivity(), R.string.error_generic_report_bug,
+ new AppMsg.Style(AppMsg.LENGTH_LONG, R.color.alert)).show();
+ }
+ break;
+
+ case LOADER_ID_SERVER_QUERY:
+
+ if (error == null) {
+ AppMsg.makeText(
+ getActivity(), getResources().getQuantityString(R.plurals.keys_found,
+ mAdapter.getCount(), mAdapter.getCount()),
+ AppMsg.STYLE_INFO
+ ).show();
+ } else if (error instanceof KeyServer.InsufficientQuery) {
+ AppMsg.makeText(getActivity(), R.string.error_keyserver_insufficient_query,
+ AppMsg.STYLE_ALERT).show();
+ } else if (error instanceof KeyServer.QueryException) {
+ AppMsg.makeText(getActivity(), R.string.error_keyserver_query,
+ AppMsg.STYLE_ALERT).show();
+ } else if (error instanceof KeyServer.TooManyResponses) {
+ AppMsg.makeText(getActivity(), R.string.error_keyserver_too_many_responses,
+ AppMsg.STYLE_ALERT).show();
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public void onLoaderReset(Loader<AsyncTaskResultWrapper<ArrayList<ImportKeysListEntry>>> loader) {
+ switch (loader.getId()) {
+ case LOADER_ID_BYTES:
+ // Clear the data in the adapter.
+ mAdapter.clear();
+ break;
+ case LOADER_ID_SERVER_QUERY:
+ // Clear the data in the adapter.
+ mAdapter.clear();
+ break;
+ default:
+ break;
+ }
+ }
+
+ private InputData getInputData(byte[] importBytes, Uri dataUri) {
+ InputData inputData = null;
+ if (importBytes != null) {
+ inputData = new InputData(new ByteArrayInputStream(importBytes), importBytes.length);
+ } else if (dataUri != null) {
+ try {
+ InputStream inputStream = getActivity().getContentResolver().openInputStream(dataUri);
+ int length = inputStream.available();
+
+ inputData = new InputData(inputStream, length);
+ } catch (FileNotFoundException e) {
+ Log.e(Constants.TAG, "FileNotFoundException!", e);
+ } catch (IOException e) {
+ Log.e(Constants.TAG, "IOException!", e);
+ }
+ }
+
+ return inputData;
+ }
+
+}