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.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;
}

@ -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();

@ -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();

@ -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;

@ -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
* 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;
@ -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()) {

@ -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<ReplyHttpCall>,
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) {

@ -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);
}

@ -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;

@ -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);

@ -172,7 +172,7 @@ public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
synchronized (post.repliesFrom) {
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.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;

Loading…
Cancel
Save