From 58f47637bac3fbc0068eb1db1d07f3b3dc6d7c92 Mon Sep 17 00:00:00 2001 From: Floens Date: Sat, 20 Jan 2018 13:17:07 +0100 Subject: [PATCH] board setup: changes to how ordering is saved. we now keep the saved boards list in memory and flush all orders when the controller is closed. also fixes an issue where the order of the suggestions wasn't the same as it would get added. --- .../core/database/DatabaseBoardManager.java | 27 ++++++--- .../chan/core/manager/BoardManager.java | 19 ++---- .../org/floens/chan/core/model/orm/Board.java | 2 +- .../core/presenter/BoardSetupPresenter.java | 58 ++++++++++--------- .../floens/chan/core/site/SiteManager.java | 2 - .../ui/controller/BoardSetupController.java | 18 ++---- 6 files changed, 62 insertions(+), 64 deletions(-) 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