diff --git a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSavedReplyManager.java b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSavedReplyManager.java index 53d85d28..3c531262 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSavedReplyManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/database/DatabaseSavedReplyManager.java @@ -18,8 +18,10 @@ package org.floens.chan.core.database; import com.j256.ormlite.stmt.QueryBuilder; +import com.j256.ormlite.table.TableUtils; import org.floens.chan.core.model.SavedReply; +import org.floens.chan.utils.Time; import java.util.ArrayList; import java.util.HashMap; @@ -36,7 +38,6 @@ public class DatabaseSavedReplyManager { private DatabaseManager databaseManager; private DatabaseHelper helper; - private final Object lock = new Object(); private final Map> savedRepliesByNo = new HashMap<>(); public DatabaseSavedReplyManager(DatabaseManager databaseManager, DatabaseHelper helper) { @@ -46,7 +47,7 @@ public class DatabaseSavedReplyManager { // optimized and threadsafe public boolean isSaved(String board, int no) { - synchronized (lock) { + synchronized (savedRepliesByNo) { if (savedRepliesByNo.containsKey(no)) { List items = savedRepliesByNo.get(no); for (int i = 0; i < items.size(); i++) { @@ -70,7 +71,7 @@ public class DatabaseSavedReplyManager { final List all = helper.savedDao.queryForAll(); - synchronized (lock) { + synchronized (savedRepliesByNo) { savedRepliesByNo.clear(); for (int i = 0; i < all.size(); i++) { SavedReply savedReply = all.get(i); @@ -88,12 +89,28 @@ public class DatabaseSavedReplyManager { }; } + public Callable clearSavedReplies() { + return new Callable() { + @Override + public Void call() throws Exception { + long start = Time.startTiming(); + TableUtils.clearTable(helper.getConnectionSource(), SavedReply.class); + synchronized (savedRepliesByNo) { + savedRepliesByNo.clear(); + } + Time.endTiming("Clear saved replies", start); + + return null; + } + }; + } + public Callable saveReply(final SavedReply savedReply) { return new Callable() { @Override public SavedReply call() throws Exception { helper.savedDao.create(savedReply); - synchronized (lock) { + synchronized (savedRepliesByNo) { if (savedRepliesByNo.containsKey(savedReply.no)) { savedRepliesByNo.get(savedReply.no).add(savedReply); } else { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java index 68bd0e76..7f318f14 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/HistoryController.java @@ -36,6 +36,7 @@ import org.floens.chan.R; import org.floens.chan.controller.Controller; import org.floens.chan.core.database.DatabaseHistoryManager; import org.floens.chan.core.database.DatabaseManager; +import org.floens.chan.core.database.DatabaseSavedReplyManager; import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.model.Board; import org.floens.chan.core.model.History; @@ -58,9 +59,11 @@ import static org.floens.chan.utils.AndroidUtils.dp; public class HistoryController extends Controller implements CompoundButton.OnCheckedChangeListener, ToolbarMenuItem.ToolbarMenuItemCallback, ToolbarNavigationController.ToolbarSearchCallback { private static final int SEARCH_ID = 1; private static final int CLEAR_ID = 101; + private static final int SAVED_REPLY_CLEAR_ID = 102; private DatabaseManager databaseManager; private DatabaseHistoryManager databaseHistoryManager; + private DatabaseSavedReplyManager databaseSavedReplyManager; private BoardManager boardManager; private CrossfadeView crossfade; @@ -77,14 +80,17 @@ public class HistoryController extends Controller implements CompoundButton.OnCh databaseManager = Chan.getDatabaseManager(); databaseHistoryManager = databaseManager.getDatabaseHistoryManager(); + databaseSavedReplyManager = databaseManager.getDatabaseSavedReplyManager(); boardManager = Chan.getBoardManager(); navigationItem.setTitle(R.string.history_screen); List items = new ArrayList<>(); items.add(new FloatingMenuItem(CLEAR_ID, R.string.history_clear)); + items.add(new FloatingMenuItem(SAVED_REPLY_CLEAR_ID, R.string.saved_reply_clear)); navigationItem.menu = new ToolbarMenu(context); navigationItem.menu.addItem(new ToolbarMenuItem(context, this, SEARCH_ID, R.drawable.ic_search_white_24dp)); - navigationItem.createOverflow(context, this, items); + ToolbarMenuItem overflow = navigationItem.createOverflow(context, this, items); + overflow.getSubMenu().setPopupWidth(dp(4 * 56)); SwitchCompat historyEnabledSwitch = new SwitchCompat(context); historyEnabledSwitch.setChecked(ChanSettings.historyEnabled.get()); @@ -120,18 +126,32 @@ public class HistoryController extends Controller implements CompoundButton.OnCh @Override public void onSubMenuItemClicked(ToolbarMenuItem parent, FloatingMenuItem item) { - if ((Integer) item.getId() == CLEAR_ID) { - new AlertDialog.Builder(context) - .setTitle(R.string.history_clear_confirm) - .setNegativeButton(R.string.cancel, null) - .setPositiveButton(R.string.history_clear_confirm_button, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - databaseManager.runTask(databaseHistoryManager.clearHistory()); - adapter.load(); - } - }) - .show(); + switch ((Integer) item.getId()) { + case CLEAR_ID: + new AlertDialog.Builder(context) + .setTitle(R.string.history_clear_confirm) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.history_clear_confirm_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + databaseManager.runTask(databaseHistoryManager.clearHistory()); + adapter.load(); + } + }) + .show(); + break; + case SAVED_REPLY_CLEAR_ID: + new AlertDialog.Builder(context) + .setTitle(R.string.saved_reply_clear_confirm) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.saved_reply_clear_confirm_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + databaseManager.runTask(databaseSavedReplyManager.clearSavedReplies()); + } + }) + .show(); + break; } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuItem.java b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuItem.java index a9ff615f..08d63bb8 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuItem.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/ToolbarMenuItem.java @@ -75,6 +75,10 @@ public class ToolbarMenuItem implements View.OnClickListener, FloatingMenu.Float subMenu.setCallback(this); } + public FloatingMenu getSubMenu() { + return subMenu; + } + @Override public void onClick(View v) { if (subMenu != null && !subMenu.isShowing()) { diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml index 72696c15..ff397129 100644 --- a/Clover/app/src/main/res/values/strings.xml +++ b/Clover/app/src/main/res/values/strings.xml @@ -237,6 +237,10 @@ along with this program. If not, see . Enable or disable history No history + Clear posting history + Clear posting history? + Clear + Board Catalog Bookmarked threads