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 7957ffe2..596607c4 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,6 +1,9 @@ package org.floens.chan.core.database; +import com.j256.ormlite.stmt.PreparedUpdate; import com.j256.ormlite.stmt.QueryBuilder; +import com.j256.ormlite.stmt.SelectArg; +import com.j256.ormlite.stmt.UpdateBuilder; import org.floens.chan.core.model.orm.Board; import org.floens.chan.core.site.Site; @@ -26,9 +29,9 @@ public class DatabaseBoardManager { .and().eq("value", board.code); Board existing = q.queryForFirst(); if (existing != null) { - existing.update(board); + existing.updateExcudingUserFields(board); helper.boardsDao.update(existing); - board.update(existing); + board.updateExcudingUserFields(existing); } else { helper.boardsDao.create(board); } @@ -45,12 +48,22 @@ public class DatabaseBoardManager { }; } - public Callable updateOrders(final List boards, final int fromOrder) { + public Callable updateOrders(final List boards) { return () -> { + SelectArg id = new SelectArg(); + SelectArg order = new SelectArg(); + + UpdateBuilder updateBuilder = helper.boardsDao.updateBuilder(); + updateBuilder.where().eq("id", id); + updateBuilder.updateColumnValue("order", order); + PreparedUpdate statement = updateBuilder.prepare(); + for (int i = 0; i < boards.size(); i++) { Board board = boards.get(i); - board.order = fromOrder + i; - helper.boardsDao.update(board); + + id.setValue(board.id); + order.setValue(i); + helper.boardsDao.update(statement); } return null; @@ -66,9 +79,9 @@ public class DatabaseBoardManager { .and().eq("value", board.code); Board existing = q.queryForFirst(); if (existing != null) { - existing.update(board); + existing.updateExcudingUserFields(board); helper.boardsDao.update(existing); - board.update(existing); + board.updateExcudingUserFields(existing); } else { helper.boardsDao.create(board); } 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 60e0e5fd..49681fed 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 @@ -60,7 +60,7 @@ public class BoardManager { public BoardManager(DatabaseManager databaseManager) { this.databaseManager = databaseManager; - updateSavedBoards(); + updateSavedBoardsAndNotify(); } public void createAll(List boards) { @@ -105,26 +105,19 @@ public class BoardManager { setSaved(board, false); } - public void updateBoardOrder(Board board, int order) { - board.order = order; + public void updateBoardOrders(List boards) { databaseManager.runTask(databaseManager.getDatabaseBoardManager() - .updateIncludingUserFields(board)); - updateSavedBoards(); - } - - public void updateBoardOrders(List boards, int fromOrder) { - databaseManager.runTask(databaseManager.getDatabaseBoardManager() - .updateOrders(boards, fromOrder)); - updateSavedBoards(); + .updateOrders(boards)); + updateSavedBoardsAndNotify(); } private void setSaved(Board board, boolean saved) { board.saved = saved; databaseManager.runTask(databaseManager.getDatabaseBoardManager().updateIncludingUserFields(board)); - updateSavedBoards(); + updateSavedBoardsAndNotify(); } - private void updateSavedBoards() { + private void updateSavedBoardsAndNotify() { sitesWithSavedBoards.clear(); for (Site site : Sites.allSites()) { List siteBoards = getSiteSavedBoards(site); 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 d648fca6..b05bbfc5 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 @@ -173,7 +173,7 @@ public class Board implements SiteReference { * * @param o other board to update from. */ - public void update(Board o) { + public void updateExcudingUserFields(Board o) { siteId = o.siteId; site = o.site; name = o.name; diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/BoardSetupPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/BoardSetupPresenter.java index d7487c2f..23176f3c 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/BoardSetupPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/BoardSetupPresenter.java @@ -25,9 +25,10 @@ import org.floens.chan.ui.helper.BoardHelper; import org.floens.chan.utils.BackgroundUtils; import java.util.ArrayList; -import java.util.HashSet; +import java.util.HashMap; +import java.util.LinkedList; import java.util.List; -import java.util.Set; +import java.util.Map; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -47,7 +48,7 @@ public class BoardSetupPresenter { private BackgroundUtils.Cancelable suggestionCall; private List suggestions = new ArrayList<>(); - private Set selectedSuggestions = new HashSet<>(); + private List selectedSuggestions = new LinkedList<>(); @Inject public BoardSetupPresenter(BoardManager boardManager) { @@ -58,10 +59,14 @@ public class BoardSetupPresenter { this.callback = callback; this.site = site; - updateSavedBoards(); + savedBoards = boardManager.getSiteSavedBoards(site); callback.setSavedBoards(savedBoards); } + public void destroy() { + boardManager.updateBoardOrders(savedBoards); + } + public void addClicked() { callback.showAddDialog(); } @@ -103,10 +108,16 @@ public class BoardSetupPresenter { int count = 0; if (site.boardsType() == Site.BoardsType.DYNAMIC) { - for (Board board : boardManager.getSiteBoards(site)) { - if (selectedSuggestions.contains(board.code)) { + List siteBoards = boardManager.getSiteBoards(site); + Map siteBoardsByCode = new HashMap<>(); + for (Board siteBoard : siteBoards) { + siteBoardsByCode.put(siteBoard.code, siteBoard); + } + for (String selectedSuggestion : selectedSuggestions) { + Board board = siteBoardsByCode.get(selectedSuggestion); + if (board != null) { boardManager.saveBoard(board); - boardManager.updateBoardOrder(board, savedBoards.size()); + savedBoards.add(board); count++; } } @@ -114,12 +125,12 @@ public class BoardSetupPresenter { for (String suggestion : selectedSuggestions) { Board board = site.createBoard(suggestion, suggestion); boardManager.saveBoard(board); - boardManager.updateBoardOrder(board, savedBoards.size()); + savedBoards.add(board); count++; } } - updateSavedBoards(); + setOrder(); callback.setSavedBoards(savedBoards); callback.boardsWereAdded(count); } @@ -127,13 +138,7 @@ public class BoardSetupPresenter { public void move(int from, int to) { Board item = savedBoards.remove(from); savedBoards.add(to, item); - - int min = Math.min(from, to); - int max = Math.max(from, to); - - for (int i = min; i <= max; i++) { - boardManager.updateBoardOrder(savedBoards.get(i), i); - } + setOrder(); callback.setSavedBoards(savedBoards); } @@ -142,10 +147,7 @@ public class BoardSetupPresenter { Board board = savedBoards.remove(position); boardManager.unsaveBoard(board); - boardManager.updateBoardOrders( - savedBoards.subList(position, savedBoards.size()), position); - - updateSavedBoards(); + setOrder(); callback.setSavedBoards(savedBoards); callback.showRemovedSnackbar(board); @@ -153,9 +155,8 @@ public class BoardSetupPresenter { public void undoRemoveBoard(Board board) { boardManager.saveBoard(board); - // TODO - boardManager.updateBoardOrder(board, savedBoards.size()); - updateSavedBoards(); + savedBoards.add(board.order, board); + setOrder(); callback.setSavedBoards(savedBoards); } @@ -210,10 +211,6 @@ public class BoardSetupPresenter { }); } - private void updateSavedBoards() { - savedBoards = new ArrayList<>(boardManager.getSiteSavedBoards(site)); - } - private void updateSuggestions(List suggestions) { this.suggestions = suggestions; for (BoardSuggestion suggestion : this.suggestions) { @@ -221,6 +218,13 @@ public class BoardSetupPresenter { } } + private void setOrder() { + for (int i = 0; i < savedBoards.size(); i++) { + Board b = savedBoards.get(i); + b.order = i; + } + } + public interface Callback { void showAddDialog(); 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 a0f70bc7..e85c508a 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 @@ -135,8 +135,6 @@ public class SiteManager { config.external = false; siteRepository.create(config, settings); - - loadSites(); } private Site fromModel(SiteModel siteModel) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardSetupController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardSetupController.java index 048e3887..640e557a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardSetupController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/BoardSetupController.java @@ -20,7 +20,6 @@ package org.floens.chan.ui.controller; import android.annotation.SuppressLint; import android.content.Context; -import android.content.DialogInterface; import android.graphics.drawable.Drawable; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; @@ -130,6 +129,7 @@ public class BoardSetupController extends Controller implements View.OnClickList @Override public void onDestroy() { super.onDestroy(); + presenter.destroy(); } public void setSite(Site site) { @@ -154,12 +154,7 @@ public class BoardSetupController extends Controller implements View.OnClickList AlertDialog dialog = new AlertDialog.Builder(context) .setView(boardAddLayout) // .setTitle(R.string.setup_board_add) - .setPositiveButton(R.string.add, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - boardAddLayout.onPositiveClicked(); - } - }) + .setPositiveButton(R.string.add, (dialog1, which) -> boardAddLayout.onPositiveClicked()) .setNegativeButton(R.string.cancel, null) .create(); @@ -183,12 +178,7 @@ public class BoardSetupController extends Controller implements View.OnClickList Snackbar.LENGTH_LONG); fixSnackbarText(context, snackbar); - snackbar.setAction(R.string.undo, new View.OnClickListener() { - @Override - public void onClick(View v) { - presenter.undoRemoveBoard(board); - } - }); + snackbar.setAction(R.string.undo, v -> presenter.undoRemoveBoard(board)); snackbar.show(); } @@ -232,7 +222,7 @@ public class BoardSetupController extends Controller implements View.OnClickList public void onBindViewHolder(SavedBoardCell holder, int position) { Board savedBoard = savedBoards.get(position); holder.text.setText(BoardHelper.getName(savedBoard)); - holder.description.setText(BoardHelper.getDescription(savedBoard)); + holder.description.setText(savedBoard.order + " - " + BoardHelper.getDescription(savedBoard)); } @Override