diff --git a/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java b/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java index e39f7393..c17178fc 100644 --- a/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java +++ b/Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java @@ -21,6 +21,7 @@ import android.net.Uri; import org.floens.chan.Chan; import org.floens.chan.core.model.Loadable; +import org.floens.chan.core.pool.LoadablePool; import java.util.List; @@ -36,7 +37,7 @@ public class ChanHelper { if (Chan.getBoardManager().getBoardExists(rawBoard)) { if (parts.size() == 1) { // Board mode - loadable = new Loadable(rawBoard); + loadable = LoadablePool.getInstance().obtain(new Loadable(rawBoard)); } else if (parts.size() >= 3) { // Thread mode int no = -1; @@ -59,7 +60,7 @@ public class ChanHelper { } if (no >= 0) { - loadable = new Loadable(rawBoard, no); + loadable = LoadablePool.getInstance().obtain(new Loadable(rawBoard, no)); if (post >= 0) { loadable.markedNo = post; } 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 a093a2cf..51735c8d 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 @@ -24,6 +24,7 @@ import org.floens.chan.Chan; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Post; +import org.floens.chan.core.pool.LoadablePool; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.helper.PostHelper; import org.floens.chan.ui.service.WatchNotifier; @@ -117,12 +118,6 @@ public class WatchManager { } } - /** - * Add a pin - * - * @param pin - * @return true if it was added, false if it wasn't (duplicated) - */ public boolean addPin(Pin pin) { // No duplicates for (Pin e : pins) { @@ -144,7 +139,7 @@ public class WatchManager { public boolean addPin(Post opPost) { Pin pin = new Pin(); - pin.loadable = new Loadable(opPost.board, opPost.no); + pin.loadable = LoadablePool.getInstance().obtain(new Loadable(opPost.board, opPost.no)); pin.loadable.title = PostHelper.getTitle(opPost, pin.loadable); pin.thumbnailUrl = opPost.thumbnailUrl; return addPin(pin); @@ -158,11 +153,6 @@ public class WatchManager { return addPin(pin); } - /** - * Remove a pin - * - * @param pin - */ public void removePin(Pin pin) { pins.remove(pin); pin.destroyWatcher(); diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java b/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java index 2d166706..a077e688 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java @@ -114,6 +114,7 @@ public class Loadable { } public void writeToParcel(Parcel parcel) { + parcel.writeInt(id); parcel.writeInt(mode); parcel.writeString(board); parcel.writeInt(no); @@ -123,6 +124,7 @@ public class Loadable { } public void readFromParcel(Parcel parcel) { + id = parcel.readInt(); mode = parcel.readInt(); board = parcel.readString(); no = parcel.readInt(); diff --git a/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java b/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java index cad25a7c..80d136d1 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java +++ b/Clover/app/src/main/java/org/floens/chan/core/model/Pin.java @@ -28,7 +28,7 @@ public class Pin { public int id; @DatabaseField(canBeNull = false, foreign = true) - public Loadable loadable = new Loadable("", -1); + public Loadable loadable; @DatabaseField public boolean watching = true; diff --git a/Clover/app/src/main/java/org/floens/chan/core/pool/LoadablePool.java b/Clover/app/src/main/java/org/floens/chan/core/pool/LoadablePool.java new file mode 100644 index 00000000..b817b037 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/pool/LoadablePool.java @@ -0,0 +1,33 @@ +package org.floens.chan.core.pool; + +import org.floens.chan.core.model.Loadable; + +import java.util.HashMap; +import java.util.Map; + +public class LoadablePool { + private static final LoadablePool instance = new LoadablePool(); + + private Map pool = new HashMap<>(); + + private LoadablePool() { + } + + public static LoadablePool getInstance() { + return instance; + } + + public Loadable obtain(Loadable searchLoadable) { + if (searchLoadable.isThreadMode()) { + Loadable poolLoadable = pool.get(searchLoadable); + if (poolLoadable == null) { + poolLoadable = searchLoadable; + pool.put(poolLoadable, poolLoadable); + } + + return poolLoadable; + } else { + return searchLoadable; + } + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/core/net/LoaderPool.java b/Clover/app/src/main/java/org/floens/chan/core/pool/LoaderPool.java similarity index 97% rename from Clover/app/src/main/java/org/floens/chan/core/net/LoaderPool.java rename to Clover/app/src/main/java/org/floens/chan/core/pool/LoaderPool.java index 336efaf9..3eb31d90 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/net/LoaderPool.java +++ b/Clover/app/src/main/java/org/floens/chan/core/pool/LoaderPool.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.floens.chan.core.net; +package org.floens.chan.core.pool; import android.util.LruCache; @@ -41,6 +41,10 @@ public class LoaderPool { private LoaderPool() { } +// public Loadable obtainLoadable() { +// +// } + public ChanLoader obtain(Loadable loadable, ChanLoader.ChanLoaderCallback listener) { ChanLoader chanLoader; if (loadable.isThreadMode()) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java index c9aee818..a14384a2 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java @@ -33,6 +33,7 @@ import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.Reply; import org.floens.chan.core.model.SavedReply; +import org.floens.chan.core.pool.LoadablePool; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.helper.ImagePickDelegate; import org.floens.chan.ui.layout.CaptchaLayout; @@ -218,7 +219,7 @@ public class ReplyPresenter implements ReplyManager.HttpCallback, callback.onPosted(); if (!loadable.isThreadMode()) { - callback.showThread(new Loadable(loadable.board, replyCall.postNo)); + callback.showThread(LoadablePool.getInstance().obtain(new Loadable(loadable.board, replyCall.postNo))); } } else { if (replyCall.errorMessage == null) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java index 6dfadd51..8a57027a 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java @@ -37,7 +37,8 @@ import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostImage; import org.floens.chan.core.model.PostLinkable; import org.floens.chan.core.model.SavedReply; -import org.floens.chan.core.net.LoaderPool; +import org.floens.chan.core.pool.LoaderPool; +import org.floens.chan.core.pool.LoadablePool; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.adapter.PostAdapter; import org.floens.chan.ui.adapter.PostsFilter; @@ -333,8 +334,8 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt */ @Override public void onPostClicked(Post post) { - if (loadable.mode == Loadable.Mode.CATALOG) { - Loadable threadLoadable = new Loadable(post.board, post.no); + if (loadable.isCatalogMode()) { + Loadable threadLoadable = LoadablePool.getInstance().obtain(new Loadable(post.board, post.no)); threadLoadable.title = PostHelper.getTitle(post, loadable); threadPresenterCallback.showThread(threadLoadable); } else { @@ -475,7 +476,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt threadPresenterCallback.openLink((String) linkable.value); } else if (linkable.type == PostLinkable.Type.THREAD) { PostLinkable.ThreadLink link = (PostLinkable.ThreadLink) linkable.value; - Loadable thread = new Loadable(link.board, link.threadId); + Loadable thread = LoadablePool.getInstance().obtain(new Loadable(link.board, link.threadId)); thread.markedNo = link.postId; threadPresenterCallback.showThread(thread); @@ -623,7 +624,6 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt // Copy the loadable when adding to history // Otherwise the database will possible use the loadable from a pin, and when clearing the history also deleting the loadable from the pin. history.loadable = loadable.copy(); - history.loadable.id = 0; history.thumbnailUrl = chanLoader.getThread().op.thumbnailUrl; databaseManager.addHistory(history); } diff --git a/Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java b/Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java index 41e71f33..1b763d8e 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java +++ b/Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java @@ -24,7 +24,7 @@ import org.floens.chan.chan.ChanLoader; import org.floens.chan.core.model.ChanThread; import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Post; -import org.floens.chan.core.net.LoaderPool; +import org.floens.chan.core.pool.LoaderPool; import org.floens.chan.utils.AndroidUtils; import org.floens.chan.utils.Logger; diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java index 27aeaeb5..7c390d78 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java @@ -41,6 +41,7 @@ import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.model.Board; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Pin; +import org.floens.chan.core.pool.LoadablePool; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.controller.BrowseController; import org.floens.chan.ui.controller.DrawerController; @@ -128,6 +129,9 @@ public class StartActivity extends AppCompatActivity implements NfcAdapter.Creat if (chanState == null) { Logger.w(TAG, "savedInstanceState was not null, but no ChanState was found!"); } else { + chanState.board = LoadablePool.getInstance().obtain(chanState.board); + chanState.thread = LoadablePool.getInstance().obtain(chanState.thread); + loadDefault = false; Board board = boardManager.getBoardByValue(chanState.board.board); browseController.loadBoard(board); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java index 14f6fcb1..47eeb2f9 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java @@ -172,7 +172,7 @@ public class PostAdapter extends RecyclerView.Adapter { synchronized (post.repliesFrom) { repliesFromSize = post.repliesFrom.size(); } - return ((long) repliesFromSize << 32) + (long) post.no; + return ((long) repliesFromSize << 32L) + (long) post.no; } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java index fe133397..60e94fb0 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java @@ -33,6 +33,7 @@ import org.floens.chan.core.manager.BoardManager; import org.floens.chan.core.model.Board; import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Pin; +import org.floens.chan.core.pool.LoadablePool; import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.adapter.PostsFilter; import org.floens.chan.ui.cell.PostCellInterface; @@ -261,7 +262,7 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte } public void loadBoard(Board board) { - Loadable loadable = new Loadable(board.value); + Loadable loadable = LoadablePool.getInstance().obtain(new Loadable(board.value)); loadable.mode = Loadable.Mode.CATALOG; loadable.title = board.key; navigationItem.title = board.key;