diff --git a/src/org/fdroid/fdroid/DB.java b/src/org/fdroid/fdroid/DB.java index f3089476f..5603f0294 100644 --- a/src/org/fdroid/fdroid/DB.java +++ b/src/org/fdroid/fdroid/DB.java @@ -104,7 +104,7 @@ public class DB { + "lastUpdated string," + "compatible int not null," + "ignoreAllUpdates int not null," + "ignoreThisUpdate int not null," - + "primary key(id));"; + + "provides string," + "primary key(id));"; public static class App implements Comparable { @@ -121,6 +121,7 @@ public class DB { detail_litecoinAddr = null; detail_webURL = null; categories = null; + provides = null; antiFeatures = null; requirements = null; hasUpdates = false; @@ -191,6 +192,9 @@ public class DB { public int installedVerCode; public boolean userInstalled; + // List of app IDs that this app provides or null if there aren't any. + public CommaSeparatedList provides; + // List of categories (as defined in the metadata // documentation) or null if there aren't any. public CommaSeparatedList categories; @@ -457,7 +461,7 @@ public class DB { public String lastetag; // last etag we updated from, null forces update } - private final int DBVersion = 30; + private final int DBVersion = 31; private static void createAppApk(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_APP); @@ -836,7 +840,8 @@ public class DB { String cols[] = new String[] { "antiFeatures", "requirements", "categories", "id", "name", "summary", "icon", "license", "curVersion", "curVercode", "added", "lastUpdated", - "compatible", "ignoreAllUpdates", "ignoreThisUpdate" }; + "compatible", "ignoreAllUpdates", "ignoreThisUpdate", + "provides" }; c = db.query(TABLE_APP, cols, null, null, null, null, null); c.moveToFirst(); while (!c.isAfterLast()) { @@ -862,6 +867,7 @@ public class DB { app.compatible = c.getInt(12) == 1; app.ignoreAllUpdates = c.getInt(13) == 1; app.ignoreThisUpdate = c.getInt(14); + app.provides = DB.CommaSeparatedList.make(c.getString(15)); app.hasUpdates = false; if (getinstalledinfo && systemApks.containsKey(app.id)) { @@ -881,6 +887,11 @@ public class DB { } apps.put(app.id, app); + if (app.provides != null) { + for (String id : app.provides) { + apps.put(id, app); + } + } c.moveToNext(); } @@ -1038,7 +1049,7 @@ public class DB { try { String filter = "%" + query + "%"; c = db.query(TABLE_APP, new String[] { "id" }, - "id like ? or name like ? or summary like ? or description like ?", + "id like ? or provides like ? or name like ? or summary like ? or description like ?", new String[] { filter, filter, filter, filter }, null, null, null); c.moveToFirst(); while (!c.isAfterLast()) { diff --git a/src/org/fdroid/fdroid/RepoXMLHandler.java b/src/org/fdroid/fdroid/RepoXMLHandler.java index 29648f7c9..9053fb497 100644 --- a/src/org/fdroid/fdroid/RepoXMLHandler.java +++ b/src/org/fdroid/fdroid/RepoXMLHandler.java @@ -240,6 +240,8 @@ public class RepoXMLHandler extends DefaultHandler { } catch (NumberFormatException ex) { curapp.curVercode = -1; } + } else if (curel.equals("provides")) { + curapp.provides = DB.CommaSeparatedList.make(str); } else if (curel.equals("categories")) { curapp.categories = DB.CommaSeparatedList.make(str); } else if (curel.equals("antifeatures")) {