diff options
author | Dominik <dominik@dominikschuermann.de> | 2012-10-28 23:51:03 +0100 |
---|---|---|
committer | Dominik <dominik@dominikschuermann.de> | 2012-10-28 23:51:03 +0100 |
commit | 4704e2faf4b5c342a811a91d780c077b05c6237b (patch) | |
tree | a0851eeadf45d44577ff5f5968aaae99e0d878f3 /org_apg/src/org/thialfihar/android/apg/ui/widget | |
parent | d24bbdc6a13cbc56a5d117e5d5bd9ef3be39e63b (diff) | |
download | open-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')
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 |