aboutsummaryrefslogtreecommitdiffstats
path: root/org_apg/src/org/thialfihar/android/apg/provider/ApgProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'org_apg/src/org/thialfihar/android/apg/provider/ApgProvider.java')
-rw-r--r--org_apg/src/org/thialfihar/android/apg/provider/ApgProvider.java355
1 files changed, 247 insertions, 108 deletions
diff --git a/org_apg/src/org/thialfihar/android/apg/provider/ApgProvider.java b/org_apg/src/org/thialfihar/android/apg/provider/ApgProvider.java
index 06d07fe5e..fce03600d 100644
--- a/org_apg/src/org/thialfihar/android/apg/provider/ApgProvider.java
+++ b/org_apg/src/org/thialfihar/android/apg/provider/ApgProvider.java
@@ -54,22 +54,28 @@ public class ApgProvider extends ContentProvider {
private static final UriMatcher sUriMatcher = buildUriMatcher();
private static final int PUBLIC_KEY_RING = 101;
- private static final int PUBLIC_KEY_RING_ROW_ID = 102;
- private static final int PUBLIC_KEY_RING_BY_KEY_ID = 103; // TODO: Is this row id???
- private static final int PUBLIC_KEY_RING_BY_EMAILS = 104;
+ private static final int PUBLIC_KEY_RING_BY_ROW_ID = 102;
+ private static final int PUBLIC_KEY_RING_BY_MASTER_KEY_ID = 103;
+ private static final int PUBLIC_KEY_RING_BY_KEY_ID = 104;
+ private static final int PUBLIC_KEY_RING_BY_EMAILS = 105;
+
private static final int PUBLIC_KEY_RING_KEY = 111;
- private static final int PUBLIC_KEY_RING_KEY_RANK = 112;
+ private static final int PUBLIC_KEY_RING_KEY_BY_ROW_ID = 112;
+
private static final int PUBLIC_KEY_RING_USER_ID = 121;
- private static final int PUBLIC_KEY_RING_USER_ID_RANK = 122;
+ private static final int PUBLIC_KEY_RING_USER_ID_BY_ROW_ID = 122;
private static final int SECRET_KEY_RING = 201;
- private static final int SECRET_KEY_RING_ROW_ID = 202;
- private static final int SECRET_KEY_RING_BY_KEY_ID = 203;
- private static final int SECRET_KEY_RING_BY_EMAILS = 204;
+ private static final int SECRET_KEY_RING_BY_ROW_ID = 202;
+ private static final int SECRET_KEY_RING_BY_MASTER_KEY_ID = 203;
+ private static final int SECRET_KEY_RING_BY_KEY_ID = 204;
+ private static final int SECRET_KEY_RING_BY_EMAILS = 205;
+
private static final int SECRET_KEY_RING_KEY = 211;
- private static final int SECRET_KEY_RING_KEY_RANK = 212;
+ private static final int SECRET_KEY_RING_KEY_BY_ROW_ID = 212;
+
private static final int SECRET_KEY_RING_USER_ID = 221;
- private static final int SECRET_KEY_RING_USER_ID_RANK = 222;
+ private static final int SECRET_KEY_RING_USER_ID_BY_ROW_ID = 222;
private static final int DATA_STREAM = 301;
@@ -86,7 +92,8 @@ public class ApgProvider extends ContentProvider {
*
* <pre>
* key_rings/public
- * key_rings/public/_
+ * key_rings/public/#
+ * key_rings/public/master_key_id/_
* key_rings/public/key_id/_
* key_rings/public/emails/_
* </pre>
@@ -94,8 +101,10 @@ public class ApgProvider extends ContentProvider {
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC,
PUBLIC_KEY_RING);
matcher.addURI(authority,
- ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC + "/*",
- PUBLIC_KEY_RING_ROW_ID);
+ ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC + "/#",
+ PUBLIC_KEY_RING_BY_ROW_ID);
+ matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC + "/"
+ + ApgContract.PATH_BY_MASTER_KEY_ID + "/*", PUBLIC_KEY_RING_BY_MASTER_KEY_ID);
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC + "/"
+ ApgContract.PATH_BY_KEY_ID + "/*", PUBLIC_KEY_RING_BY_KEY_ID);
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC + "/"
@@ -105,45 +114,46 @@ public class ApgProvider extends ContentProvider {
* public keys
*
* <pre>
- * key_rings/public/_/keys
- * key_rings/public/_/keys/#
+ * key_rings/public/#/keys
+ * key_rings/public/#/keys/#
* </pre>
*/
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC
- + "/*/" + ApgContract.PATH_KEYS, PUBLIC_KEY_RING_KEY);
+ + "/#/" + ApgContract.PATH_KEYS, PUBLIC_KEY_RING_KEY);
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC
- + "/*/" + ApgContract.PATH_KEYS + "/" + ApgContract.PATH_RANK,
- PUBLIC_KEY_RING_KEY_RANK);
+ + "/#/" + ApgContract.PATH_KEYS + "/#", PUBLIC_KEY_RING_KEY_BY_ROW_ID);
/**
* public user ids
*
* <pre>
- * key_rings/public/_/user_ids
- * key_rings/public/_/user_ids/#
+ * key_rings/public/#/user_ids
+ * key_rings/public/#/user_ids/#
* </pre>
*/
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC
- + "/*/" + ApgContract.PATH_USER_IDS, PUBLIC_KEY_RING_USER_ID);
+ + "/#/" + ApgContract.PATH_USER_IDS, PUBLIC_KEY_RING_USER_ID);
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_PUBLIC
- + "/*/" + ApgContract.PATH_USER_IDS + "/" + ApgContract.PATH_RANK,
- PUBLIC_KEY_RING_USER_ID_RANK);
+ + "/#/" + ApgContract.PATH_USER_IDS + "/#", PUBLIC_KEY_RING_USER_ID_BY_ROW_ID);
/**
* secret key rings
*
* <pre>
* key_rings/secret
- * key_rings/secret/*
- * key_rings/secret/key_id/*
- * key_rings/secret/emails/*
+ * key_rings/secret/#
+ * key_rings/secret/master_key_id/_
+ * key_rings/secret/key_id/_
+ * key_rings/secret/emails/_
* </pre>
*/
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET,
SECRET_KEY_RING);
matcher.addURI(authority,
- ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET + "/*",
- SECRET_KEY_RING_ROW_ID);
+ ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET + "/#",
+ SECRET_KEY_RING_BY_ROW_ID);
+ matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET + "/"
+ + ApgContract.PATH_BY_MASTER_KEY_ID + "/*", SECRET_KEY_RING_BY_MASTER_KEY_ID);
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET + "/"
+ ApgContract.PATH_BY_KEY_ID + "/*", SECRET_KEY_RING_BY_KEY_ID);
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET + "/"
@@ -153,29 +163,27 @@ public class ApgProvider extends ContentProvider {
* secret keys
*
* <pre>
- * key_rings/secret/_/keys
- * key_rings/secret/_/keys/#
+ * key_rings/secret/#/keys
+ * key_rings/secret/#/keys/#
* </pre>
*/
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET
- + "/*/" + ApgContract.PATH_KEYS, SECRET_KEY_RING_KEY);
+ + "/#/" + ApgContract.PATH_KEYS, SECRET_KEY_RING_KEY);
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET
- + "/*/" + ApgContract.PATH_KEYS + "/" + ApgContract.PATH_RANK,
- SECRET_KEY_RING_KEY_RANK);
+ + "/#/" + ApgContract.PATH_KEYS + "/#", SECRET_KEY_RING_KEY_BY_ROW_ID);
/**
* secret user ids
*
* <pre>
- * key_rings/secret/_/user_ids
- * key_rings/secret/_/user_ids/#
+ * key_rings/secret/#/user_ids
+ * key_rings/secret/#/user_ids/#
* </pre>
*/
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET
- + "/*/" + ApgContract.PATH_USER_IDS, SECRET_KEY_RING_USER_ID);
+ + "/#/" + ApgContract.PATH_USER_IDS, SECRET_KEY_RING_USER_ID);
matcher.addURI(authority, ApgContract.BASE_KEY_RINGS + "/" + ApgContract.PATH_SECRET
- + "/*/" + ApgContract.PATH_USER_IDS + "/" + ApgContract.PATH_RANK,
- SECRET_KEY_RING_USER_ID_RANK);
+ + "/#/" + ApgContract.PATH_USER_IDS + "/#", SECRET_KEY_RING_USER_ID_BY_ROW_ID);
/**
* data stream
@@ -208,40 +216,42 @@ public class ApgProvider extends ContentProvider {
case PUBLIC_KEY_RING_BY_EMAILS:
return PublicKeyRings.CONTENT_TYPE;
- case PUBLIC_KEY_RING_ROW_ID:
+ case PUBLIC_KEY_RING_BY_ROW_ID:
+ case PUBLIC_KEY_RING_BY_MASTER_KEY_ID:
case PUBLIC_KEY_RING_BY_KEY_ID:
return PublicKeyRings.CONTENT_ITEM_TYPE;
case PUBLIC_KEY_RING_KEY:
return PublicKeys.CONTENT_TYPE;
- case PUBLIC_KEY_RING_KEY_RANK:
+ case PUBLIC_KEY_RING_KEY_BY_ROW_ID:
return PublicKeys.CONTENT_ITEM_TYPE;
case PUBLIC_KEY_RING_USER_ID:
return PublicUserIds.CONTENT_TYPE;
- case PUBLIC_KEY_RING_USER_ID_RANK:
+ case PUBLIC_KEY_RING_USER_ID_BY_ROW_ID:
return PublicUserIds.CONTENT_ITEM_TYPE;
case SECRET_KEY_RING:
case SECRET_KEY_RING_BY_EMAILS:
return SecretKeyRings.CONTENT_TYPE;
- case SECRET_KEY_RING_ROW_ID:
+ case SECRET_KEY_RING_BY_ROW_ID:
+ case SECRET_KEY_RING_BY_MASTER_KEY_ID:
case SECRET_KEY_RING_BY_KEY_ID:
return SecretKeyRings.CONTENT_ITEM_TYPE;
case SECRET_KEY_RING_KEY:
return SecretKeys.CONTENT_TYPE;
- case SECRET_KEY_RING_KEY_RANK:
+ case SECRET_KEY_RING_KEY_BY_ROW_ID:
return SecretKeys.CONTENT_ITEM_TYPE;
case SECRET_KEY_RING_USER_ID:
return SecretUserIds.CONTENT_TYPE;
- case SECRET_KEY_RING_USER_ID_RANK:
+ case SECRET_KEY_RING_USER_ID_BY_ROW_ID:
return SecretUserIds.CONTENT_ITEM_TYPE;
default:
@@ -259,24 +269,24 @@ public class ApgProvider extends ContentProvider {
int type;
switch (match) {
case PUBLIC_KEY_RING:
- case PUBLIC_KEY_RING_ROW_ID:
+ case PUBLIC_KEY_RING_BY_MASTER_KEY_ID:
case PUBLIC_KEY_RING_BY_KEY_ID:
case PUBLIC_KEY_RING_BY_EMAILS:
case PUBLIC_KEY_RING_KEY:
- case PUBLIC_KEY_RING_KEY_RANK:
+ case PUBLIC_KEY_RING_KEY_BY_ROW_ID:
case PUBLIC_KEY_RING_USER_ID:
- case PUBLIC_KEY_RING_USER_ID_RANK:
+ case PUBLIC_KEY_RING_USER_ID_BY_ROW_ID:
type = KeyTypes.PUBLIC;
break;
case SECRET_KEY_RING:
- case SECRET_KEY_RING_ROW_ID:
+ case SECRET_KEY_RING_BY_MASTER_KEY_ID:
case SECRET_KEY_RING_BY_KEY_ID:
case SECRET_KEY_RING_BY_EMAILS:
case SECRET_KEY_RING_KEY:
- case SECRET_KEY_RING_KEY_RANK:
+ case SECRET_KEY_RING_KEY_BY_ROW_ID:
case SECRET_KEY_RING_USER_ID:
- case SECRET_KEY_RING_USER_ID_RANK:
+ case SECRET_KEY_RING_USER_ID_BY_ROW_ID:
type = KeyTypes.SECRET;
break;
@@ -301,76 +311,93 @@ public class ApgProvider extends ContentProvider {
int match = sUriMatcher.match(uri);
- qb.appendWhere(Tables.KEY_RINGS + "." + KeyRingsColumns.TYPE + " = " + getKeyType(match));
-
switch (match) {
- case PUBLIC_KEY_RING_ROW_ID:
- case SECRET_KEY_RING_ROW_ID:
- qb.appendWhere(" AND " + Tables.KEY_RINGS + "." + KeyRingsColumns.MASTER_KEY_ROW_ID
- + " = ");
- qb.appendWhereEscapeString(uri.getPathSegments().get(2));
+ case PUBLIC_KEY_RING_BY_ROW_ID:
+ case SECRET_KEY_RING_BY_ROW_ID:
+ qb.appendWhere(Tables.KEY_RINGS + "." + KeyRingsColumns.TYPE + " = "
+ + getKeyType(match));
+
+ qb.appendWhere(Tables.KEY_RINGS + "." + BaseColumns._ID + " = ");
+ qb.appendWhereEscapeString(uri.getLastPathSegment());
+
+ // break omitted intentionally
+
+ case PUBLIC_KEY_RING_BY_MASTER_KEY_ID:
+ case SECRET_KEY_RING_BY_MASTER_KEY_ID:
+ qb.appendWhere(Tables.KEY_RINGS + "." + KeyRingsColumns.MASTER_KEY_ID + " = ");
+ qb.appendWhereEscapeString(uri.getLastPathSegment());
// break omitted intentionally
case PUBLIC_KEY_RING:
case SECRET_KEY_RING:
+
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.IS_MASTER_KEY + " = '1'" + ") " + " INNER JOIN " + Tables.USERS
- + " ON " + "(" + Tables.KEYS + "." + BaseColumns._ID + " = " + Tables.USERS
- + "." + UserIdsColumns.KEY_ROW_ID + " AND " + Tables.USERS + "."
- + UserIdsColumns.RANK + " = '0') ");
+ + KeysColumns.IS_MASTER_KEY + " = '1'" + ") " + " INNER JOIN "
+ + Tables.USER_IDS + " ON " + "(" + Tables.KEYS + "." + BaseColumns._ID + " = "
+ + Tables.USER_IDS + "." + UserIdsColumns.KEY_RING_ROW_ID + " AND "
+ + Tables.USER_IDS + "." + UserIdsColumns.RANK + " = '0') ");
projectionMap.put(BaseColumns._ID, Tables.KEY_RINGS + "." + BaseColumns._ID);
- projectionMap.put(KeyRingsColumns.MASTER_KEY_ROW_ID, Tables.KEY_RINGS + "."
- + KeyRingsColumns.MASTER_KEY_ROW_ID);
- projectionMap.put(UserIdsColumns.USER_ID, Tables.USERS + "." + UserIdsColumns.USER_ID);
+ projectionMap.put(KeyRingsColumns.MASTER_KEY_ID, Tables.KEY_RINGS + "."
+ + KeyRingsColumns.MASTER_KEY_ID);
+ projectionMap.put(UserIdsColumns.USER_ID, Tables.USER_IDS + "."
+ + UserIdsColumns.USER_ID);
if (TextUtils.isEmpty(sortOrder)) {
- sortOrder = Tables.USERS + "." + UserIdsColumns.USER_ID + " ASC";
+ sortOrder = Tables.USER_IDS + "." + UserIdsColumns.USER_ID + " ASC";
}
break;
case SECRET_KEY_RING_BY_KEY_ID:
case PUBLIC_KEY_RING_BY_KEY_ID:
+ qb.appendWhere(Tables.KEY_RINGS + "." + KeyRingsColumns.TYPE + " = "
+ + getKeyType(match));
+
qb.setTables(Tables.KEYS + " AS tmp INNER JOIN " + Tables.KEY_RINGS + " ON ("
+ Tables.KEY_RINGS + "." + BaseColumns._ID + " = " + "tmp."
+ KeysColumns.KEY_RING_ROW_ID + ")" + " INNER JOIN " + Tables.KEYS + " ON "
+ "(" + Tables.KEY_RINGS + "." + BaseColumns._ID + " = " + Tables.KEYS + "."
+ KeysColumns.KEY_RING_ROW_ID + " AND " + Tables.KEYS + "."
- + KeysColumns.IS_MASTER_KEY + " = '1'" + ") " + " INNER JOIN " + Tables.USERS
- + " ON " + "(" + Tables.KEYS + "." + BaseColumns._ID + " = " + Tables.USERS
- + "." + UserIdsColumns.KEY_ROW_ID + " AND " + Tables.USERS + "."
- + UserIdsColumns.RANK + " = '0') ");
+ + KeysColumns.IS_MASTER_KEY + " = '1'" + ") " + " INNER JOIN "
+ + Tables.USER_IDS + " ON " + "(" + Tables.KEYS + "." + BaseColumns._ID + " = "
+ + Tables.USER_IDS + "." + UserIdsColumns.KEY_RING_ROW_ID + " AND "
+ + Tables.USER_IDS + "." + UserIdsColumns.RANK + " = '0') ");
projectionMap.put(BaseColumns._ID, Tables.KEY_RINGS + "." + BaseColumns._ID);
- projectionMap.put(KeyRingsColumns.MASTER_KEY_ROW_ID, Tables.KEY_RINGS + "."
- + KeyRingsColumns.MASTER_KEY_ROW_ID);
- projectionMap.put(UserIdsColumns.USER_ID, Tables.USERS + "." + UserIdsColumns.USER_ID);
+ projectionMap.put(KeyRingsColumns.MASTER_KEY_ID, Tables.KEY_RINGS + "."
+ + KeyRingsColumns.MASTER_KEY_ID);
+ projectionMap.put(UserIdsColumns.USER_ID, Tables.USER_IDS + "."
+ + UserIdsColumns.USER_ID);
- qb.appendWhere(" AND tmp." + KeysColumns.KEY_ID + " = ");
- qb.appendWhereEscapeString(uri.getPathSegments().get(3));
+ qb.appendWhere("tmp." + KeysColumns.KEY_ID + " = ");
+ qb.appendWhereEscapeString(uri.getLastPathSegment());
break;
case SECRET_KEY_RING_BY_EMAILS:
case PUBLIC_KEY_RING_BY_EMAILS:
+ qb.appendWhere(Tables.KEY_RINGS + "." + KeyRingsColumns.TYPE + " = "
+ + getKeyType(match));
+
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.IS_MASTER_KEY + " = '1'" + ") " + " INNER JOIN " + Tables.USERS
- + " ON " + "(" + Tables.KEYS + "." + BaseColumns._ID + " = " + Tables.USERS
- + "." + UserIdsColumns.KEY_ROW_ID + " AND " + Tables.USERS + "."
- + UserIdsColumns.RANK + " = '0') ");
+ + KeysColumns.IS_MASTER_KEY + " = '1'" + ") " + " INNER JOIN "
+ + Tables.USER_IDS + " ON " + "(" + Tables.KEYS + "." + BaseColumns._ID + " = "
+ + Tables.USER_IDS + "." + UserIdsColumns.KEY_RING_ROW_ID + " AND "
+ + Tables.USER_IDS + "." + UserIdsColumns.RANK + " = '0') ");
projectionMap.put(BaseColumns._ID, Tables.KEY_RINGS + "." + BaseColumns._ID);
- projectionMap.put(KeyRingsColumns.MASTER_KEY_ROW_ID, Tables.KEY_RINGS + "."
- + KeyRingsColumns.MASTER_KEY_ROW_ID);
- projectionMap.put(UserIdsColumns.USER_ID, Tables.USERS + "." + UserIdsColumns.USER_ID);
+ projectionMap.put(KeyRingsColumns.MASTER_KEY_ID, Tables.KEY_RINGS + "."
+ + KeyRingsColumns.MASTER_KEY_ID);
+ projectionMap.put(UserIdsColumns.USER_ID, Tables.USER_IDS + "."
+ + UserIdsColumns.USER_ID);
- String emails = uri.getPathSegments().get(3);
+ String emails = uri.getLastPathSegment();
String chunks[] = emails.split(" *, *");
boolean gotCondition = false;
String emailWhere = "";
@@ -388,13 +415,46 @@ public class ApgProvider extends ContentProvider {
}
if (gotCondition) {
- qb.appendWhere(" AND EXISTS (SELECT tmp." + BaseColumns._ID + " FROM "
- + Tables.USERS + " AS tmp WHERE tmp." + UserIdsColumns.KEY_ROW_ID + " = "
+ qb.appendWhere("EXISTS (SELECT tmp." + BaseColumns._ID + " FROM " + Tables.USER_IDS
+ + " AS tmp WHERE tmp." + UserIdsColumns.KEY_RING_ROW_ID + " = "
+ Tables.KEYS + "." + BaseColumns._ID + " AND (" + emailWhere + "))");
}
break;
+ case PUBLIC_KEY_RING_KEY_BY_ROW_ID:
+ case SECRET_KEY_RING_KEY_BY_ROW_ID:
+ String keyRowId = uri.getLastPathSegment();
+ qb.appendWhere(BaseColumns._ID + " = " + keyRowId);
+
+ // break omitted intentionally
+
+ case PUBLIC_KEY_RING_KEY:
+ case SECRET_KEY_RING_KEY:
+ qb.setTables(Tables.KEYS);
+ qb.appendWhere(KeysColumns.TYPE + " = " + getKeyType(match));
+
+ String foreignKeyRingRowId = uri.getPathSegments().get(2);
+ qb.appendWhere(KeysColumns.KEY_RING_ROW_ID + " = " + foreignKeyRingRowId);
+
+ break;
+
+ case PUBLIC_KEY_RING_USER_ID_BY_ROW_ID:
+ case SECRET_KEY_RING_USER_ID_BY_ROW_ID:
+ String userIdRowId = uri.getLastPathSegment();
+ qb.appendWhere(BaseColumns._ID + " = " + userIdRowId);
+
+ // break omitted intentionally
+
+ case PUBLIC_KEY_RING_USER_ID:
+ case SECRET_KEY_RING_USER_ID:
+ qb.setTables(Tables.USER_IDS);
+
+ String foreignKeyRowId = uri.getPathSegments().get(2);
+ qb.appendWhere(UserIdsColumns.KEY_RING_ROW_ID + " = " + foreignKeyRowId);
+
+ break;
+
default:
throw new IllegalArgumentException("Unknown URI " + uri);
@@ -410,9 +470,6 @@ public class ApgProvider extends ContentProvider {
orderBy = sortOrder;
}
- Log.d(Constants.TAG,
- qb.buildQuery(projection, selection, selectionArgs, null, null, orderBy, null)
- .replace("WHERE", "WHERE\n"));
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
// Tell the cursor what uri to watch, so it knows when its source data changes
@@ -448,7 +505,7 @@ public class ApgProvider extends ContentProvider {
break;
case PUBLIC_KEY_RING_USER_ID:
- db.insertOrThrow(Tables.USERS, null, values);
+ db.insertOrThrow(Tables.USER_IDS, null, values);
rowUri = PublicUserIds.buildPublicUserIdsUri(values.getAsString(PublicUserIds._ID));
break;
@@ -468,7 +525,7 @@ public class ApgProvider extends ContentProvider {
break;
case SECRET_KEY_RING_USER_ID:
- db.insertOrThrow(Tables.USERS, null, values);
+ db.insertOrThrow(Tables.USER_IDS, null, values);
rowUri = SecretUserIds.buildSecretUserIdsUri(values.getAsString(SecretUserIds._ID));
break;
@@ -496,16 +553,28 @@ public class ApgProvider extends ContentProvider {
final int match = sUriMatcher.match(uri);
switch (match) {
- case PUBLIC_KEY_RING_ROW_ID:
- // corresponding keys and userids are deleted by ON DELETE CASCADE
+ case PUBLIC_KEY_RING_BY_ROW_ID:
+ // corresponding keys and userIds are deleted by ON DELETE CASCADE
count = db.delete(Tables.KEY_RINGS,
- buildDefaultSelection(uri, KeyTypes.PUBLIC, selection), selectionArgs);
+ buildDefaultKeyRingsSelection(uri, KeyTypes.PUBLIC, selection), selectionArgs);
break;
- case SECRET_KEY_RING_ROW_ID:
- // corresponding keys and userids are deleted by ON DELETE CASCADE
+ case SECRET_KEY_RING_BY_ROW_ID:
+ // corresponding keys and userIds are deleted by ON DELETE CASCADE
count = db.delete(Tables.KEY_RINGS,
- buildDefaultSelection(uri, KeyTypes.SECRET, selection), selectionArgs);
+ buildDefaultKeyRingsSelection(uri, KeyTypes.SECRET, selection), selectionArgs);
break;
+ case PUBLIC_KEY_RING_KEY_BY_ROW_ID:
+ count = db.delete(Tables.KEYS,
+ buildDefaultKeysSelection(uri, KeyTypes.PUBLIC, selection), selectionArgs);
+ case SECRET_KEY_RING_KEY_BY_ROW_ID:
+ count = db.delete(Tables.KEYS,
+ buildDefaultKeysSelection(uri, KeyTypes.SECRET, selection), selectionArgs);
+ case PUBLIC_KEY_RING_USER_ID_BY_ROW_ID:
+ count = db.delete(Tables.KEYS, buildDefaultUserIdsSelection(uri, selection),
+ selectionArgs);
+ case SECRET_KEY_RING_USER_ID_BY_ROW_ID:
+ count = db.delete(Tables.KEYS, buildDefaultUserIdsSelection(uri, selection),
+ selectionArgs);
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
}
@@ -527,13 +596,31 @@ public class ApgProvider extends ContentProvider {
try {
final int match = sUriMatcher.match(uri);
switch (match) {
- case PUBLIC_KEY_RING_ROW_ID:
+ case PUBLIC_KEY_RING_BY_ROW_ID:
count = db.update(Tables.KEY_RINGS, values,
- buildDefaultSelection(uri, KeyTypes.PUBLIC, selection), selectionArgs);
+ buildDefaultKeyRingsSelection(uri, KeyTypes.PUBLIC, selection),
+ selectionArgs);
break;
- case SECRET_KEY_RING_ROW_ID:
+ case SECRET_KEY_RING_BY_ROW_ID:
count = db.update(Tables.KEY_RINGS, values,
- buildDefaultSelection(uri, KeyTypes.SECRET, selection), selectionArgs);
+ buildDefaultKeyRingsSelection(uri, KeyTypes.SECRET, selection),
+ selectionArgs);
+ break;
+ case PUBLIC_KEY_RING_KEY_BY_ROW_ID:
+ count = db.update(Tables.KEYS, values,
+ buildDefaultKeysSelection(uri, KeyTypes.PUBLIC, selection), selectionArgs);
+ break;
+ case SECRET_KEY_RING_KEY_BY_ROW_ID:
+ count = db.update(Tables.KEYS, values,
+ buildDefaultKeysSelection(uri, KeyTypes.SECRET, selection), selectionArgs);
+ break;
+ case PUBLIC_KEY_RING_USER_ID_BY_ROW_ID:
+ count = db.update(Tables.USER_IDS, values,
+ buildDefaultUserIdsSelection(uri, selection), selectionArgs);
+ break;
+ case SECRET_KEY_RING_USER_ID_BY_ROW_ID:
+ count = db.update(Tables.USER_IDS, values,
+ buildDefaultUserIdsSelection(uri, selection), selectionArgs);
break;
default:
throw new UnsupportedOperationException("Unknown uri: " + uri);
@@ -549,26 +636,78 @@ public class ApgProvider extends ContentProvider {
}
/**
- * Build default selection statement. If no extra selection is specified only build where clause
- * with rowId
+ * Build default selection statement for KeyRings. If no extra selection is specified only build
+ * where clause with rowId
*
* @param uri
* @param selection
* @return
*/
- private String buildDefaultSelection(Uri uri, Integer keyType, String selection) {
- String rowId = uri.getPathSegments().get(1);
- String andWhere = "";
+ private String buildDefaultKeyRingsSelection(Uri uri, Integer keyType, String selection) {
+ String rowId = uri.getLastPathSegment();
+
+ String andType = "";
+ if (keyType != null) {
+ andType = " AND " + KeyRingsColumns.TYPE + "=" + keyType;
+ }
+
+ String andSelection = "";
if (!TextUtils.isEmpty(selection)) {
- andWhere = " AND (" + selection + ")";
+ andSelection = " AND (" + selection + ")";
}
+ return BaseColumns._ID + "=" + rowId + andType + andSelection;
+ }
+
+ /**
+ * Build default selection statement for Keys. If no extra selection is specified only build
+ * where clause with rowId
+ *
+ * @param uri
+ * @param selection
+ * @return
+ */
+ private String buildDefaultKeysSelection(Uri uri, Integer keyType, String selection) {
+ String rowId = uri.getLastPathSegment();
+
+ String foreignKeyRingRowId = uri.getPathSegments().get(2);
+ String andForeignKeyRing = " AND " + KeysColumns.KEY_RING_ROW_ID + " = "
+ + foreignKeyRingRowId;
+
String andType = "";
if (keyType != null) {
- andType = " AND " + KeyRingsColumns.TYPE + "=" + keyType;
+ andType = " AND " + KeysColumns.TYPE + "=" + keyType;
+ }
+
+ String andSelection = "";
+ if (!TextUtils.isEmpty(selection)) {
+ andSelection = " AND (" + selection + ")";
+ }
+
+ return BaseColumns._ID + "=" + rowId + andForeignKeyRing + andType + andSelection;
+ }
+
+ /**
+ * Build default selection statement for UserIds. If no extra selection is specified only build
+ * where clause with rowId
+ *
+ * @param uri
+ * @param selection
+ * @return
+ */
+ private String buildDefaultUserIdsSelection(Uri uri, String selection) {
+ String rowId = uri.getLastPathSegment();
+
+ String foreignKeyRingRowId = uri.getPathSegments().get(2);
+ String andForeignKeyRing = " AND " + KeysColumns.KEY_RING_ROW_ID + " = "
+ + foreignKeyRingRowId;
+
+ String andSelection = "";
+ if (!TextUtils.isEmpty(selection)) {
+ andSelection = " AND (" + selection + ")";
}
- return BaseColumns._ID + "=" + rowId + andType + andWhere;
+ return BaseColumns._ID + "=" + rowId + andForeignKeyRing + andSelection;
}
@Override
@@ -577,7 +716,7 @@ public class ApgProvider extends ContentProvider {
if (match != DATA_STREAM) {
throw new FileNotFoundException();
}
- String fileName = uri.getPathSegments().get(1);
+ String fileName = uri.getLastPathSegment();
File file = new File(getContext().getFilesDir().getAbsolutePath(), fileName);
return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
}