aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java9
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsAdapter.java53
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FilterCursorWrapper.java76
3 files changed, 116 insertions, 22 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
index b1da6df9d..cfc1075af 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
@@ -46,6 +46,7 @@ import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;
import org.sufficientlysecure.keychain.ui.dialog.UserIdInfoDialogFragment;
import org.sufficientlysecure.keychain.ui.linked.LinkedIdViewFragment;
import org.sufficientlysecure.keychain.ui.linked.LinkedIdViewFragment.OnIdentityLoadedListener;
+import org.sufficientlysecure.keychain.util.FilterCursorWrapper;
import org.sufficientlysecure.keychain.util.Log;
public class ViewKeyFragment extends LoaderFragment implements
@@ -218,18 +219,18 @@ public class ViewKeyFragment extends LoaderFragment implements
}
}
- public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
switch (loader.getId()) {
case LOADER_ID_USER_IDS: {
- mUserIdsAdapter.swapCursor(data);
+ mUserIdsAdapter.swapCursor(cursor);
break;
}
case LOADER_ID_LINKED_IDS: {
- mLinkedIdsCard.setVisibility(data.getCount() > 0 ? View.VISIBLE : View.GONE);
- mLinkedIdsAdapter.swapCursor(data);
+ mLinkedIdsCard.setVisibility(cursor.getCount() > 0 ? View.VISIBLE : View.GONE);
+ mLinkedIdsAdapter.swapCursor(cursor);
break;
}
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsAdapter.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsAdapter.java
index 76cb63223..e0f28efb8 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsAdapter.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/adapter/LinkedIdsAdapter.java
@@ -22,7 +22,6 @@ import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
-import android.support.v4.app.Fragment;
import android.support.v4.content.CursorLoader;
import android.util.Log;
import android.view.LayoutInflater;
@@ -35,12 +34,12 @@ import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.pgp.linked.LinkedIdentity;
import org.sufficientlysecure.keychain.pgp.linked.RawLinkedIdentity;
-import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.provider.KeychainContract.Certs;
import org.sufficientlysecure.keychain.provider.KeychainContract.UserPackets;
import org.sufficientlysecure.keychain.ui.linked.LinkedIdViewFragment;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils;
import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils.State;
+import org.sufficientlysecure.keychain.util.FilterCursorWrapper;
import java.io.IOException;
import java.util.WeakHashMap;
@@ -58,6 +57,23 @@ public class LinkedIdsAdapter extends UserAttributesAdapter {
}
@Override
+ public Cursor swapCursor(Cursor cursor) {
+ if (cursor == null) {
+ return super.swapCursor(null);
+ }
+
+ Cursor filteredCursor = new FilterCursorWrapper(cursor) {
+ @Override
+ public boolean isVisible(Cursor cursor) {
+ RawLinkedIdentity id = getItemAtPosition(cursor);
+ return id instanceof LinkedIdentity;
+ }
+ };
+
+ return super.swapCursor(filteredCursor);
+ }
+
+ @Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder holder = (ViewHolder) view.getTag();
@@ -83,25 +99,26 @@ public class LinkedIdsAdapter extends UserAttributesAdapter {
holder.vVerified.setVisibility(View.GONE);
}
- RawLinkedIdentity id = getItem(cursor.getPosition());
+ RawLinkedIdentity id = getItemAtPosition(cursor);
holder.setData(mContext, id);
}
- @Override
- public RawLinkedIdentity getItem(int position) {
- RawLinkedIdentity ret = mLinkedIdentityCache.get(position);
+ public RawLinkedIdentity getItemAtPosition(Cursor cursor) {
+ int rank = cursor.getInt(INDEX_RANK);
+ Log.d(Constants.TAG, "requested rank: " + rank);
+
+ RawLinkedIdentity ret = mLinkedIdentityCache.get(rank);
if (ret != null) {
+ Log.d(Constants.TAG, "cached!");
return ret;
}
+ Log.d(Constants.TAG, "not cached!");
- Cursor c = getCursor();
- c.moveToPosition(position);
-
- byte[] data = c.getBlob(INDEX_ATTRIBUTE_DATA);
try {
+ byte[] data = cursor.getBlob(INDEX_ATTRIBUTE_DATA);
ret = LinkedIdentity.fromAttributeData(data);
- mLinkedIdentityCache.put(position, ret);
+ mLinkedIdentityCache.put(rank, ret);
return ret;
} catch (IOException e) {
Log.e(Constants.TAG, "could not read linked identity subpacket data", e);
@@ -110,6 +127,13 @@ public class LinkedIdsAdapter extends UserAttributesAdapter {
}
@Override
+ public RawLinkedIdentity getItem(int position) {
+ Cursor cursor = getCursor();
+ cursor.moveToPosition(position);
+ return getItemAtPosition(cursor);
+ }
+
+ @Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View v = mInflater.inflate(R.layout.linked_id_item, null);
ViewHolder holder = new ViewHolder(v);
@@ -128,7 +152,6 @@ public class LinkedIdsAdapter extends UserAttributesAdapter {
public LinkedIdViewFragment getLinkedIdFragment(Uri baseUri,
int position, byte[] fingerprint) throws IOException {
-
Cursor c = getCursor();
c.moveToPosition(position);
int rank = c.getInt(UserIdsAdapter.INDEX_RANK);
@@ -167,10 +190,4 @@ public class LinkedIdsAdapter extends UserAttributesAdapter {
}
}
- @Override
- public void notifyDataSetChanged() {
- mLinkedIdentityCache.clear();
- super.notifyDataSetChanged();
- }
-
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FilterCursorWrapper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FilterCursorWrapper.java
new file mode 100644
index 000000000..ab73f59b8
--- /dev/null
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/FilterCursorWrapper.java
@@ -0,0 +1,76 @@
+package org.sufficientlysecure.keychain.util;
+
+
+import android.database.Cursor;
+import android.database.CursorWrapper;
+
+public abstract class FilterCursorWrapper extends CursorWrapper {
+ private int[] mIndex;
+ private int mCount = 0;
+ private int mPos = 0;
+
+ public abstract boolean isVisible(Cursor cursor);
+
+ public FilterCursorWrapper(Cursor cursor) {
+ super(cursor);
+ mCount = super.getCount();
+ mIndex = new int[mCount];
+ for (int i = 0; i < mCount; i++) {
+ super.moveToPosition(i);
+ if (isVisible(cursor)) {
+ mIndex[mPos++] = i;
+ }
+ }
+ mCount = mPos;
+ mPos = 0;
+ super.moveToFirst();
+ }
+
+ @Override
+ public boolean move(int offset) {
+ return this.moveToPosition(mPos + offset);
+ }
+
+ @Override
+ public boolean moveToNext() {
+ return this.moveToPosition(mPos + 1);
+ }
+
+ @Override
+ public boolean moveToPrevious() {
+ return this.moveToPosition(mPos - 1);
+ }
+
+ @Override
+ public boolean moveToFirst() {
+ return this.moveToPosition(0);
+ }
+
+ @Override
+ public boolean moveToLast() {
+ return this.moveToPosition(mCount - 1);
+ }
+
+ @Override
+ public boolean moveToPosition(int position) {
+ if (position >= mCount || position < 0) {
+ return false;
+ }
+ return super.moveToPosition(mIndex[position]);
+ }
+
+ @Override
+ public int getCount() {
+ return mCount;
+ }
+
+ public int getHiddenCount() {
+ return super.getCount() - mCount;
+ }
+
+ @Override
+ public int getPosition() {
+ return mPos;
+ }
+
+} \ No newline at end of file