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 23176f3c..2f4e8d7b 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 @@ -107,7 +107,7 @@ public class BoardSetupPresenter { public void onAddDialogPositiveClicked() { int count = 0; - if (site.boardsType() == Site.BoardsType.DYNAMIC) { + if (site.boardsType().canList) { List siteBoards = boardManager.getSiteBoards(site); Map siteBoardsByCode = new HashMap<>(); for (Board siteBoard : siteBoards) { @@ -169,7 +169,7 @@ public class BoardSetupPresenter { userQuery.replace("/", "").replace("\\", ""); suggestionCall = BackgroundUtils.runWithExecutor(executor, () -> { List suggestions = new ArrayList<>(); - if (site.boardsType() == Site.BoardsType.DYNAMIC) { + if (site.boardsType().canList) { List siteBoards = boardManager.getSiteBoards(site); List allUnsavedBoards = new ArrayList<>(); for (Board siteBoard : siteBoards) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/Site.java b/Clover/app/src/main/java/org/floens/chan/core/site/Site.java index a262bf36..edd56f45 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/Site.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/Site.java @@ -88,17 +88,28 @@ public interface Site { /** * The site's boards are static, there is no extra info for a board in the api. */ - STATIC, + STATIC(true), /** * The site's boards are dynamic, a boards.json like endpoint is available to get the available boards. */ - DYNAMIC, + DYNAMIC(true), /** * The site's boards are dynamic and infinite, existence of boards should be checked per board. */ - INFINITE + INFINITE(false); + + /** + * Can the boards be listed, in other words, can + * {@link SiteActions#boards(SiteActions.BoardsListener)} be used, and is + * {@link #board(String)} available. + */ + public boolean canList; + + BoardsType(boolean canList) { + this.canList = canList; + } } /** @@ -147,7 +158,7 @@ public interface Site { /** * Return the board for this site with the given {@code code}. *

This does not need to create the board if it doesn't exist. This is important for - * sites that have a board type different to DYNAMIC. Returning from the database is + * sites that have the board type INFINITE. Returning from the database is * enough.

* * @param code the board code @@ -157,7 +168,7 @@ public interface Site { /** * Create a new board with the specified {@code code} and {@code name}. - *

This is only applicable to sites with a board type other than DYNAMIC.

+ *

This is only applicable to sites with a board type INFINITE.

* * @param name the name of the board. * @param code the code to create the board with. diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/SiteBase.java b/Clover/app/src/main/java/org/floens/chan/core/site/SiteBase.java index c5b5e712..7c4be085 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/SiteBase.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/SiteBase.java @@ -71,7 +71,7 @@ public abstract class SiteBase implements Site { initializeSettings(); - if (boardsType() == BoardsType.DYNAMIC) { + if (boardsType().canList) { actions().boards(boards -> boardManager.createAll(boards.boards)); } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/SiteRegistry.java b/Clover/app/src/main/java/org/floens/chan/core/site/SiteRegistry.java index 93caa5d3..4232e4ea 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/SiteRegistry.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/SiteRegistry.java @@ -21,7 +21,7 @@ import android.util.SparseArray; import org.floens.chan.core.site.sites.chan4.Chan4; import org.floens.chan.core.site.sites.lainchan.Lainchan; -import org.floens.chan.core.site.sites.vichan.ViChan; +import org.floens.chan.core.site.sites.chan8.Chan8; import java.util.ArrayList; import java.util.List; @@ -35,7 +35,7 @@ public class SiteRegistry { static { URL_HANDLERS.add(Chan4.URL_HANDLER); - URL_HANDLERS.add(ViChan.URL_HANDLER); + URL_HANDLERS.add(Chan8.URL_HANDLER); URL_HANDLERS.add(Lainchan.URL_HANDLER); } @@ -45,7 +45,7 @@ public class SiteRegistry { // find the correct class to use. SITE_CLASSES.put(0, Chan4.class); - SITE_CLASSES.put(1, ViChan.class); + SITE_CLASSES.put(1, Chan8.class); SITE_CLASSES.put(2, Lainchan.class); } } diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/common/CommonSite.java b/Clover/app/src/main/java/org/floens/chan/core/site/common/CommonSite.java index 6368ce41..44966bf5 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/common/CommonSite.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/common/CommonSite.java @@ -28,6 +28,7 @@ import org.floens.chan.core.model.json.site.SiteConfig; import org.floens.chan.core.model.orm.Board; import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.settings.json.JsonSettings; +import org.floens.chan.core.site.Boards; import org.floens.chan.core.site.Site; import org.floens.chan.core.site.SiteActions; import org.floens.chan.core.site.SiteAuthentication; @@ -47,6 +48,9 @@ import org.floens.chan.core.site.parser.PostParser; import java.io.IOException; import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.Random; import java.util.regex.Matcher; @@ -73,6 +77,8 @@ public abstract class CommonSite extends SiteBase { private PostParser postParser; + private List staticBoards = new ArrayList<>(); + @Override public void initialize(int id, SiteConfig config, JsonSettings userSettings) { super.initialize(id, config, userSettings); @@ -135,6 +141,11 @@ public abstract class CommonSite extends SiteBase { this.boardsType = boardsType; } + public void setBoards(Board... boards) { + boardsType = BoardsType.STATIC; + staticBoards.addAll(Arrays.asList(boards)); + } + public void setConfig(CommonConfig config) { this.config = config; } @@ -303,7 +314,13 @@ public abstract class CommonSite extends SiteBase { } } - public abstract class CommonEndpoints implements SiteEndpoints { + public static abstract class CommonEndpoints implements SiteEndpoints { + private CommonSite commonSite; + + public CommonEndpoints(CommonSite commonSite) { + this.commonSite = commonSite; + } + @NonNull public SimpleHttpUrl from(String url) { return new SimpleHttpUrl(url); @@ -360,7 +377,7 @@ public abstract class CommonSite extends SiteBase { } } - public class SimpleHttpUrl { + public static class SimpleHttpUrl { @NonNull public HttpUrl.Builder url; @@ -399,6 +416,9 @@ public abstract class CommonSite extends SiteBase { @Override public void boards(BoardsListener boardsListener) { + if (!staticBoards.isEmpty()) { + boardsListener.onBoardsReceived(new Boards(staticBoards)); + } } @Override diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/common/vichan/VichanEndpoints.java b/Clover/app/src/main/java/org/floens/chan/core/site/common/vichan/VichanEndpoints.java new file mode 100644 index 00000000..d81ee0b7 --- /dev/null +++ b/Clover/app/src/main/java/org/floens/chan/core/site/common/vichan/VichanEndpoints.java @@ -0,0 +1,75 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.floens.chan.core.site.common.vichan; + +import org.floens.chan.core.model.Post; +import org.floens.chan.core.model.orm.Board; +import org.floens.chan.core.model.orm.Loadable; +import org.floens.chan.core.site.common.CommonSite; + +import java.util.Locale; +import java.util.Map; + +import okhttp3.HttpUrl; + +public class VichanEndpoints extends CommonSite.CommonEndpoints { + protected final CommonSite.SimpleHttpUrl root; + protected final CommonSite.SimpleHttpUrl sys; + + public VichanEndpoints(CommonSite commonSite, String rootUrl, String sysUrl) { + super(commonSite); + root = new CommonSite.SimpleHttpUrl(rootUrl); + sys = new CommonSite.SimpleHttpUrl(sysUrl); + } + + @Override + public HttpUrl catalog(Board board) { + return root.builder().s(board.code).s("catalog.json").url(); + } + + @Override + public HttpUrl thread(Board board, Loadable loadable) { + return root.builder().s(board.code).s("res").s(loadable.no + ".json").url(); + } + + @Override + public HttpUrl thumbnailUrl(Post.Builder post, boolean spoiler, Map arg) { + return root.builder().s(post.board.code).s("thumb").s(arg.get("tim") + ".png").url(); + } + + @Override + public HttpUrl imageUrl(Post.Builder post, Map arg) { + return root.builder().s(post.board.code).s("src").s(arg.get("tim") + "." + arg.get("ext")).url(); + } + + @Override + public HttpUrl icon(Post.Builder post, String icon, Map arg) { + CommonSite.SimpleHttpUrl stat = root.builder().s("static"); + + if (icon.equals("country")) { + stat.s("flags").s(arg.get("country_code").toLowerCase(Locale.ENGLISH) + ".png"); + } + + return stat.url(); + } + + @Override + public HttpUrl reply(Loadable loadable) { + return sys.builder().s("post.php").url(); + } +} diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan8/Chan8.java b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan8/Chan8.java index 31032381..af72393e 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan8/Chan8.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan8/Chan8.java @@ -1,9 +1,8 @@ -package org.floens.chan.core.site.sites.vichan; +package org.floens.chan.core.site.sites.chan8; import android.support.annotation.Nullable; import org.floens.chan.core.model.Post; -import org.floens.chan.core.model.orm.Board; import org.floens.chan.core.model.orm.Loadable; import org.floens.chan.core.site.Site; import org.floens.chan.core.site.SiteAuthentication; @@ -11,13 +10,13 @@ import org.floens.chan.core.site.SiteIcon; import org.floens.chan.core.site.common.CommonSite; import org.floens.chan.core.site.common.MultipartHttpCall; import org.floens.chan.core.site.common.vichan.VichanApi; +import org.floens.chan.core.site.common.vichan.VichanEndpoints; import org.floens.chan.core.site.http.Reply; import org.floens.chan.core.site.http.ReplyResponse; import org.floens.chan.core.site.parser.CommentParser; import org.floens.chan.core.site.parser.StyleRule; import org.jsoup.Jsoup; -import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -27,11 +26,11 @@ import okhttp3.Response; import static android.text.TextUtils.isEmpty; -public class ViChan extends CommonSite { +public class Chan8 extends CommonSite { public static final CommonSiteUrlHandler URL_HANDLER = new CommonSiteUrlHandler() { @Override public Class getSiteClass() { - return ViChan.class; + return Chan8.class; } @Override @@ -62,7 +61,7 @@ public class ViChan extends CommonSite { @Override public void setup() { setName("8chan"); - setIcon(SiteIcon.fromAssets("icons/8chan.png")); + setIcon(SiteIcon.fromFavicon(HttpUrl.parse("https://8ch.net/favicon.ico"))); setBoardsType(BoardsType.INFINITE); setResolvable(URL_HANDLER); @@ -74,20 +73,9 @@ public class ViChan extends CommonSite { } }); - setEndpoints(new CommonEndpoints() { - private final SimpleHttpUrl root = from("https://8ch.net"); - private final SimpleHttpUrl sys = from("https://sys.8ch.net"); - - @Override - public HttpUrl catalog(Board board) { - return root.builder().s(board.code).s("catalog.json").url(); - } - - @Override - public HttpUrl thread(Board board, Loadable loadable) { - return root.builder().s(board.code).s("res").s(loadable.no + ".json").url(); - } - + setEndpoints(new VichanEndpoints(this, + "https://8ch.net", + "https://sys.8ch.net") { @Override public HttpUrl imageUrl(Post.Builder post, Map arg) { return root.builder().s("file_store").s(arg.get("tim") + "." + arg.get("ext")).url(); @@ -110,22 +98,6 @@ public class ViChan extends CommonSite { return root.builder().s("file_store").s("thumb").s(arg.get("tim") + "." + ext).url(); } - - @Override - public HttpUrl icon(Post.Builder post, String icon, Map arg) { - SimpleHttpUrl stat = root.builder().s("static"); - - if (icon.equals("country")) { - stat.s("flags").s(arg.get("country_code").toLowerCase(Locale.ENGLISH) + ".png"); - } - - return stat.url(); - } - - @Override - public HttpUrl reply(Loadable loadable) { - return sys.builder().s("post.php").url(); - } }); setActions(new CommonActions() { diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/sites/lainchan/Lainchan.java b/Clover/app/src/main/java/org/floens/chan/core/site/sites/lainchan/Lainchan.java index dd283bb9..9100ec3d 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/sites/lainchan/Lainchan.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/sites/lainchan/Lainchan.java @@ -1,3 +1,20 @@ +/* + * Clover - 4chan browser https://github.com/Floens/Clover/ + * Copyright (C) 2014 Floens + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.floens.chan.core.site.sites.lainchan; import android.support.annotation.Nullable; @@ -12,13 +29,13 @@ import org.floens.chan.core.site.common.CommonSite; import org.floens.chan.core.site.common.MultipartHttpCall; import org.floens.chan.core.site.common.vichan.VichanAntispam; import org.floens.chan.core.site.common.vichan.VichanApi; +import org.floens.chan.core.site.common.vichan.VichanEndpoints; import org.floens.chan.core.site.http.Reply; import org.floens.chan.core.site.http.ReplyResponse; import org.floens.chan.core.site.parser.CommentParser; import org.floens.chan.core.site.parser.StyleRule; import org.jsoup.Jsoup; -import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -64,7 +81,23 @@ public class Lainchan extends CommonSite { public void setup() { setName("Lainchan"); setIcon(SiteIcon.fromFavicon(HttpUrl.parse("https://lainchan.org/favicon.ico"))); - setBoardsType(BoardsType.INFINITE); + + setBoards( + Board.fromSiteNameCode(this, "Programming", "λ"), + Board.fromSiteNameCode(this, "Do It Yourself", "Δ"), + Board.fromSiteNameCode(this, "Security", "sec"), + Board.fromSiteNameCode(this, "Technology", "Ω"), + Board.fromSiteNameCode(this, "Games and Interactive Media", "inter"), + Board.fromSiteNameCode(this, "Literature", "lit"), + Board.fromSiteNameCode(this, "Musical and Audible Media", "music"), + Board.fromSiteNameCode(this, "Visual Media", "vis"), + Board.fromSiteNameCode(this, "Humanity", "hum"), + Board.fromSiteNameCode(this, "Drugs 3.0", "drug"), + Board.fromSiteNameCode(this, "Consciousness and Dreams", "zzz"), + Board.fromSiteNameCode(this, "layer", "layer"), + Board.fromSiteNameCode(this, "Questions and Complaints", "q"), + Board.fromSiteNameCode(this, "Random", "r") + ); setResolvable(URL_HANDLER); @@ -75,46 +108,9 @@ public class Lainchan extends CommonSite { } }); - setEndpoints(new CommonEndpoints() { - private final SimpleHttpUrl root = from("https://lainchan.org"); - private final SimpleHttpUrl sys = from("https://lainchan.org"); - - @Override - public HttpUrl catalog(Board board) { - return root.builder().s(board.code).s("catalog.json").url(); - } - - @Override - public HttpUrl thread(Board board, Loadable loadable) { - return root.builder().s(board.code).s("res").s(loadable.no + ".json").url(); - } - - @Override - public HttpUrl thumbnailUrl(Post.Builder post, boolean spoiler, Map arg) { - return root.builder().s(post.board.code).s("thumb").s(arg.get("tim") + ".png").url(); - } - - @Override - public HttpUrl imageUrl(Post.Builder post, Map arg) { - return root.builder().s(post.board.code).s("src").s(arg.get("tim") + "." + arg.get("ext")).url(); - } - - @Override - public HttpUrl icon(Post.Builder post, String icon, Map arg) { - SimpleHttpUrl stat = root.builder().s("static"); - - if (icon.equals("country")) { - stat.s("flags").s(arg.get("country_code").toLowerCase(Locale.ENGLISH) + ".png"); - } - - return stat.url(); - } - - @Override - public HttpUrl reply(Loadable loadable) { - return sys.builder().s("post.php").url(); - } - }); + setEndpoints(new VichanEndpoints(this, + "https://lainchan.org", + "https://lainchan.org")); setActions(new CommonActions() { @Override