aboutsummaryrefslogtreecommitdiffstats
path: root/org_apg/src/org/thialfihar/android/apg/ui/widget
diff options
context:
space:
mode:
authorDominik <dominik@dominikschuermann.de>2012-10-28 23:51:03 +0100
committerDominik <dominik@dominikschuermann.de>2012-10-28 23:51:03 +0100
commit4704e2faf4b5c342a811a91d780c077b05c6237b (patch)
treea0851eeadf45d44577ff5f5968aaae99e0d878f3 /org_apg/src/org/thialfihar/android/apg/ui/widget
parentd24bbdc6a13cbc56a5d117e5d5bd9ef3be39e63b (diff)
downloadopen-keychain-4704e2faf4b5c342a811a91d780c077b05c6237b.tar.gz
open-keychain-4704e2faf4b5c342a811a91d780c077b05c6237b.tar.bz2
open-keychain-4704e2faf4b5c342a811a91d780c077b05c6237b.zip
more work on content provider
Diffstat (limited to 'org_apg/src/org/thialfihar/android/apg/ui/widget')
-rw-r--r--org_apg/src/org/thialfihar/android/apg/ui/widget/ExpandableListFragment.java530
-rw-r--r--org_apg/src/org/thialfihar/android/apg/ui/widget/KeyListAdapter.java235
-rw-r--r--org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyCursorAdapter.java136
-rw-r--r--org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapter.java217
-rw-r--r--org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapterOld.java218
-rw-r--r--org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapter.java182
-rw-r--r--org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapterOld.java179
7 files changed, 1298 insertions, 399 deletions
diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/ExpandableListFragment.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/ExpandableListFragment.java
new file mode 100644
index 000000000..46239d560
--- /dev/null
+++ b/org_apg/src/org/thialfihar/android/apg/ui/widget/ExpandableListFragment.java
@@ -0,0 +1,530 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.thialfihar.android.apg.ui.widget;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v4.app.Fragment;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnCreateContextMenuListener;
+import android.view.ViewGroup;
+import android.view.animation.AnimationUtils;
+import android.widget.AdapterView;
+import android.widget.ExpandableListAdapter;
+import android.widget.ExpandableListView;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.ListAdapter;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+/**
+ * @author Khoa Tran
+ *
+ * @see android.support.v4.app.ListFragment
+ * @see android.app.ExpandableListActivity
+ *
+ * ExpandableListFragment for Android < 3.0
+ *
+ * from
+ * http://stackoverflow.com/questions/6051050/expandablelistfragment-with-loadermanager-for-
+ * compatibility-package
+ *
+ */
+public class ExpandableListFragment extends Fragment implements OnCreateContextMenuListener,
+ ExpandableListView.OnChildClickListener, ExpandableListView.OnGroupCollapseListener,
+ ExpandableListView.OnGroupExpandListener {
+
+ static final int INTERNAL_EMPTY_ID = 0x00ff0001;
+ static final int INTERNAL_PROGRESS_CONTAINER_ID = 0x00ff0002;
+ static final int INTERNAL_LIST_CONTAINER_ID = 0x00ff0003;
+
+ final private Handler mHandler = new Handler();
+
+ final private Runnable mRequestFocus = new Runnable() {
+ public void run() {
+ mExpandableList.focusableViewAvailable(mExpandableList);
+ }
+ };
+
+ final private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() {
+ public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
+ onListItemClick((ExpandableListView) parent, v, position, id);
+ }
+ };
+
+ ExpandableListAdapter mAdapter;
+ ExpandableListView mExpandableList;
+ boolean mFinishedStart = false;
+ View mEmptyView;
+ TextView mStandardEmptyView;
+ View mProgressContainer;
+ View mExpandableListContainer;
+ CharSequence mEmptyText;
+ boolean mExpandableListShown;
+
+ public ExpandableListFragment() {
+ }
+
+ /**
+ * Provide default implementation to return a simple list view. Subclasses can override to
+ * replace with their own layout. If doing so, the returned view hierarchy <em>must</em> have a
+ * ListView whose id is {@link android.R.id#list android.R.id.list} and can optionally have a
+ * sibling view id {@link android.R.id#empty android.R.id.empty} that is to be shown when the
+ * list is empty.
+ *
+ * <p>
+ * If you are overriding this method with your own custom content, consider including the
+ * standard layout {@link android.R.layout#list_content} in your layout file, so that you
+ * continue to retain all of the standard behavior of ListFragment. In particular, this is
+ * currently the only way to have the built-in indeterminant progress state be shown.
+ */
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ final Context context = getActivity();
+
+ FrameLayout root = new FrameLayout(context);
+
+ // ------------------------------------------------------------------
+
+ LinearLayout pframe = new LinearLayout(context);
+ pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID);
+ pframe.setOrientation(LinearLayout.VERTICAL);
+ pframe.setVisibility(View.GONE);
+ pframe.setGravity(Gravity.CENTER);
+
+ ProgressBar progress = new ProgressBar(context, null, android.R.attr.progressBarStyleLarge);
+ pframe.addView(progress, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT));
+
+ root.addView(pframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.FILL_PARENT));
+
+ // ------------------------------------------------------------------
+
+ FrameLayout lframe = new FrameLayout(context);
+ lframe.setId(INTERNAL_LIST_CONTAINER_ID);
+
+ TextView tv = new TextView(getActivity());
+ tv.setId(INTERNAL_EMPTY_ID);
+ tv.setGravity(Gravity.CENTER);
+ lframe.addView(tv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.FILL_PARENT));
+
+ ExpandableListView lv = new ExpandableListView(getActivity());
+ lv.setId(android.R.id.list);
+ lv.setDrawSelectorOnTop(false);
+ lframe.addView(lv, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.FILL_PARENT));
+
+ root.addView(lframe, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.FILL_PARENT));
+
+ // ------------------------------------------------------------------
+
+ root.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
+ ViewGroup.LayoutParams.FILL_PARENT));
+
+ return root;
+ }
+
+ /**
+ * Attach to list view once the view hierarchy has been created.
+ */
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ ensureList();
+ }
+
+ /**
+ * Detach from list view.
+ */
+ @Override
+ public void onDestroyView() {
+ mHandler.removeCallbacks(mRequestFocus);
+ mExpandableList = null;
+ mExpandableListShown = false;
+ mEmptyView = mProgressContainer = mExpandableListContainer = null;
+ mStandardEmptyView = null;
+ super.onDestroyView();
+ }
+
+ /**
+ * This method will be called when an item in the list is selected. Subclasses should override.
+ * Subclasses can call getListView().getItemAtPosition(position) if they need to access the data
+ * associated with the selected item.
+ *
+ * @param l
+ * The ListView where the click happened
+ * @param v
+ * The view that was clicked within the ListView
+ * @param position
+ * The position of the view in the list
+ * @param id
+ * The row id of the item that was clicked
+ */
+ public void onListItemClick(ExpandableListView l, View v, int position, long id) {
+ }
+
+ /**
+ * Provide the cursor for the list view.
+ */
+ public void setListAdapter(ExpandableListAdapter adapter) {
+ boolean hadAdapter = mAdapter != null;
+ mAdapter = adapter;
+ if (mExpandableList != null) {
+ mExpandableList.setAdapter(adapter);
+ if (!mExpandableListShown && !hadAdapter) {
+ // The list was hidden, and previously didn't have an
+ // adapter. It is now time to show it.
+ setListShown(true, getView().getWindowToken() != null);
+ }
+ }
+ }
+
+ /**
+ * Set the currently selected list item to the specified position with the adapter's data
+ *
+ * @param position
+ */
+ public void setSelection(int position) {
+ ensureList();
+ mExpandableList.setSelection(position);
+ }
+
+ /**
+ * Get the position of the currently selected list item.
+ */
+ public int getSelectedItemPosition() {
+ ensureList();
+ return mExpandableList.getSelectedItemPosition();
+ }
+
+ /**
+ * Get the cursor row ID of the currently selected list item.
+ */
+ public long getSelectedItemId() {
+ ensureList();
+ return mExpandableList.getSelectedItemId();
+ }
+
+ /**
+ * Get the activity's list view widget.
+ */
+ public ExpandableListView getListView() {
+ ensureList();
+ return mExpandableList;
+ }
+
+ /**
+ * The default content for a ListFragment has a TextView that can be shown when the list is
+ * empty. If you would like to have it shown, call this method to supply the text it should use.
+ */
+ public void setEmptyText(CharSequence text) {
+ ensureList();
+ if (mStandardEmptyView == null) {
+ throw new IllegalStateException("Can't be used with a custom content view");
+ }
+ mStandardEmptyView.setText(text);
+ if (mEmptyText == null) {
+ mExpandableList.setEmptyView(mStandardEmptyView);
+ }
+ mEmptyText = text;
+ }
+
+ /**
+ * Control whether the list is being displayed. You can make it not displayed if you are waiting
+ * for the initial data to show in it. During this time an indeterminant progress indicator will
+ * be shown instead.
+ *
+ * <p>
+ * Applications do not normally need to use this themselves. The default behavior of
+ * ListFragment is to start with the list not being shown, only showing it once an adapter is
+ * given with {@link #setListAdapter(ListAdapter)}. If the list at that point had not been
+ * shown, when it does get shown it will be do without the user ever seeing the hidden state.
+ *
+ * @param shown
+ * If true, the list view is shown; if false, the progress indicator. The initial
+ * value is true.
+ */
+ public void setListShown(boolean shown) {
+ setListShown(shown, true);
+ }
+
+ /**
+ * Like {@link #setListShown(boolean)}, but no animation is used when transitioning from the
+ * previous state.
+ */
+ public void setListShownNoAnimation(boolean shown) {
+ setListShown(shown, false);
+ }
+
+ /**
+ * Control whether the list is being displayed. You can make it not displayed if you are waiting
+ * for the initial data to show in it. During this time an indeterminant progress indicator will
+ * be shown instead.
+ *
+ * @param shown
+ * If true, the list view is shown; if false, the progress indicator. The initial
+ * value is true.
+ * @param animate
+ * If true, an animation will be used to transition to the new state.
+ */
+ private void setListShown(boolean shown, boolean animate) {
+ ensureList();
+ if (mProgressContainer == null) {
+ throw new IllegalStateException("Can't be used with a custom content view");
+ }
+ if (mExpandableListShown == shown) {
+ return;
+ }
+ mExpandableListShown = shown;
+ if (shown) {
+ if (animate) {
+ mProgressContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(),
+ android.R.anim.fade_out));
+ mExpandableListContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(),
+ android.R.anim.fade_in));
+ } else {
+ mProgressContainer.clearAnimation();
+ mExpandableListContainer.clearAnimation();
+ }
+ mProgressContainer.setVisibility(View.GONE);
+ mExpandableListContainer.setVisibility(View.VISIBLE);
+ } else {
+ if (animate) {
+ mProgressContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(),
+ android.R.anim.fade_in));
+ mExpandableListContainer.startAnimation(AnimationUtils.loadAnimation(getActivity(),
+ android.R.anim.fade_out));
+ } else {
+ mProgressContainer.clearAnimation();
+ mExpandableListContainer.clearAnimation();
+ }
+ mProgressContainer.setVisibility(View.VISIBLE);
+ mExpandableListContainer.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * Get the ListAdapter associated with this activity's ListView.
+ */
+ public ExpandableListAdapter getListAdapter() {
+ return mAdapter;
+ }
+
+ private void ensureList() {
+ if (mExpandableList != null) {
+ return;
+ }
+ View root = getView();
+ if (root == null) {
+ throw new IllegalStateException("Content view not yet created");
+ }
+ if (root instanceof ExpandableListView) {
+ mExpandableList = (ExpandableListView) root;
+ } else {
+ mStandardEmptyView = (TextView) root.findViewById(INTERNAL_EMPTY_ID);
+ if (mStandardEmptyView == null) {
+ mEmptyView = root.findViewById(android.R.id.empty);
+ } else {
+ mStandardEmptyView.setVisibility(View.GONE);
+ }
+ mProgressContainer = root.findViewById(INTERNAL_PROGRESS_CONTAINER_ID);
+ mExpandableListContainer = root.findViewById(INTERNAL_LIST_CONTAINER_ID);
+ View rawExpandableListView = root.findViewById(android.R.id.list);
+ if (!(rawExpandableListView instanceof ExpandableListView)) {
+ if (rawExpandableListView == null) {
+ throw new RuntimeException(
+ "Your content must have a ListView whose id attribute is "
+ + "'android.R.id.list'");
+ }
+ throw new RuntimeException(
+ "Content has view with id attribute 'android.R.id.list' "
+ + "that is not a ListView class");
+ }
+ mExpandableList = (ExpandableListView) rawExpandableListView;
+ if (mEmptyView != null) {
+ mExpandableList.setEmptyView(mEmptyView);
+ } else if (mEmptyText != null) {
+ mStandardEmptyView.setText(mEmptyText);
+ mExpandableList.setEmptyView(mStandardEmptyView);
+ }
+ }
+ mExpandableListShown = true;
+ mExpandableList.setOnItemClickListener(mOnClickListener);
+ if (mAdapter != null) {
+ ExpandableListAdapter adapter = mAdapter;
+ mAdapter = null;
+ setListAdapter(adapter);
+ } else {
+ // We are starting without an adapter, so assume we won't
+ // have our data right away and start with the progress indicator.
+ if (mProgressContainer != null) {
+ setListShown(false, false);
+ }
+ }
+ mHandler.post(mRequestFocus);
+ }
+
+ /**
+ * Override this to populate the context menu when an item is long pressed. menuInfo will
+ * contain an {@link android.widget.ExpandableListView.ExpandableListContextMenuInfo} whose
+ * packedPosition is a packed position that should be used with
+ * {@link ExpandableListView#getPackedPositionType(long)} and the other similar methods.
+ * <p>
+ * {@inheritDoc}
+ */
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+ }
+
+ /**
+ * Override this for receiving callbacks when a child has been clicked.
+ * <p>
+ * {@inheritDoc}
+ */
+ public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
+ int childPosition, long id) {
+ return false;
+ }
+
+ /**
+ * Override this for receiving callbacks when a group has been collapsed.
+ */
+ public void onGroupCollapse(int groupPosition) {
+ }
+
+ /**
+ * Override this for receiving callbacks when a group has been expanded.
+ */
+ public void onGroupExpand(int groupPosition) {
+ }
+
+ // /**
+ // * Ensures the expandable list view has been created before Activity restores all
+ // * of the view states.
+ // *
+ // *@see Activity#onRestoreInstanceState(Bundle)
+ // */
+ // @Override
+ // protected void onRestoreInstanceState(Bundle state) {
+ // ensureList();
+ // super.onRestoreInstanceState(state);
+ // }
+
+ /**
+ * Updates the screen state (current list and other views) when the content changes.
+ *
+ * @see Activity#onContentChanged()
+ */
+
+ public void onContentChanged() {
+ // super.onContentChanged();
+ View emptyView = getView().findViewById(android.R.id.empty);
+ mExpandableList = (ExpandableListView) getView().findViewById(android.R.id.list);
+ if (mExpandableList == null) {
+ throw new RuntimeException(
+ "Your content must have a ExpandableListView whose id attribute is "
+ + "'android.R.id.list'");
+ }
+ if (emptyView != null) {
+ mExpandableList.setEmptyView(emptyView);
+ }
+ mExpandableList.setOnChildClickListener(this);
+ mExpandableList.setOnGroupExpandListener(this);
+ mExpandableList.setOnGroupCollapseListener(this);
+
+ if (mFinishedStart) {
+ setListAdapter(mAdapter);
+ }
+ mFinishedStart = true;
+ }
+
+ /**
+ * Get the activity's expandable list view widget. This can be used to get the selection, set
+ * the selection, and many other useful functions.
+ *
+ * @see ExpandableListView
+ */
+ public ExpandableListView getExpandableListView() {
+ ensureList();
+ return mExpandableList;
+ }
+
+ /**
+ * Get the ExpandableListAdapter associated with this activity's ExpandableListView.
+ */
+ public ExpandableListAdapter getExpandableListAdapter() {
+ return mAdapter;
+ }
+
+ /**
+ * Gets the ID of the currently selected group or child.
+ *
+ * @return The ID of the currently selected group or child.
+ */
+ public long getSelectedId() {
+ return mExpandableList.getSelectedId();
+ }
+
+ /**
+ * Gets the position (in packed position representation) of the currently selected group or
+ * child. Use {@link ExpandableListView#getPackedPositionType},
+ * {@link ExpandableListView#getPackedPositionGroup}, and
+ * {@link ExpandableListView#getPackedPositionChild} to unpack the returned packed position.
+ *
+ * @return A packed position representation containing the currently selected group or child's
+ * position and type.
+ */
+ public long getSelectedPosition() {
+ return mExpandableList.getSelectedPosition();
+ }
+
+ /**
+ * Sets the selection to the specified child. If the child is in a collapsed group, the group
+ * will only be expanded and child subsequently selected if shouldExpandGroup is set to true,
+ * otherwise the method will return false.
+ *
+ * @param groupPosition
+ * The position of the group that contains the child.
+ * @param childPosition
+ * The position of the child within the group.
+ * @param shouldExpandGroup
+ * Whether the child's group should be expanded if it is collapsed.
+ * @return Whether the selection was successfully set on the child.
+ */
+ public boolean setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup) {
+ return mExpandableList.setSelectedChild(groupPosition, childPosition, shouldExpandGroup);
+ }
+
+ /**
+ * Sets the selection to the specified group.
+ *
+ * @param groupPosition
+ * The position of the group that should be selected.
+ */
+ public void setSelectedGroup(int groupPosition) {
+ mExpandableList.setSelectedGroup(groupPosition);
+ }
+} \ No newline at end of file
diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/KeyListAdapter.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/KeyListAdapter.java
new file mode 100644
index 000000000..b279e4e7b
--- /dev/null
+++ b/org_apg/src/org/thialfihar/android/apg/ui/widget/KeyListAdapter.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.thialfihar.android.apg.ui.widget;
+
+import org.thialfihar.android.apg.Id;
+import org.thialfihar.android.apg.R;
+import org.thialfihar.android.apg.helper.OtherHelper;
+import org.thialfihar.android.apg.helper.PGPHelper;
+import org.thialfihar.android.apg.provider.ApgContract.PublicKeys;
+import org.thialfihar.android.apg.provider.ApgContract.PublicUserIds;
+import org.thialfihar.android.apg.provider.ApgContract.SecretKeys;
+import org.thialfihar.android.apg.provider.ApgContract.SecretUserIds;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.BaseColumns;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.SimpleCursorTreeAdapter;
+import android.widget.TextView;
+
+public class KeyListAdapter extends SimpleCursorTreeAdapter implements
+ LoaderManager.LoaderCallbacks<Cursor> {
+ private Context mContext;
+ private LoaderManager mManager;
+ private LayoutInflater mInflater;
+
+ // Id.type.public_key / Id.type.secret_key
+ protected int mKeyType;
+
+ public KeyListAdapter(Context context, LoaderManager manager, Cursor groupCursor, int keyType) {
+ super(context, groupCursor, -1, null, null, -1, null, null);
+ mContext = context;
+ mManager = manager;
+ mInflater = LayoutInflater.from(context);
+ mKeyType = keyType;
+ }
+
+ /**
+ * Inflate new view for group items
+ */
+ @Override
+ public View newGroupView(Context context, Cursor cursor, boolean isExpanded, ViewGroup parent) {
+ return mInflater.inflate(R.layout.key_list_group_item, null);
+ }
+
+ /**
+ * Binds TextViews from view to results from database group cursor.
+ */
+ @Override
+ protected void bindGroupView(View view, Context context, Cursor cursor, boolean isExpanded) {
+ int userIdIndex;
+ if (mKeyType == Id.type.public_key) {
+ userIdIndex = cursor.getColumnIndex(PublicUserIds.USER_ID);
+ } else {
+ userIdIndex = cursor.getColumnIndex(SecretUserIds.USER_ID);
+ }
+
+ TextView mainUserId = (TextView) view.findViewById(R.id.mainUserId);
+ mainUserId.setText(R.string.unknownUserId);
+ TextView mainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest);
+ mainUserIdRest.setText("");
+
+ String userId = cursor.getString(userIdIndex);
+ if (userId != null) {
+ String[] userIdSplit = OtherHelper.splitUserId(userId);
+
+ if (userIdSplit[1] != null) {
+ mainUserIdRest.setText(userIdSplit[1]);
+ }
+ mainUserId.setText(userIdSplit[0]);
+ }
+
+ if (mainUserId.getText().length() == 0) {
+ mainUserId.setText(R.string.unknownUserId);
+ }
+
+ if (mainUserIdRest.getText().length() == 0) {
+ mainUserIdRest.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * Inflate new view for child items
+ */
+ @Override
+ public View newChildView(Context context, Cursor cursor, boolean isLastChild, ViewGroup parent) {
+
+ return mInflater.inflate(R.layout.key_list_child_item_master_key, null);
+ }
+
+ @Override
+ protected void bindChildView(View view, Context context, Cursor cursor, boolean isLastChild) {
+ int keyIdIndex;
+ if (mKeyType == Id.type.public_key) {
+ keyIdIndex = cursor.getColumnIndex(PublicKeys.KEY_ID);
+ } else {
+ keyIdIndex = cursor.getColumnIndex(SecretKeys.KEY_ID);
+ }
+
+ TextView keyId = (TextView) view.findViewById(R.id.keyId);
+ String keyIdStr = PGPHelper.getSmallFingerPrint(cursor.getLong(keyIdIndex));
+ keyId.setText(keyIdStr);
+ }
+
+ /**
+ * Given the group, we return a cursor for all the children within that group
+ */
+ @Override
+ protected Cursor getChildrenCursor(Cursor groupCursor) {
+ final long idGroup = groupCursor.getLong(groupCursor.getColumnIndex(BaseColumns._ID));
+ Bundle bundle = new Bundle();
+ bundle.putLong("idGroup", idGroup);
+ int groupPos = groupCursor.getPosition();
+ if (mManager.getLoader(groupPos) != null && !mManager.getLoader(groupPos).isReset()) {
+ mManager.restartLoader(groupPos, bundle, this);
+ } else {
+ mManager.initLoader(groupPos, bundle, this);
+ }
+ return null;
+
+ // OLD CODE:
+ // Vector<KeyChild> children = mChildren.get(groupPosition);
+ // if (children != null) {
+ // return children;
+ // }
+
+ // mCursor.moveToPosition(groupPosition);
+ // children = new Vector<KeyChild>();
+ // Cursor c = mDatabase.query(Keys.TABLE_NAME, new String[] { Keys._ID, // 0
+ // Keys.KEY_ID, // 1
+ // Keys.IS_MASTER_KEY, // 2
+ // Keys.ALGORITHM, // 3
+ // Keys.KEY_SIZE, // 4
+ // Keys.CAN_SIGN, // 5
+ // Keys.CAN_ENCRYPT, // 6
+ // }, Keys.KEY_RING_ID + " = ?", new String[] { mCursor.getString(0) }, null, null,
+ // Keys.RANK + " ASC");
+
+ // int masterKeyId = -1;
+ // long fingerPrintId = -1;
+ // for (int i = 0; i < c.getCount(); ++i) {
+ // c.moveToPosition(i);
+ // children.add(new KeyChild(c.getLong(1), c.getInt(2) == 1, c.getInt(3), c.getInt(4),
+ // c.getInt(5) == 1, c.getInt(6) == 1));
+ // if (i == 0) {
+ // masterKeyId = c.getInt(0);
+ // fingerPrintId = c.getLong(1);
+ // }
+ // }
+ // c.close();
+ //
+ // if (masterKeyId != -1) {
+ // children.insertElementAt(
+ // new KeyChild(PGPHelper.getFingerPrint(KeyListActivity.this, fingerPrintId),
+ // true), 0);
+ // c = mDatabase.query(UserIds.TABLE_NAME, new String[] { UserIds.USER_ID, // 0
+ // }, UserIds.KEY_ID + " = ? AND " + UserIds.RANK + " > 0", new String[] { ""
+ // + masterKeyId }, null, null, UserIds.RANK + " ASC");
+ //
+ // for (int i = 0; i < c.getCount(); ++i) {
+ // c.moveToPosition(i);
+ // children.add(new KeyChild(c.getString(0)));
+ // }
+ // c.close();
+ // }
+
+ // mChildren.set(groupPosition, children);
+ // return children;
+ }
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int groupPos, Bundle bundle) {
+ long idGroup = bundle.getLong("idGroup");
+
+ Uri uri = null;
+ String[] projection = null;
+ String orderBy = null;
+ if (mKeyType == Id.type.public_key) {
+ projection = new String[] { PublicKeys._ID, // 0
+ PublicKeys.KEY_ID, // 1
+ PublicKeys.IS_MASTER_KEY, // 2
+ PublicKeys.ALGORITHM, // 3
+ PublicKeys.KEY_SIZE, // 4
+ PublicKeys.CAN_SIGN, // 5
+ PublicKeys.CAN_ENCRYPT, // 6
+ };
+ orderBy = PublicKeys.RANK + " ASC";
+
+ uri = PublicKeys.buildPublicKeysUri(String.valueOf(idGroup));
+ } else {
+ projection = new String[] { SecretKeys._ID, // 0
+ SecretKeys.KEY_ID, // 1
+ SecretKeys.IS_MASTER_KEY, // 2
+ SecretKeys.ALGORITHM, // 3
+ SecretKeys.KEY_SIZE, // 4
+ SecretKeys.CAN_SIGN, // 5
+ SecretKeys.CAN_ENCRYPT, // 6
+ };
+ orderBy = SecretKeys.RANK + " ASC";
+
+ uri = SecretKeys.buildSecretKeysUri(String.valueOf(idGroup));
+ }
+ return new CursorLoader(mContext, uri, projection, null, null, orderBy);
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
+ setChildrenCursor(loader.getId(), cursor);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ }
+} \ No newline at end of file
diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyCursorAdapter.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyCursorAdapter.java
new file mode 100644
index 000000000..45b617d68
--- /dev/null
+++ b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyCursorAdapter.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.thialfihar.android.apg.ui.widget;
+
+import org.thialfihar.android.apg.R;
+import org.thialfihar.android.apg.helper.OtherHelper;
+import org.thialfihar.android.apg.helper.PGPHelper;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.support.v4.widget.CursorAdapter;
+import android.support.v4.widget.SimpleCursorAdapter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+public class SelectPublicKeyCursorAdapter extends CursorAdapter {
+
+ private LayoutInflater mInflater;
+// private int mActivityIndex;
+// private int mTimeIndex;
+// private int mActionIndex;
+// private int mAmountIndex;
+
+ public SelectPublicKeyCursorAdapter(Context context, Cursor c) {
+ super(context, c);
+//
+// mActivityIndex = c.getColumnIndex(Notes.ACTIVITY);
+// mTimeIndex = c.getColumnIndex(Notes.TIME);
+// mActionIndex = c.getColumnIndex(Notes.ACTION);
+// mAmountIndex = c.getColumnIndex(Notes.AMOUNT);
+
+ mInflater = LayoutInflater.from(context);
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ // TextView activity = (TextView) view.findViewById(android.R.id.text1);
+ // TextView time = (TextView) view.findViewById(android.R.id.text2);
+ // TextView actionAndAmount = (TextView) view.findViewById(R.id.text3);
+ //
+ // activity.setText(cursor.getString(mActivityIndex));
+ //
+ // long lTime = cursor.getLong(mTimeIndex);
+ // Calendar cal = Calendar.getInstance();
+ // cal.setTimeInMillis(lTime);
+ // time.setText(cal.get(Calendar.HOUR_OF_DAY) + “:” + String.format(“%02d”,
+ // cal.get(Calendar.MINUTE)));
+ //
+ // String amount = cursor.getString(mAmountIndex);
+ // if ( amount.length() > 0){
+ // actionAndAmount.setText(cursor.getString(mActionIndex) + ” (” + amount + “)”);
+ // } else {
+ // actionAndAmount.setText(cursor.getString(mActionIndex));
+ // }
+
+// boolean enabled = isEnabled(position);
+
+
+ TextView mainUserId = (TextView) view.findViewById(R.id.mainUserId);
+ mainUserId.setText(R.string.unknownUserId);
+ TextView mainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest);
+ mainUserIdRest.setText("");
+ TextView keyId = (TextView) view.findViewById(R.id.keyId);
+ keyId.setText(R.string.noKey);
+ TextView status = (TextView) view.findViewById(R.id.status);
+ status.setText(R.string.unknownStatus);
+
+ String userId = cursor.getString(2); // USER_ID
+ if (userId != null) {
+ String[] userIdSplit = OtherHelper.splitUserId(userId);
+
+ if (userIdSplit[1] != null) {
+ mainUserIdRest.setText(userIdSplit[1]);
+ }
+ mainUserId.setText(userIdSplit[0]);
+ }
+
+ long masterKeyId = cursor.getLong(1); // MASTER_KEY_ID
+ keyId.setText(PGPHelper.getSmallFingerPrint(masterKeyId));
+
+ if (mainUserIdRest.getText().length() == 0) {
+ mainUserIdRest.setVisibility(View.GONE);
+ }
+
+// if (enabled) {
+// status.setText(R.string.canEncrypt);
+// } else {
+ if (cursor.getInt(3) > 0) {
+ // has some CAN_ENCRYPT keys, but col(4) = 0, so must be revoked or expired
+ status.setText(R.string.expired);
+ } else {
+ status.setText(R.string.noKey);
+ }
+// }
+
+ status.setText(status.getText() + " ");
+
+ CheckBox selected = (CheckBox) view.findViewById(R.id.selected);
+
+// if (!enabled) {
+// mParent.setItemChecked(position, false);
+// }
+
+// selected.setChecked(mParent.isItemChecked(position));
+
+// view.setEnabled(enabled);
+// mainUserId.setEnabled(enabled);
+// mainUserIdRest.setEnabled(enabled);
+// keyId.setEnabled(enabled);
+// selected.setEnabled(enabled);
+// status.setEnabled(enabled);
+ }
+
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ return mInflater.inflate(R.layout.select_public_key, null);
+ }
+
+} \ No newline at end of file
diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapter.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapter.java
deleted file mode 100644
index ee78e8f88..000000000
--- a/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapter.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.thialfihar.android.apg.ui.widget;
-
-import java.util.Date;
-
-import org.thialfihar.android.apg.R;
-import org.thialfihar.android.apg.Id;
-import org.thialfihar.android.apg.helper.PGPHelper;
-import org.thialfihar.android.apg.helper.PGPMain;
-import org.thialfihar.android.apg.provider.KeyRings;
-import org.thialfihar.android.apg.provider.Keys;
-import org.thialfihar.android.apg.provider.UserIds;
-
-import android.app.Activity;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.DatabaseUtils;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteQueryBuilder;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.CheckBox;
-import android.widget.ListView;
-import android.widget.TextView;
-
-public class SelectPublicKeyListAdapter extends BaseAdapter {
- protected LayoutInflater mInflater;
- protected ListView mParent;
- protected SQLiteDatabase mDatabase;
- protected Cursor mCursor;
- protected String mSearchString;
- protected Activity mActivity;
-
- public SelectPublicKeyListAdapter(Activity activity, ListView parent, String searchString,
- long selectedKeyIds[]) {
- mSearchString = searchString;
-
- mActivity = activity;
- mParent = parent;
- mDatabase = PGPMain.getDatabase().db();
- mInflater = (LayoutInflater) parent.getContext().getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- long now = new Date().getTime() / 1000;
- SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
- qb.setTables(KeyRings.TABLE_NAME + " INNER JOIN " + Keys.TABLE_NAME + " ON " + "("
- + KeyRings.TABLE_NAME + "." + KeyRings._ID + " = " + Keys.TABLE_NAME + "."
- + Keys.KEY_RING_ID + " AND " + Keys.TABLE_NAME + "." + Keys.IS_MASTER_KEY
- + " = '1'" + ") " + " INNER JOIN " + UserIds.TABLE_NAME + " ON " + "("
- + Keys.TABLE_NAME + "." + Keys._ID + " = " + UserIds.TABLE_NAME + "."
- + UserIds.KEY_ID + " AND " + UserIds.TABLE_NAME + "." + UserIds.RANK + " = '0') ");
-
- String inIdList = null;
-
- if (selectedKeyIds != null && selectedKeyIds.length > 0) {
- inIdList = KeyRings.TABLE_NAME + "." + KeyRings.MASTER_KEY_ID + " IN (";
- for (int i = 0; i < selectedKeyIds.length; ++i) {
- if (i != 0) {
- inIdList += ", ";
- }
- inIdList += DatabaseUtils.sqlEscapeString("" + selectedKeyIds[i]);
- }
- inIdList += ")";
- }
-
- if (searchString != null && searchString.trim().length() > 0) {
- String[] chunks = searchString.trim().split(" +");
- qb.appendWhere("(EXISTS (SELECT tmp." + UserIds._ID + " FROM " + UserIds.TABLE_NAME
- + " AS tmp WHERE " + "tmp." + UserIds.KEY_ID + " = " + Keys.TABLE_NAME + "."
- + Keys._ID);
- for (int i = 0; i < chunks.length; ++i) {
- qb.appendWhere(" AND tmp." + UserIds.USER_ID + " LIKE ");
- qb.appendWhereEscapeString("%" + chunks[i] + "%");
- }
- qb.appendWhere("))");
-
- if (inIdList != null) {
- qb.appendWhere(" OR (" + inIdList + ")");
- }
- }
-
- String orderBy = UserIds.TABLE_NAME + "." + UserIds.USER_ID + " ASC";
- if (inIdList != null) {
- orderBy = inIdList + " DESC, " + orderBy;
- }
-
- mCursor = qb.query(mDatabase, new String[] {
- KeyRings.TABLE_NAME + "." + KeyRings._ID, // 0
- KeyRings.TABLE_NAME + "." + KeyRings.MASTER_KEY_ID, // 1
- UserIds.TABLE_NAME + "." + UserIds.USER_ID, // 2
- "(SELECT COUNT(tmp." + Keys._ID + ") FROM " + Keys.TABLE_NAME + " AS tmp WHERE "
- + "tmp." + Keys.KEY_RING_ID + " = " + KeyRings.TABLE_NAME + "."
- + KeyRings._ID + " AND " + "tmp." + Keys.IS_REVOKED + " = '0' AND "
- + "tmp." + Keys.CAN_ENCRYPT + " = '1')", // 3
- "(SELECT COUNT(tmp." + Keys._ID + ") FROM " + Keys.TABLE_NAME + " AS tmp WHERE "
- + "tmp." + Keys.KEY_RING_ID + " = " + KeyRings.TABLE_NAME + "."
- + KeyRings._ID + " AND " + "tmp." + Keys.IS_REVOKED + " = '0' AND "
- + "tmp." + Keys.CAN_ENCRYPT + " = '1' AND " + "tmp." + Keys.CREATION
- + " <= '" + now + "' AND " + "(tmp." + Keys.EXPIRY + " IS NULL OR "
- + "tmp." + Keys.EXPIRY + " >= '" + now + "'))", // 4
- }, KeyRings.TABLE_NAME + "." + KeyRings.TYPE + " = ?", new String[] { ""
- + Id.database.type_public }, null, null, orderBy);
-
- activity.startManagingCursor(mCursor);
- }
-
- public void cleanup() {
- if (mCursor != null) {
- mActivity.stopManagingCursor(mCursor);
- mCursor.close();
- }
- }
-
- @Override
- public boolean isEnabled(int position) {
- mCursor.moveToPosition(position);
- return mCursor.getInt(4) > 0; // valid CAN_ENCRYPT
- }
-
- @Override
- public boolean hasStableIds() {
- return true;
- }
-
- public int getCount() {
- return mCursor.getCount();
- }
-
- public Object getItem(int position) {
- mCursor.moveToPosition(position);
- return mCursor.getString(2); // USER_ID
- }
-
- public long getItemId(int position) {
- mCursor.moveToPosition(position);
- return mCursor.getLong(1); // MASTER_KEY_ID
- }
-
- public View getView(int position, View convertView, ViewGroup parent) {
- mCursor.moveToPosition(position);
-
- View view = mInflater.inflate(R.layout.select_public_key_item, null);
- boolean enabled = isEnabled(position);
-
- TextView mainUserId = (TextView) view.findViewById(R.id.mainUserId);
- mainUserId.setText(R.string.unknownUserId);
- TextView mainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest);
- mainUserIdRest.setText("");
- TextView keyId = (TextView) view.findViewById(R.id.keyId);
- keyId.setText(R.string.noKey);
- TextView status = (TextView) view.findViewById(R.id.status);
- status.setText(R.string.unknownStatus);
-
- String userId = mCursor.getString(2); // USER_ID
- if (userId != null) {
- String chunks[] = userId.split(" <", 2);
- userId = chunks[0];
- if (chunks.length > 1) {
- mainUserIdRest.setText("<" + chunks[1]);
- }
- mainUserId.setText(userId);
- }
-
- long masterKeyId = mCursor.getLong(1); // MASTER_KEY_ID
- keyId.setText(PGPHelper.getSmallFingerPrint(masterKeyId));
-
- if (mainUserIdRest.getText().length() == 0) {
- mainUserIdRest.setVisibility(View.GONE);
- }
-
- if (enabled) {
- status.setText(R.string.canEncrypt);
- } else {
- if (mCursor.getInt(3) > 0) {
- // has some CAN_ENCRYPT keys, but col(4) = 0, so must be revoked or expired
- status.setText(R.string.expired);
- } else {
- status.setText(R.string.noKey);
- }
- }
-
- status.setText(status.getText() + " ");
-
- CheckBox selected = (CheckBox) view.findViewById(R.id.selected);
-
- if (!enabled) {
- mParent.setItemChecked(position, false);
- }
-
- selected.setChecked(mParent.isItemChecked(position));
-
- view.setEnabled(enabled);
- mainUserId.setEnabled(enabled);
- mainUserIdRest.setEnabled(enabled);
- keyId.setEnabled(enabled);
- selected.setEnabled(enabled);
- status.setEnabled(enabled);
-
- return view;
- }
-}
diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapterOld.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapterOld.java
new file mode 100644
index 000000000..4324e36c9
--- /dev/null
+++ b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectPublicKeyListAdapterOld.java
@@ -0,0 +1,218 @@
+package org.thialfihar.android.apg.ui.widget;
+///*
+// * Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
+// *
+// * Licensed under the Apache License, Version 2.0 (the "License");
+// * you may not use this file except in compliance with the License.
+// * You may obtain a copy of the License at
+// *
+// * http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing, software
+// * distributed under the License is distributed on an "AS IS" BASIS,
+// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// * See the License for the specific language governing permissions and
+// * limitations under the License.
+// */
+//
+//package org.thialfihar.android.apg.ui.widget;
+//
+//import java.util.Date;
+//
+//import org.thialfihar.android.apg.R;
+//import org.thialfihar.android.apg.Id;
+//import org.thialfihar.android.apg.helper.PGPHelper;
+//import org.thialfihar.android.apg.helper.PGPMain;
+//import org.thialfihar.android.apg.provider.KeyRings;
+//import org.thialfihar.android.apg.provider.Keys;
+//import org.thialfihar.android.apg.provider.UserIds;
+//
+//import android.app.Activity;
+//import android.content.Context;
+//import android.database.Cursor;
+//import android.database.DatabaseUtils;
+//import android.database.sqlite.SQLiteDatabase;
+//import android.database.sqlite.SQLiteQueryBuilder;
+//import android.view.LayoutInflater;
+//import android.view.View;
+//import android.view.ViewGroup;
+//import android.widget.BaseAdapter;
+//import android.widget.CheckBox;
+//import android.widget.ListView;
+//import android.widget.TextView;
+//
+//public class SelectPublicKeyListAdapter extends BaseAdapter {
+// protected LayoutInflater mInflater;
+// protected ListView mParent;
+// protected SQLiteDatabase mDatabase;
+// protected Cursor mCursor;
+// protected String mSearchString;
+// protected Activity mActivity;
+//
+// public SelectPublicKeyListAdapter(Activity activity, ListView parent, String searchString,
+// long selectedKeyIds[]) {
+// mSearchString = searchString;
+//
+// mActivity = activity;
+// mParent = parent;
+// mDatabase = PGPMain.getDatabase().db();
+// mInflater = (LayoutInflater) parent.getContext().getSystemService(
+// Context.LAYOUT_INFLATER_SERVICE);
+// long now = new Date().getTime() / 1000;
+// SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+// qb.setTables(KeyRings.TABLE_NAME + " INNER JOIN " + Keys.TABLE_NAME + " ON " + "("
+// + KeyRings.TABLE_NAME + "." + KeyRings._ID + " = " + Keys.TABLE_NAME + "."
+// + Keys.KEY_RING_ID + " AND " + Keys.TABLE_NAME + "." + Keys.IS_MASTER_KEY
+// + " = '1'" + ") " + " INNER JOIN " + UserIds.TABLE_NAME + " ON " + "("
+// + Keys.TABLE_NAME + "." + Keys._ID + " = " + UserIds.TABLE_NAME + "."
+// + UserIds.KEY_ID + " AND " + UserIds.TABLE_NAME + "." + UserIds.RANK + " = '0') ");
+//
+// String inIdList = null;
+//
+// if (selectedKeyIds != null && selectedKeyIds.length > 0) {
+// inIdList = KeyRings.TABLE_NAME + "." + KeyRings.MASTER_KEY_ID + " IN (";
+// for (int i = 0; i < selectedKeyIds.length; ++i) {
+// if (i != 0) {
+// inIdList += ", ";
+// }
+// inIdList += DatabaseUtils.sqlEscapeString("" + selectedKeyIds[i]);
+// }
+// inIdList += ")";
+// }
+//
+// if (searchString != null && searchString.trim().length() > 0) {
+// String[] chunks = searchString.trim().split(" +");
+// qb.appendWhere("(EXISTS (SELECT tmp." + UserIds._ID + " FROM " + UserIds.TABLE_NAME
+// + " AS tmp WHERE " + "tmp." + UserIds.KEY_ID + " = " + Keys.TABLE_NAME + "."
+// + Keys._ID);
+// for (int i = 0; i < chunks.length; ++i) {
+// qb.appendWhere(" AND tmp." + UserIds.USER_ID + " LIKE ");
+// qb.appendWhereEscapeString("%" + chunks[i] + "%");
+// }
+// qb.appendWhere("))");
+//
+// if (inIdList != null) {
+// qb.appendWhere(" OR (" + inIdList + ")");
+// }
+// }
+//
+// String orderBy = UserIds.TABLE_NAME + "." + UserIds.USER_ID + " ASC";
+// if (inIdList != null) {
+// orderBy = inIdList + " DESC, " + orderBy;
+// }
+//
+// mCursor = qb.query(mDatabase, new String[] {
+// KeyRings.TABLE_NAME + "." + KeyRings._ID, // 0
+// KeyRings.TABLE_NAME + "." + KeyRings.MASTER_KEY_ID, // 1
+// UserIds.TABLE_NAME + "." + UserIds.USER_ID, // 2
+// "(SELECT COUNT(tmp." + Keys._ID + ") FROM " + Keys.TABLE_NAME + " AS tmp WHERE "
+// + "tmp." + Keys.KEY_RING_ID + " = " + KeyRings.TABLE_NAME + "."
+// + KeyRings._ID + " AND " + "tmp." + Keys.IS_REVOKED + " = '0' AND "
+// + "tmp." + Keys.CAN_ENCRYPT + " = '1')", // 3
+// "(SELECT COUNT(tmp." + Keys._ID + ") FROM " + Keys.TABLE_NAME + " AS tmp WHERE "
+// + "tmp." + Keys.KEY_RING_ID + " = " + KeyRings.TABLE_NAME + "."
+// + KeyRings._ID + " AND " + "tmp." + Keys.IS_REVOKED + " = '0' AND "
+// + "tmp." + Keys.CAN_ENCRYPT + " = '1' AND " + "tmp." + Keys.CREATION
+// + " <= '" + now + "' AND " + "(tmp." + Keys.EXPIRY + " IS NULL OR "
+// + "tmp." + Keys.EXPIRY + " >= '" + now + "'))", // 4
+// }, KeyRings.TABLE_NAME + "." + KeyRings.TYPE + " = ?", new String[] { ""
+// + Id.database.type_public }, null, null, orderBy);
+//
+// activity.startManagingCursor(mCursor);
+// }
+//
+// public void cleanup() {
+// if (mCursor != null) {
+// mActivity.stopManagingCursor(mCursor);
+// mCursor.close();
+// }
+// }
+//
+// @Override
+// public boolean isEnabled(int position) {
+// mCursor.moveToPosition(position);
+// return mCursor.getInt(4) > 0; // valid CAN_ENCRYPT
+// }
+//
+// @Override
+// public boolean hasStableIds() {
+// return true;
+// }
+//
+// public int getCount() {
+// return mCursor.getCount();
+// }
+//
+// public Object getItem(int position) {
+// mCursor.moveToPosition(position);
+// return mCursor.getString(2); // USER_ID
+// }
+//
+// public long getItemId(int position) {
+// mCursor.moveToPosition(position);
+// return mCursor.getLong(1); // MASTER_KEY_ID
+// }
+//
+// public View getView(int position, View convertView, ViewGroup parent) {
+// mCursor.moveToPosition(position);
+//
+// View view = mInflater.inflate(R.layout.select_public_key_item, null);
+// boolean enabled = isEnabled(position);
+//
+// TextView mainUserId = (TextView) view.findViewById(R.id.mainUserId);
+// mainUserId.setText(R.string.unknownUserId);
+// TextView mainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest);
+// mainUserIdRest.setText("");
+// TextView keyId = (TextView) view.findViewById(R.id.keyId);
+// keyId.setText(R.string.noKey);
+// TextView status = (TextView) view.findViewById(R.id.status);
+// status.setText(R.string.unknownStatus);
+//
+// String userId = mCursor.getString(2); // USER_ID
+// if (userId != null) {
+// String chunks[] = userId.split(" <", 2);
+// userId = chunks[0];
+// if (chunks.length > 1) {
+// mainUserIdRest.setText("<" + chunks[1]);
+// }
+// mainUserId.setText(userId);
+// }
+//
+// long masterKeyId = mCursor.getLong(1); // MASTER_KEY_ID
+// keyId.setText(PGPHelper.getSmallFingerPrint(masterKeyId));
+//
+// if (mainUserIdRest.getText().length() == 0) {
+// mainUserIdRest.setVisibility(View.GONE);
+// }
+//
+// if (enabled) {
+// status.setText(R.string.canEncrypt);
+// } else {
+// if (mCursor.getInt(3) > 0) {
+// // has some CAN_ENCRYPT keys, but col(4) = 0, so must be revoked or expired
+// status.setText(R.string.expired);
+// } else {
+// status.setText(R.string.noKey);
+// }
+// }
+//
+// status.setText(status.getText() + " ");
+//
+// CheckBox selected = (CheckBox) view.findViewById(R.id.selected);
+//
+// if (!enabled) {
+// mParent.setItemChecked(position, false);
+// }
+//
+// selected.setChecked(mParent.isItemChecked(position));
+//
+// view.setEnabled(enabled);
+// mainUserId.setEnabled(enabled);
+// mainUserIdRest.setEnabled(enabled);
+// keyId.setEnabled(enabled);
+// selected.setEnabled(enabled);
+// status.setEnabled(enabled);
+//
+// return view;
+// }
+//}
diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapter.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapter.java
deleted file mode 100644
index 2caa593ff..000000000
--- a/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapter.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.thialfihar.android.apg.ui.widget;
-
-import java.util.Date;
-
-import org.thialfihar.android.apg.R;
-import org.thialfihar.android.apg.Id;
-import org.thialfihar.android.apg.helper.PGPHelper;
-import org.thialfihar.android.apg.helper.PGPMain;
-import org.thialfihar.android.apg.provider.KeyRings;
-import org.thialfihar.android.apg.provider.Keys;
-import org.thialfihar.android.apg.provider.UserIds;
-
-import android.app.Activity;
-import android.content.Context;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.database.sqlite.SQLiteQueryBuilder;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-
-public class SelectSecretKeyListAdapter extends BaseAdapter {
- protected LayoutInflater mInflater;
- protected ListView mParent;
- protected SQLiteDatabase mDatabase;
- protected Cursor mCursor;
- protected String mSearchString;
- protected Activity mActivity;
-
- public SelectSecretKeyListAdapter(Activity activity, ListView parent, String searchString) {
- mSearchString = searchString;
-
- mActivity = activity;
- mParent = parent;
- mDatabase = PGPMain.getDatabase().db();
- mInflater = (LayoutInflater) parent.getContext().getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- long now = new Date().getTime() / 1000;
- SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
- qb.setTables(KeyRings.TABLE_NAME + " INNER JOIN " + Keys.TABLE_NAME + " ON " + "("
- + KeyRings.TABLE_NAME + "." + KeyRings._ID + " = " + Keys.TABLE_NAME + "."
- + Keys.KEY_RING_ID + " AND " + Keys.TABLE_NAME + "." + Keys.IS_MASTER_KEY
- + " = '1'" + ") " + " INNER JOIN " + UserIds.TABLE_NAME + " ON " + "("
- + Keys.TABLE_NAME + "." + Keys._ID + " = " + UserIds.TABLE_NAME + "."
- + UserIds.KEY_ID + " AND " + UserIds.TABLE_NAME + "." + UserIds.RANK + " = '0') ");
-
- if (searchString != null && searchString.trim().length() > 0) {
- String[] chunks = searchString.trim().split(" +");
- qb.appendWhere("EXISTS (SELECT tmp." + UserIds._ID + " FROM " + UserIds.TABLE_NAME
- + " AS tmp WHERE " + "tmp." + UserIds.KEY_ID + " = " + Keys.TABLE_NAME + "."
- + Keys._ID);
- for (int i = 0; i < chunks.length; ++i) {
- qb.appendWhere(" AND tmp." + UserIds.USER_ID + " LIKE ");
- qb.appendWhereEscapeString("%" + chunks[i] + "%");
- }
- qb.appendWhere(")");
- }
-
- mCursor = qb.query(mDatabase, new String[] {
- KeyRings.TABLE_NAME + "." + KeyRings._ID, // 0
- KeyRings.TABLE_NAME + "." + KeyRings.MASTER_KEY_ID, // 1
- UserIds.TABLE_NAME + "." + UserIds.USER_ID, // 2
- "(SELECT COUNT(tmp." + Keys._ID + ") FROM " + Keys.TABLE_NAME + " AS tmp WHERE "
- + "tmp." + Keys.KEY_RING_ID + " = " + KeyRings.TABLE_NAME + "."
- + KeyRings._ID + " AND " + "tmp." + Keys.IS_REVOKED + " = '0' AND "
- + "tmp." + Keys.CAN_SIGN + " = '1')", // 3,
- "(SELECT COUNT(tmp." + Keys._ID + ") FROM " + Keys.TABLE_NAME + " AS tmp WHERE "
- + "tmp." + Keys.KEY_RING_ID + " = " + KeyRings.TABLE_NAME + "."
- + KeyRings._ID + " AND " + "tmp." + Keys.IS_REVOKED + " = '0' AND "
- + "tmp." + Keys.CAN_SIGN + " = '1' AND " + "tmp." + Keys.CREATION + " <= '"
- + now + "' AND " + "(tmp." + Keys.EXPIRY + " IS NULL OR " + "tmp."
- + Keys.EXPIRY + " >= '" + now + "'))", // 4
- }, KeyRings.TABLE_NAME + "." + KeyRings.TYPE + " = ?", new String[] { ""
- + Id.database.type_secret }, null, null, UserIds.TABLE_NAME + "." + UserIds.USER_ID
- + " ASC");
-
- activity.startManagingCursor(mCursor);
- }
-
- public void cleanup() {
- if (mCursor != null) {
- mActivity.stopManagingCursor(mCursor);
- mCursor.close();
- }
- }
-
- @Override
- public boolean isEnabled(int position) {
- mCursor.moveToPosition(position);
- return mCursor.getInt(4) > 0; // valid CAN_SIGN
- }
-
- @Override
- public boolean hasStableIds() {
- return true;
- }
-
- public int getCount() {
- return mCursor.getCount();
- }
-
- public Object getItem(int position) {
- mCursor.moveToPosition(position);
- return mCursor.getString(2); // USER_ID
- }
-
- public long getItemId(int position) {
- mCursor.moveToPosition(position);
- return mCursor.getLong(1); // MASTER_KEY_ID
- }
-
- public View getView(int position, View convertView, ViewGroup parent) {
- mCursor.moveToPosition(position);
-
- View view = mInflater.inflate(R.layout.select_secret_key_item, null);
- boolean enabled = isEnabled(position);
-
- TextView mainUserId = (TextView) view.findViewById(R.id.mainUserId);
- mainUserId.setText(R.string.unknownUserId);
- TextView mainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest);
- mainUserIdRest.setText("");
- TextView keyId = (TextView) view.findViewById(R.id.keyId);
- keyId.setText(R.string.noKey);
- TextView status = (TextView) view.findViewById(R.id.status);
- status.setText(R.string.unknownStatus);
-
- String userId = mCursor.getString(2); // USER_ID
- if (userId != null) {
- String chunks[] = userId.split(" <", 2);
- userId = chunks[0];
- if (chunks.length > 1) {
- mainUserIdRest.setText("<" + chunks[1]);
- }
- mainUserId.setText(userId);
- }
-
- long masterKeyId = mCursor.getLong(1); // MASTER_KEY_ID
- keyId.setText(PGPHelper.getSmallFingerPrint(masterKeyId));
-
- if (mainUserIdRest.getText().length() == 0) {
- mainUserIdRest.setVisibility(View.GONE);
- }
-
- if (enabled) {
- status.setText(R.string.canSign);
- } else {
- if (mCursor.getInt(3) > 0) {
- // has some CAN_SIGN keys, but col(4) = 0, so must be revoked or expired
- status.setText(R.string.expired);
- } else {
- status.setText(R.string.noKey);
- }
- }
-
- status.setText(status.getText() + " ");
-
- view.setEnabled(enabled);
- mainUserId.setEnabled(enabled);
- mainUserIdRest.setEnabled(enabled);
- keyId.setEnabled(enabled);
- status.setEnabled(enabled);
-
- return view;
- }
-} \ No newline at end of file
diff --git a/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapterOld.java b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapterOld.java
new file mode 100644
index 000000000..ab0aa1519
--- /dev/null
+++ b/org_apg/src/org/thialfihar/android/apg/ui/widget/SelectSecretKeyListAdapterOld.java
@@ -0,0 +1,179 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.thialfihar.android.apg.ui.widget;
+
+import java.util.Date;
+
+import org.thialfihar.android.apg.R;
+import org.thialfihar.android.apg.Id;
+import org.thialfihar.android.apg.helper.PGPHelper;
+import org.thialfihar.android.apg.helper.PGPMain;
+
+import android.app.Activity;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+public class SelectSecretKeyListAdapterOld { //extends BaseAdapter {
+// protected LayoutInflater mInflater;
+// protected ListView mParent;
+// protected SQLiteDatabase mDatabase;
+// protected Cursor mCursor;
+// protected String mSearchString;
+// protected Activity mActivity;
+//
+// public SelectSecretKeyListAdapter(Activity activity, ListView parent, String searchString) {
+// mSearchString = searchString;
+//
+// mActivity = activity;
+// mParent = parent;
+// mDatabase = PGPMain.getDatabase().db();
+// mInflater = (LayoutInflater) parent.getContext().getSystemService(
+// Context.LAYOUT_INFLATER_SERVICE);
+// long now = new Date().getTime() / 1000;
+// SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+// qb.setTables(KeyRings.TABLE_NAME + " INNER JOIN " + Keys.TABLE_NAME + " ON " + "("
+// + KeyRings.TABLE_NAME + "." + KeyRings._ID + " = " + Keys.TABLE_NAME + "."
+// + Keys.KEY_RING_ID + " AND " + Keys.TABLE_NAME + "." + Keys.IS_MASTER_KEY
+// + " = '1'" + ") " + " INNER JOIN " + UserIds.TABLE_NAME + " ON " + "("
+// + Keys.TABLE_NAME + "." + Keys._ID + " = " + UserIds.TABLE_NAME + "."
+// + UserIds.KEY_ID + " AND " + UserIds.TABLE_NAME + "." + UserIds.RANK + " = '0') ");
+//
+// if (searchString != null && searchString.trim().length() > 0) {
+// String[] chunks = searchString.trim().split(" +");
+// qb.appendWhere("EXISTS (SELECT tmp." + UserIds._ID + " FROM " + UserIds.TABLE_NAME
+// + " AS tmp WHERE " + "tmp." + UserIds.KEY_ID + " = " + Keys.TABLE_NAME + "."
+// + Keys._ID);
+// for (int i = 0; i < chunks.length; ++i) {
+// qb.appendWhere(" AND tmp." + UserIds.USER_ID + " LIKE ");
+// qb.appendWhereEscapeString("%" + chunks[i] + "%");
+// }
+// qb.appendWhere(")");
+// }
+//
+// mCursor = qb.query(mDatabase, new String[] {
+// KeyRings.TABLE_NAME + "." + KeyRings._ID, // 0
+// KeyRings.TABLE_NAME + "." + KeyRings.MASTER_KEY_ID, // 1
+// UserIds.TABLE_NAME + "." + UserIds.USER_ID, // 2
+// "(SELECT COUNT(tmp." + Keys._ID + ") FROM " + Keys.TABLE_NAME + " AS tmp WHERE "
+// + "tmp." + Keys.KEY_RING_ID + " = " + KeyRings.TABLE_NAME + "."
+// + KeyRings._ID + " AND " + "tmp." + Keys.IS_REVOKED + " = '0' AND "
+// + "tmp." + Keys.CAN_SIGN + " = '1')", // 3,
+// "(SELECT COUNT(tmp." + Keys._ID + ") FROM " + Keys.TABLE_NAME + " AS tmp WHERE "
+// + "tmp." + Keys.KEY_RING_ID + " = " + KeyRings.TABLE_NAME + "."
+// + KeyRings._ID + " AND " + "tmp." + Keys.IS_REVOKED + " = '0' AND "
+// + "tmp." + Keys.CAN_SIGN + " = '1' AND " + "tmp." + Keys.CREATION + " <= '"
+// + now + "' AND " + "(tmp." + Keys.EXPIRY + " IS NULL OR " + "tmp."
+// + Keys.EXPIRY + " >= '" + now + "'))", // 4
+// }, KeyRings.TABLE_NAME + "." + KeyRings.TYPE + " = ?", new String[] { ""
+// + Id.database.type_secret }, null, null, UserIds.TABLE_NAME + "." + UserIds.USER_ID
+// + " ASC");
+//
+// activity.startManagingCursor(mCursor);
+// }
+//
+// public void cleanup() {
+// if (mCursor != null) {
+// mActivity.stopManagingCursor(mCursor);
+// mCursor.close();
+// }
+// }
+//
+// @Override
+// public boolean isEnabled(int position) {
+// mCursor.moveToPosition(position);
+// return mCursor.getInt(4) > 0; // valid CAN_SIGN
+// }
+//
+// @Override
+// public boolean hasStableIds() {
+// return true;
+// }
+//
+// public int getCount() {
+// return mCursor.getCount();
+// }
+//
+// public Object getItem(int position) {
+// mCursor.moveToPosition(position);
+// return mCursor.getString(2); // USER_ID
+// }
+//
+// public long getItemId(int position) {
+// mCursor.moveToPosition(position);
+// return mCursor.getLong(1); // MASTER_KEY_ID
+// }
+//
+// public View getView(int position, View convertView, ViewGroup parent) {
+// mCursor.moveToPosition(position);
+//
+// View view = mInflater.inflate(R.layout.select_secret_key_item, null);
+// boolean enabled = isEnabled(position);
+//
+// TextView mainUserId = (TextView) view.findViewById(R.id.mainUserId);
+// mainUserId.setText(R.string.unknownUserId);
+// TextView mainUserIdRest = (TextView) view.findViewById(R.id.mainUserIdRest);
+// mainUserIdRest.setText("");
+// TextView keyId = (TextView) view.findViewById(R.id.keyId);
+// keyId.setText(R.string.noKey);
+// TextView status = (TextView) view.findViewById(R.id.status);
+// status.setText(R.string.unknownStatus);
+//
+// String userId = mCursor.getString(2); // USER_ID
+// if (userId != null) {
+// String chunks[] = userId.split(" <", 2);
+// userId = chunks[0];
+// if (chunks.length > 1) {
+// mainUserIdRest.setText("<" + chunks[1]);
+// }
+// mainUserId.setText(userId);
+// }
+//
+// long masterKeyId = mCursor.getLong(1); // MASTER_KEY_ID
+// keyId.setText(PGPHelper.getSmallFingerPrint(masterKeyId));
+//
+// if (mainUserIdRest.getText().length() == 0) {
+// mainUserIdRest.setVisibility(View.GONE);
+// }
+//
+// if (enabled) {
+// status.setText(R.string.canSign);
+// } else {
+// if (mCursor.getInt(3) > 0) {
+// // has some CAN_SIGN keys, but col(4) = 0, so must be revoked or expired
+// status.setText(R.string.expired);
+// } else {
+// status.setText(R.string.noKey);
+// }
+// }
+//
+// status.setText(status.getText() + " ");
+//
+// view.setEnabled(enabled);
+// mainUserId.setEnabled(enabled);
+// mainUserIdRest.setEnabled(enabled);
+// keyId.setEnabled(enabled);
+// status.setEnabled(enabled);
+//
+// return view;
+// }
+} \ No newline at end of file