aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Breitmoser <valodim@mugenguild.com>2014-10-03 04:06:44 +0200
committerVincent Breitmoser <valodim@mugenguild.com>2014-10-03 04:16:14 +0200
commit504064302bc9f3949b416d6f48b2f5835ac64514 (patch)
tree394a264242f76c06aad7e12451d52a2f1d38ef31
parent04c8d42436896b9696687f6d5f1b3c7a2dd3fced (diff)
downloadopen-keychain-504064302bc9f3949b416d6f48b2f5835ac64514.tar.gz
open-keychain-504064302bc9f3949b416d6f48b2f5835ac64514.tar.bz2
open-keychain-504064302bc9f3949b416d6f48b2f5835ac64514.zip
actually use iterator interface for ParcelableFileCache in activities
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java11
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java43
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/ImportKeysAdapter.java11
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java6
4 files changed, 52 insertions, 19 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
index cabc5eb71..3df29e507 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysActivity.java
@@ -39,6 +39,7 @@ import android.view.ViewGroup;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.api.OpenKeychainIntents;
+import org.sufficientlysecure.keychain.ui.ImportKeysListFragment.IteratorWithSize;
import org.sufficientlysecure.keychain.ui.util.FormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.util.Preferences;
@@ -481,15 +482,17 @@ public class ImportKeysActivity extends ActionBarActivity {
Bundle data = new Bundle();
// get DATA from selected key entries
- ArrayList<ParcelableKeyRing> selectedEntries = mListFragment.getSelectedData();
+ IteratorWithSize<ParcelableKeyRing> selectedEntries = mListFragment.getSelectedData();
- // instead of given the entries by Intent extra, cache them into a file
- // to prevent Java Binder problems on heavy imports
+ // 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.
try {
+ // We parcel this iteratively into a file - anything we can
+ // display here, we should be able to import.
ParcelableFileCache<ParcelableKeyRing> cache =
new ParcelableFileCache<ParcelableKeyRing>(this, "key_import.pcl");
- cache.writeCache(selectedEntries.size(), selectedEntries.iterator());
+ cache.writeCache(selectedEntries.getSize(), selectedEntries);
intent.putExtra(KeychainIntentService.EXTRA_DATA, data);
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 e30af6b29..1d9935aa1 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ImportKeysListFragment.java
@@ -48,6 +48,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
public class ImportKeysListFragment extends ListFragment implements
@@ -74,12 +75,42 @@ public class ImportKeysListFragment extends ListFragment implements
return mAdapter.getData();
}
- public ArrayList<ParcelableKeyRing> getSelectedData() {
- ArrayList<ParcelableKeyRing> result = new ArrayList<ParcelableKeyRing>();
- for (ImportKeysListEntry entry : getSelectedEntries()) {
- result.add(mCachedKeyData.get(entry.hashCode()));
- }
- return result;
+ // Tuples would make this easier...
+ public static interface IteratorWithSize<E> extends Iterator<E> {
+ int getSize();
+ }
+
+ /** Returns an Iterator (with size) of the selected data items.
+ * This iterator is sort of a tradeoff, it's slightly more complex than an
+ * ArrayList would have been, but we save some memory by just returning
+ * relevant elements on demand.
+ */
+ public IteratorWithSize<ParcelableKeyRing> getSelectedData() {
+ final ArrayList<ImportKeysListEntry> entries = getSelectedEntries();
+ final Iterator<ImportKeysListEntry> it = entries.iterator();
+ return new IteratorWithSize<ParcelableKeyRing>() {
+
+ @Override
+ public int getSize() {
+ return entries.size();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return it.hasNext();
+ }
+
+ @Override
+ public ParcelableKeyRing next() {
+ // throws NoSuchElementException if it doesn't exist, but that's not our problem
+ return mCachedKeyData.get(it.next().hashCode());
+ }
+
+ @Override
+ public void remove() {
+ it.remove();
+ }
+ };
}
public ArrayList<ImportKeysListEntry> getSelectedEntries() {
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 7b378ae79..b9eb4c8d4 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
@@ -41,7 +41,6 @@ import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -91,17 +90,13 @@ public class ImportKeysAdapter extends ArrayAdapter<ImportKeysListEntry> {
}
public ArrayList<ImportKeysListEntry> getSelectedEntries() {
- ArrayList<ImportKeysListEntry> selectedData = new ArrayList<ImportKeysListEntry>();
- // Nothing to select, nvm.
- if (mData == null) {
- return selectedData;
- }
+ ArrayList<ImportKeysListEntry> result = new ArrayList<ImportKeysListEntry>();
for (ImportKeysListEntry entry : mData) {
if (entry.isSelected()) {
- selectedData.add(entry);
+ result.add(entry);
}
}
- return selectedData;
+ return result;
}
@Override
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java
index 3b4facbd0..e6345b1c3 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ParcelableFileCache.java
@@ -55,6 +55,10 @@ public class ParcelableFileCache<E extends Parcelable> {
mFilename = filename;
}
+ /** This method returns the number of entries as valid for the iterator
+ * received by the latest readCache operation. Yes, it is slightly
+ * peculiar.
+ */
public int getNumEntries() {
return mNumEntries;
}
@@ -107,7 +111,7 @@ public class ParcelableFileCache<E extends Parcelable> {
throw new IOException(e);
}
- // yes this is slightly sloppy data flow. WE WOULDN'T NEED THIS WITH TUPLE RETURN TYPES
+ // yes this is sloppy data flow. WE WOULDN'T NEED THIS WITH TUPLE RETURN TYPES
mNumEntries = ois.readInt();
return new Iterator<E>() {