diff options
2 files changed, 47 insertions, 56 deletions
| diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java index 8b0efdbbd..3782f85fd 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainProvider.java @@ -467,70 +467,53 @@ public class KeychainProvider extends ContentProvider {          int match = mUriMatcher.match(uri); -        // screw that switch -        if(match == UNIFIED_KEY_RING) { +        // all query() parameters, for good measure +        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); +        switch (match) { +            case UNIFIED_KEY_RING: -                projectionMap.put(UserIdsColumns.USER_ID, Tables.USER_IDS + "." + UserIdsColumns.USER_ID); +                { // SELECT +                    // todo: outsource into getprojectionmapforthingies? don't really see the point. +                    HashMap<String, String> projectionMap = new HashMap<String, String>(); -                qb.setProjectionMap(projectionMap); -            } +                    // 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); -            if (TextUtils.isEmpty(sortOrder)) { -                sortOrder = Tables.USER_IDS + "." + UserIdsColumns.USER_ID + " ASC"; -            } +                    // from keys table +                    projectionMap.put(KeysColumns.FINGERPRINT, Tables.KEYS + "." + KeysColumns.FINGERPRINT); +                    projectionMap.put(KeysColumns.IS_REVOKED, Tables.KEYS + "." + KeysColumns.IS_REVOKED); -            // 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; -            } +                    // from user id table +                    projectionMap.put(UserIdsColumns.USER_ID, Tables.USER_IDS + "." + UserIdsColumns.USER_ID); -            Cursor c = qb.query(db, projection, selection, selectionArgs, -                    Tables.KEY_RINGS + "." + KeyRingsColumns.MASTER_KEY_ID, -                    null, orderBy); +                    qb.setProjectionMap(projectionMap); +                } -            // Tell the cursor what uri to watch, so it knows when its source data changes -            c.setNotificationUri(getContext().getContentResolver(), uri); +                { // 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')"); +                } -            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)); -            } +                // GROUP BY +                groupBy = Tables.KEY_RINGS + "." + KeyRingsColumns.MASTER_KEY_ID; -            return c; -        } +                break; -        switch (match) {              case PUBLIC_KEY_RING:              case SECRET_KEY_RING:                  qb = buildKeyRingQuery(qb, match); @@ -705,7 +688,7 @@ public class KeychainProvider extends ContentProvider {              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          c.setNotificationUri(getContext().getContentResolver(), uri); @@ -855,6 +838,9 @@ public class KeychainProvider extends ContentProvider {          // notify of changes in db          getContext().getContentResolver().notifyChange(uri, null); +        getContext().getContentResolver().notifyChange( +                KeyRings.buildUnifiedKeyRingsUri().buildUpon().appendPath("lulz").build(), null +        );          return count;      } diff --git a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java index 5b57132d4..72af24717 100644 --- a/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java +++ b/OpenPGP-Keychain/src/main/java/org/sufficientlysecure/keychain/ui/KeyListFragment.java @@ -31,6 +31,7 @@ import org.sufficientlysecure.keychain.provider.KeychainContract;  import org.sufficientlysecure.keychain.provider.KeychainContract.KeyRings;  import org.sufficientlysecure.keychain.provider.KeychainContract.KeyTypes;  import org.sufficientlysecure.keychain.provider.KeychainContract.UserIds; +import org.sufficientlysecure.keychain.provider.KeychainDatabase;  import org.sufficientlysecure.keychain.provider.ProviderHelper;  import org.sufficientlysecure.keychain.ui.dialog.DeleteKeyDialogFragment;  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_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      public Loader<Cursor> onCreateLoader(int id, Bundle args) { | 
