diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java index 4cdd93ff..e6f6c534 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseBoardManager.java @@ -1,5 +1,7 @@ package org.floens.chan.core.database; +import com.j256.ormlite.stmt.QueryBuilder; + import org.floens.chan.core.model.orm.Board; import org.floens.chan.core.site.Site; import org.floens.chan.core.site.Sites; @@ -35,8 +37,19 @@ public class DatabaseBoardManager { return new Callable() { @Override public Void call() throws Exception { - for (Board b : boards) { - helper.boardsDao.createOrUpdate(b); + // TODO: optimize + for (Board board : boards) { + QueryBuilder q = helper.boardsDao.queryBuilder(); + q.where().eq("site", board.getSite().id()) + .and().eq("value", board.code); + Board existing = q.queryForFirst(); + if (existing != null) { + existing.update(board); + helper.boardsDao.update(existing); + board.update(existing); + } else { + helper.boardsDao.create(board); + } } return null; diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHelper.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHelper.java index 6ee26895..e577d4ad 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseHelper.java @@ -219,21 +219,6 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { Logger.e(TAG, "Error upgrading to version 22", e); } -// final Site[] siteRef = new Site[1]; -// getGraph().get(SiteManager.class).addSiteFromClass(Chan4.class, new SiteManager.SiteAddCallback() { -// @Override -// public void onSiteAdded(Site site) { -// siteRef[0] = site; -// } -// -// @Override -// public void onSiteAddFailed(String message) { -// throw new RuntimeException("Error adding site for db upgrade: " + message); -// } -// }); -// -// // Will always be 1 -// int siteId = siteRef[0].id(); int siteId = 0; try { diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java index 762c2231..bd073bb5 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseManager.java @@ -269,7 +269,7 @@ public class DatabaseManager { } public void runTask(final Callable taskCallable, final TaskResult taskResult) { - executeTask(taskCallable, taskResult); + Future f = executeTask(taskCallable, taskResult); } public T runTaskSync(final Callable taskCallable) { @@ -305,6 +305,7 @@ public class DatabaseManager { } return result; } catch (Exception e) { + Logger.e(TAG, "executeTask", e); throw new RuntimeException(e); } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java index 62eeed57..34afbc72 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/BoardManager.java @@ -95,7 +95,7 @@ public class BoardManager { public void saveBoard(Board board) { board.saved = true; - board = databaseManager.runTaskSync(databaseManager.getDatabaseBoardManager().createOrUpdate(board)); + databaseManager.runTaskSync(databaseManager.getDatabaseBoardManager().createOrUpdate(board)); loadBoards(); } @@ -103,7 +103,7 @@ public class BoardManager { public void unsaveBoard(Board board) { board.saved = false; - board = databaseManager.runTaskSync(databaseManager.getDatabaseBoardManager().createOrUpdate(board)); + databaseManager.runTaskSync(databaseManager.getDatabaseBoardManager().createOrUpdate(board)); loadBoards(); } diff --git a/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java b/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java index 77a61458..af7ec753 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java @@ -113,7 +113,6 @@ public class WatchManager { } }; - @Inject ChanLoaderFactory chanLoaderFactory; private final AlarmManager alarmManager; @@ -134,11 +133,13 @@ public class WatchManager { private long lastBackgroundUpdateTime; @Inject - public WatchManager(DatabaseManager databaseManager) { + public WatchManager(DatabaseManager databaseManager, ChanLoaderFactory chanLoaderFactory) { alarmManager = (AlarmManager) getAppContext().getSystemService(Context.ALARM_SERVICE); powerManager = (PowerManager) getAppContext().getSystemService(Context.POWER_SERVICE); this.databaseManager = databaseManager; + this.chanLoaderFactory = chanLoaderFactory; + databasePinManager = databaseManager.getDatabasePinManager(); pins = databaseManager.runTaskSync(databasePinManager.getPins()); Collections.sort(pins, SORT_PINS); diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/orm/Board.java b/Clover/app/src/main/java/org/floens/chan/core/model/orm/Board.java index d21a9ffe..35c6a212 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/orm/Board.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/orm/Board.java @@ -25,6 +25,9 @@ import com.j256.ormlite.table.DatabaseTable; import org.floens.chan.core.model.SiteReference; import org.floens.chan.core.site.Site; +/** + * A board is something that can be browsed, it is unique by it's site and code. + */ @DatabaseTable(tableName = "board") public class Board implements SiteReference { @DatabaseField(generatedId = true) @@ -38,6 +41,9 @@ public class Board implements SiteReference { */ public transient Site site; + /** + * The board appears in the dropdown. + */ @DatabaseField public boolean saved = false; diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java b/Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java index 7a9b2f61..fcf57a9a 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java @@ -67,7 +67,7 @@ public class SiteManager { public void addSiteFromClass(Class siteClass, SiteAddCallback callback) { Site site = instantiateSiteClass(siteClass); - site = createNewSite(site); + createNewSite(site); List newAllSites = new ArrayList<>(Sites.allSites()); newAllSites.add(site); @@ -120,7 +120,12 @@ public class SiteManager { return sites; } - private Site createNewSite(Site site) { + /** + * Create a new site from the Site instance. This will insert the model for the site + * into the database and calls initialize on the site instance. + * @param site the site to add. + */ + private void createNewSite(Site site) { SiteConfig config = new SiteConfig(); config.classId = Sites.SITE_CLASSES.indexOfValue(site.getClass()); config.external = false; @@ -130,8 +135,6 @@ public class SiteManager { SiteModel siteModel = createNewSiteModel(site, config, userSettings); initializeSite(site, siteModel.id, config, userSettings); - - return site; } private SiteModel createNewSiteModel(Site site, SiteConfig config, SiteUserSettings userSettings) { @@ -171,6 +174,13 @@ public class SiteManager { return instantiateSiteClass(clazz); } + /** + * Create the instance of the site class. Catches any reflection exceptions as runtime + * exceptions. + * @param clazz the class to instantiate + * @return the instantiated clas + * @throws IllegalArgumentException on reflection exceptions, should never happen. + */ private Site instantiateSiteClass(Class clazz) { Site site; //noinspection TryWithIdenticalCatches @@ -184,6 +194,9 @@ public class SiteManager { return site; } + public static class SiteAlreadyAdded extends IllegalArgumentException { + } + public interface SiteAddCallback { void onSiteAdded(Site site);