Make sure all loadables reference the same instance

This is to keep the listViewIndex, listViewTop and lastViewed the same
Shit solution but it works
multisite
Floens 10 years ago
parent 3ac7a1a348
commit edd60126e6
  1. 5
      Clover/app/src/main/java/org/floens/chan/chan/ChanHelper.java
  2. 14
      Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java
  3. 2
      Clover/app/src/main/java/org/floens/chan/core/model/Loadable.java
  4. 2
      Clover/app/src/main/java/org/floens/chan/core/model/Pin.java
  5. 33
      Clover/app/src/main/java/org/floens/chan/core/pool/LoadablePool.java
  6. 6
      Clover/app/src/main/java/org/floens/chan/core/pool/LoaderPool.java
  7. 3
      Clover/app/src/main/java/org/floens/chan/core/presenter/ReplyPresenter.java
  8. 10
      Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java
  9. 2
      Clover/app/src/main/java/org/floens/chan/core/watch/PinWatcher.java
  10. 4
      Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java
  11. 2
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java
  12. 3
      Clover/app/src/main/java/org/floens/chan/ui/controller/BrowseController.java

@ -21,6 +21,7 @@ import android.net.Uri;
import org.floens.chan.Chan; import org.floens.chan.Chan;
import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.pool.LoadablePool;
import java.util.List; import java.util.List;
@ -36,7 +37,7 @@ public class ChanHelper {
if (Chan.getBoardManager().getBoardExists(rawBoard)) { if (Chan.getBoardManager().getBoardExists(rawBoard)) {
if (parts.size() == 1) { if (parts.size() == 1) {
// Board mode // Board mode
loadable = new Loadable(rawBoard); loadable = LoadablePool.getInstance().obtain(new Loadable(rawBoard));
} else if (parts.size() >= 3) { } else if (parts.size() >= 3) {
// Thread mode // Thread mode
int no = -1; int no = -1;
@ -59,7 +60,7 @@ public class ChanHelper {
} }
if (no >= 0) { if (no >= 0) {
loadable = new Loadable(rawBoard, no); loadable = LoadablePool.getInstance().obtain(new Loadable(rawBoard, no));
if (post >= 0) { if (post >= 0) {
loadable.markedNo = post; loadable.markedNo = post;
} }

@ -24,6 +24,7 @@ import org.floens.chan.Chan;
import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Pin;
import org.floens.chan.core.model.Post; 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.core.settings.ChanSettings;
import org.floens.chan.ui.helper.PostHelper; import org.floens.chan.ui.helper.PostHelper;
import org.floens.chan.ui.service.WatchNotifier; 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) { public boolean addPin(Pin pin) {
// No duplicates // No duplicates
for (Pin e : pins) { for (Pin e : pins) {
@ -144,7 +139,7 @@ public class WatchManager {
public boolean addPin(Post opPost) { public boolean addPin(Post opPost) {
Pin pin = new Pin(); 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.loadable.title = PostHelper.getTitle(opPost, pin.loadable);
pin.thumbnailUrl = opPost.thumbnailUrl; pin.thumbnailUrl = opPost.thumbnailUrl;
return addPin(pin); return addPin(pin);
@ -158,11 +153,6 @@ public class WatchManager {
return addPin(pin); return addPin(pin);
} }
/**
* Remove a pin
*
* @param pin
*/
public void removePin(Pin pin) { public void removePin(Pin pin) {
pins.remove(pin); pins.remove(pin);
pin.destroyWatcher(); pin.destroyWatcher();

@ -114,6 +114,7 @@ public class Loadable {
} }
public void writeToParcel(Parcel parcel) { public void writeToParcel(Parcel parcel) {
parcel.writeInt(id);
parcel.writeInt(mode); parcel.writeInt(mode);
parcel.writeString(board); parcel.writeString(board);
parcel.writeInt(no); parcel.writeInt(no);
@ -123,6 +124,7 @@ public class Loadable {
} }
public void readFromParcel(Parcel parcel) { public void readFromParcel(Parcel parcel) {
id = parcel.readInt();
mode = parcel.readInt(); mode = parcel.readInt();
board = parcel.readString(); board = parcel.readString();
no = parcel.readInt(); no = parcel.readInt();

@ -28,7 +28,7 @@ public class Pin {
public int id; public int id;
@DatabaseField(canBeNull = false, foreign = true) @DatabaseField(canBeNull = false, foreign = true)
public Loadable loadable = new Loadable("", -1); public Loadable loadable;
@DatabaseField @DatabaseField
public boolean watching = true; public boolean watching = true;

@ -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<Loadable, Loadable> 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;
}
}
}

@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.floens.chan.core.net; package org.floens.chan.core.pool;
import android.util.LruCache; import android.util.LruCache;
@ -41,6 +41,10 @@ public class LoaderPool {
private LoaderPool() { private LoaderPool() {
} }
// public Loadable obtainLoadable() {
//
// }
public ChanLoader obtain(Loadable loadable, ChanLoader.ChanLoaderCallback listener) { public ChanLoader obtain(Loadable loadable, ChanLoader.ChanLoaderCallback listener) {
ChanLoader chanLoader; ChanLoader chanLoader;
if (loadable.isThreadMode()) { if (loadable.isThreadMode()) {

@ -33,6 +33,7 @@ import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post; import org.floens.chan.core.model.Post;
import org.floens.chan.core.model.Reply; import org.floens.chan.core.model.Reply;
import org.floens.chan.core.model.SavedReply; 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.core.settings.ChanSettings;
import org.floens.chan.ui.helper.ImagePickDelegate; import org.floens.chan.ui.helper.ImagePickDelegate;
import org.floens.chan.ui.layout.CaptchaLayout; import org.floens.chan.ui.layout.CaptchaLayout;
@ -218,7 +219,7 @@ public class ReplyPresenter implements ReplyManager.HttpCallback<ReplyHttpCall>,
callback.onPosted(); callback.onPosted();
if (!loadable.isThreadMode()) { if (!loadable.isThreadMode()) {
callback.showThread(new Loadable(loadable.board, replyCall.postNo)); callback.showThread(LoadablePool.getInstance().obtain(new Loadable(loadable.board, replyCall.postNo)));
} }
} else { } else {
if (replyCall.errorMessage == null) { if (replyCall.errorMessage == null) {

@ -37,7 +37,8 @@ import org.floens.chan.core.model.Post;
import org.floens.chan.core.model.PostImage; import org.floens.chan.core.model.PostImage;
import org.floens.chan.core.model.PostLinkable; import org.floens.chan.core.model.PostLinkable;
import org.floens.chan.core.model.SavedReply; 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.core.settings.ChanSettings;
import org.floens.chan.ui.adapter.PostAdapter; import org.floens.chan.ui.adapter.PostAdapter;
import org.floens.chan.ui.adapter.PostsFilter; import org.floens.chan.ui.adapter.PostsFilter;
@ -333,8 +334,8 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
*/ */
@Override @Override
public void onPostClicked(Post post) { public void onPostClicked(Post post) {
if (loadable.mode == Loadable.Mode.CATALOG) { if (loadable.isCatalogMode()) {
Loadable threadLoadable = new Loadable(post.board, post.no); Loadable threadLoadable = LoadablePool.getInstance().obtain(new Loadable(post.board, post.no));
threadLoadable.title = PostHelper.getTitle(post, loadable); threadLoadable.title = PostHelper.getTitle(post, loadable);
threadPresenterCallback.showThread(threadLoadable); threadPresenterCallback.showThread(threadLoadable);
} else { } else {
@ -475,7 +476,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
threadPresenterCallback.openLink((String) linkable.value); threadPresenterCallback.openLink((String) linkable.value);
} else if (linkable.type == PostLinkable.Type.THREAD) { } else if (linkable.type == PostLinkable.Type.THREAD) {
PostLinkable.ThreadLink link = (PostLinkable.ThreadLink) linkable.value; 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; thread.markedNo = link.postId;
threadPresenterCallback.showThread(thread); threadPresenterCallback.showThread(thread);
@ -623,7 +624,6 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
// Copy the loadable when adding to history // 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. // 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 = loadable.copy();
history.loadable.id = 0;
history.thumbnailUrl = chanLoader.getThread().op.thumbnailUrl; history.thumbnailUrl = chanLoader.getThread().op.thumbnailUrl;
databaseManager.addHistory(history); databaseManager.addHistory(history);
} }

@ -24,7 +24,7 @@ import org.floens.chan.chan.ChanLoader;
import org.floens.chan.core.model.ChanThread; import org.floens.chan.core.model.ChanThread;
import org.floens.chan.core.model.Pin; import org.floens.chan.core.model.Pin;
import org.floens.chan.core.model.Post; 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.AndroidUtils;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;

@ -41,6 +41,7 @@ import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.model.Board; import org.floens.chan.core.model.Board;
import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin; 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.core.settings.ChanSettings;
import org.floens.chan.ui.controller.BrowseController; import org.floens.chan.ui.controller.BrowseController;
import org.floens.chan.ui.controller.DrawerController; import org.floens.chan.ui.controller.DrawerController;
@ -128,6 +129,9 @@ public class StartActivity extends AppCompatActivity implements NfcAdapter.Creat
if (chanState == null) { if (chanState == null) {
Logger.w(TAG, "savedInstanceState was not null, but no ChanState was found!"); Logger.w(TAG, "savedInstanceState was not null, but no ChanState was found!");
} else { } else {
chanState.board = LoadablePool.getInstance().obtain(chanState.board);
chanState.thread = LoadablePool.getInstance().obtain(chanState.thread);
loadDefault = false; loadDefault = false;
Board board = boardManager.getBoardByValue(chanState.board.board); Board board = boardManager.getBoardByValue(chanState.board.board);
browseController.loadBoard(board); browseController.loadBoard(board);

@ -172,7 +172,7 @@ public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
synchronized (post.repliesFrom) { synchronized (post.repliesFrom) {
repliesFromSize = post.repliesFrom.size(); repliesFromSize = post.repliesFrom.size();
} }
return ((long) repliesFromSize << 32) + (long) post.no; return ((long) repliesFromSize << 32L) + (long) post.no;
} }
} }

@ -33,6 +33,7 @@ import org.floens.chan.core.manager.BoardManager;
import org.floens.chan.core.model.Board; import org.floens.chan.core.model.Board;
import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin; 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.core.settings.ChanSettings;
import org.floens.chan.ui.adapter.PostsFilter; import org.floens.chan.ui.adapter.PostsFilter;
import org.floens.chan.ui.cell.PostCellInterface; import org.floens.chan.ui.cell.PostCellInterface;
@ -261,7 +262,7 @@ public class BrowseController extends ThreadController implements ToolbarMenuIte
} }
public void loadBoard(Board board) { 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.mode = Loadable.Mode.CATALOG;
loadable.title = board.key; loadable.title = board.key;
navigationItem.title = board.key; navigationItem.title = board.key;

Loading…
Cancel
Save