mirror of
https://github.com/moparisthebest/open-keychain
synced 2024-11-30 12:32:17 -05:00
keychainprovider cleanup, kindasorta
removed code redundancy, and the query is in the switch thing now, I didn't put everything into its own separate sources (yet?).
This commit is contained in:
parent
69f5bf6b57
commit
0b0809ec17
@ -467,70 +467,53 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
|
|
||||||
int match = mUriMatcher.match(uri);
|
int match = mUriMatcher.match(uri);
|
||||||
|
|
||||||
// screw that switch
|
// all query() parameters, for good measure
|
||||||
if(match == UNIFIED_KEY_RING) {
|
String groupBy = null, having = null;
|
||||||
|
|
||||||
// join keyrings with keys and userIds
|
|
||||||
// Only get user id and key with rank 0 (main user id and main key)
|
|
||||||
qb.setTables(Tables.KEY_RINGS + " INNER JOIN " + Tables.KEYS + " ON " + "("
|
|
||||||
+ Tables.KEY_RINGS + "." + BaseColumns._ID + " = " + Tables.KEYS + "."
|
|
||||||
+ KeysColumns.KEY_RING_ROW_ID + " AND " + Tables.KEYS + "."
|
|
||||||
+ KeysColumns.RANK + " = '0') " + " INNER JOIN " + Tables.USER_IDS + " ON "
|
|
||||||
+ "(" + Tables.KEY_RINGS + "." + BaseColumns._ID + " = " + Tables.USER_IDS + "."
|
|
||||||
+ UserIdsColumns.KEY_RING_ROW_ID + " AND " + Tables.USER_IDS + "."
|
|
||||||
+ UserIdsColumns.RANK + " = '0')");
|
|
||||||
|
|
||||||
{
|
|
||||||
HashMap<String, String> projectionMap = new HashMap<String, String>();
|
|
||||||
|
|
||||||
projectionMap.put(KeyRingsColumns.TYPE, "MAX(" + Tables.KEY_RINGS + "." + KeyRingsColumns.TYPE + ")");
|
|
||||||
|
|
||||||
projectionMap.put(BaseColumns._ID, Tables.KEY_RINGS + "." + BaseColumns._ID);
|
|
||||||
projectionMap.put(KeyRingsColumns.KEY_RING_DATA, Tables.KEY_RINGS + "."
|
|
||||||
+ KeyRingsColumns.KEY_RING_DATA);
|
|
||||||
projectionMap.put(KeyRingsColumns.MASTER_KEY_ID, Tables.KEY_RINGS + "." + KeyRingsColumns.MASTER_KEY_ID);
|
|
||||||
// TODO: deprecated master key id
|
|
||||||
//projectionMap.put(KeyRingsColumns.MASTER_KEY_ID, Tables.KEYS + "." + KeysColumns.KEY_ID);
|
|
||||||
|
|
||||||
projectionMap.put(KeysColumns.FINGERPRINT, Tables.KEYS + "." + KeysColumns.FINGERPRINT);
|
|
||||||
projectionMap.put(KeysColumns.IS_REVOKED, Tables.KEYS + "." + KeysColumns.IS_REVOKED);
|
|
||||||
|
|
||||||
projectionMap.put(UserIdsColumns.USER_ID, Tables.USER_IDS + "." + UserIdsColumns.USER_ID);
|
|
||||||
|
|
||||||
qb.setProjectionMap(projectionMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TextUtils.isEmpty(sortOrder)) {
|
|
||||||
sortOrder = Tables.USER_IDS + "." + UserIdsColumns.USER_ID + " ASC";
|
|
||||||
}
|
|
||||||
|
|
||||||
// If no sort order is specified use the default
|
|
||||||
String orderBy;
|
|
||||||
if (TextUtils.isEmpty(sortOrder)) {
|
|
||||||
orderBy = Tables.KEY_RINGS + "." + KeyRingsColumns.TYPE + " DESC";
|
|
||||||
} else {
|
|
||||||
orderBy = Tables.KEY_RINGS + "." + KeyRingsColumns.TYPE + " DESC, " + sortOrder;
|
|
||||||
}
|
|
||||||
|
|
||||||
Cursor c = qb.query(db, projection, selection, selectionArgs,
|
|
||||||
Tables.KEY_RINGS + "." + KeyRingsColumns.MASTER_KEY_ID,
|
|
||||||
null, orderBy);
|
|
||||||
|
|
||||||
// Tell the cursor what uri to watch, so it knows when its source data changes
|
|
||||||
c.setNotificationUri(getContext().getContentResolver(), uri);
|
|
||||||
|
|
||||||
if (Constants.DEBUG) {
|
|
||||||
Log.d(Constants.TAG,
|
|
||||||
"Query: "
|
|
||||||
+ qb.buildQuery(projection, selection, selectionArgs, Tables.KEY_RINGS + "." + KeyRingsColumns.MASTER_KEY_ID, null,
|
|
||||||
orderBy, null));
|
|
||||||
Log.d(Constants.TAG, "Cursor: " + DatabaseUtils.dumpCursorToString(c));
|
|
||||||
}
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (match) {
|
switch (match) {
|
||||||
|
case UNIFIED_KEY_RING:
|
||||||
|
|
||||||
|
{ // SELECT
|
||||||
|
// todo: outsource into getprojectionmapforthingies? don't really see the point.
|
||||||
|
HashMap<String, String> projectionMap = new HashMap<String, String>();
|
||||||
|
|
||||||
|
// from keyrings table
|
||||||
|
projectionMap.put(BaseColumns._ID, Tables.KEY_RINGS + "." + BaseColumns._ID);
|
||||||
|
projectionMap.put(KeyRingsColumns.TYPE,
|
||||||
|
"MAX(" + Tables.KEY_RINGS + "." + KeyRingsColumns.TYPE + ")");
|
||||||
|
projectionMap.put(KeyRingsColumns.KEY_RING_DATA, Tables.KEY_RINGS + "."
|
||||||
|
+ KeyRingsColumns.KEY_RING_DATA);
|
||||||
|
projectionMap.put(KeyRingsColumns.MASTER_KEY_ID,
|
||||||
|
Tables.KEY_RINGS + "." + KeyRingsColumns.MASTER_KEY_ID);
|
||||||
|
|
||||||
|
// from keys table
|
||||||
|
projectionMap.put(KeysColumns.FINGERPRINT, Tables.KEYS + "." + KeysColumns.FINGERPRINT);
|
||||||
|
projectionMap.put(KeysColumns.IS_REVOKED, Tables.KEYS + "." + KeysColumns.IS_REVOKED);
|
||||||
|
|
||||||
|
// from user id table
|
||||||
|
projectionMap.put(UserIdsColumns.USER_ID, Tables.USER_IDS + "." + UserIdsColumns.USER_ID);
|
||||||
|
|
||||||
|
qb.setProjectionMap(projectionMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
{ // FROM
|
||||||
|
// todo: outsource into buildUnifiedQuery()? see above.
|
||||||
|
// join keyrings with keys and userIds
|
||||||
|
// Only get user id and key with rank 0 (main user id and main key)
|
||||||
|
qb.setTables(Tables.KEY_RINGS + " INNER JOIN " + Tables.KEYS + " ON " + "("
|
||||||
|
+ Tables.KEY_RINGS + "." + BaseColumns._ID + " = " + Tables.KEYS + "."
|
||||||
|
+ KeysColumns.KEY_RING_ROW_ID + " AND " + Tables.KEYS + "."
|
||||||
|
+ KeysColumns.RANK + " = '0') " + " INNER JOIN " + Tables.USER_IDS + " ON "
|
||||||
|
+ "(" + Tables.KEY_RINGS + "." + BaseColumns._ID + " = " + Tables.USER_IDS + "."
|
||||||
|
+ UserIdsColumns.KEY_RING_ROW_ID + " AND " + Tables.USER_IDS + "."
|
||||||
|
+ UserIdsColumns.RANK + " = '0')");
|
||||||
|
}
|
||||||
|
|
||||||
|
// GROUP BY
|
||||||
|
groupBy = Tables.KEY_RINGS + "." + KeyRingsColumns.MASTER_KEY_ID;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
case PUBLIC_KEY_RING:
|
case PUBLIC_KEY_RING:
|
||||||
case SECRET_KEY_RING:
|
case SECRET_KEY_RING:
|
||||||
qb = buildKeyRingQuery(qb, match);
|
qb = buildKeyRingQuery(qb, match);
|
||||||
@ -705,7 +688,7 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
orderBy = sortOrder;
|
orderBy = sortOrder;
|
||||||
}
|
}
|
||||||
|
|
||||||
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
|
Cursor c = qb.query(db, projection, selection, selectionArgs, groupBy, having, orderBy);
|
||||||
|
|
||||||
// Tell the cursor what uri to watch, so it knows when its source data changes
|
// Tell the cursor what uri to watch, so it knows when its source data changes
|
||||||
c.setNotificationUri(getContext().getContentResolver(), uri);
|
c.setNotificationUri(getContext().getContentResolver(), uri);
|
||||||
@ -855,6 +838,9 @@ public class KeychainProvider extends ContentProvider {
|
|||||||
|
|
||||||
// notify of changes in db
|
// notify of changes in db
|
||||||
getContext().getContentResolver().notifyChange(uri, null);
|
getContext().getContentResolver().notifyChange(uri, null);
|
||||||
|
getContext().getContentResolver().notifyChange(
|
||||||
|
KeyRings.buildUnifiedKeyRingsUri().buildUpon().appendPath("lulz").build(), null
|
||||||
|
);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;
|
|||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyTypes;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.KeyTypes;
|
||||||
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;
|
import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds;
|
||||||
|
import org.sufficientlysecure.keychain.provider.KeychainDatabase;
|
||||||
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
import org.sufficientlysecure.keychain.provider.ProviderHelper;
|
||||||
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
|
import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;
|
||||||
import org.sufficientlysecure.keychain.util.Log;
|
import org.sufficientlysecure.keychain.util.Log;
|
||||||
@ -255,7 +256,11 @@ public class KeyListFragment extends Fragment implements SearchView.OnQueryTextL
|
|||||||
|
|
||||||
static final int INDEX_TYPE = 1;
|
static final int INDEX_TYPE = 1;
|
||||||
static final int INDEX_UID = 3;
|
static final int INDEX_UID = 3;
|
||||||
static final String SORT_ORDER = UserIds.USER_ID + " ASC";
|
static final String SORT_ORDER =
|
||||||
|
// show secret before public key
|
||||||
|
KeychainDatabase.Tables.KEY_RINGS + "." + KeyRings.TYPE + " DESC, "
|
||||||
|
// sort by user id otherwise
|
||||||
|
+ UserIds.USER_ID + " ASC";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
|
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
|
||||||
|
Loading…
Reference in New Issue
Block a user