rename 8chan to vichan, rework resolvables

disallows sites that were already added from being added again.
refactor-toolbar
Floens 8 years ago
parent c49d724330
commit 2ac934c7f9
  1. 10
      Clover/app/src/main/java/org/floens/chan/core/site/Resolvable.java
  2. 4
      Clover/app/src/main/java/org/floens/chan/core/site/Site.java
  3. 32
      Clover/app/src/main/java/org/floens/chan/core/site/SiteResolver.java
  4. 6
      Clover/app/src/main/java/org/floens/chan/core/site/Sites.java
  5. 30
      Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java
  6. 36
      Clover/app/src/main/java/org/floens/chan/core/site/sites/vichan/ViChan.java
  7. 4
      Clover/app/src/main/java/org/floens/chan/core/site/sites/vichan/ViChanParserHandler.java
  8. 6
      Clover/app/src/main/java/org/floens/chan/core/site/sites/vichan/ViChanReplyHttpCall.java

@ -1,14 +1,12 @@
package org.floens.chan.core.site; package org.floens.chan.core.site;
import okhttp3.HttpUrl;
public interface Resolvable { public interface Resolvable {
enum ResolveResult { boolean matchesName(String value);
NO,
NAME_MATCH,
FULL_MATCH
}
ResolveResult matchesName(String value); boolean respondsTo(HttpUrl url);
Class<? extends Site> getSiteClass(); Class<? extends Site> getSiteClass();
} }

@ -134,9 +134,9 @@ public interface Site {
SiteIcon icon(); SiteIcon icon();
boolean respondsTo(HttpUrl url); Resolvable resolvable();
Loadable resolve(HttpUrl url); Loadable resolveLoadable(HttpUrl url);
boolean feature(Feature feature); boolean feature(Feature feature);

@ -41,11 +41,24 @@ public class SiteResolver {
HttpUrl httpUrl = sanitizeUrl(url); HttpUrl httpUrl = sanitizeUrl(url);
if (httpUrl == null) { if (httpUrl == null) {
for (Site site : Sites.allSites()) {
Resolvable resolvable = site.resolvable();
if (resolvable.matchesName(url)) {
return site;
}
}
return null; return null;
} }
if (!httpUrl.scheme().equals("https")) {
httpUrl = httpUrl.newBuilder().scheme("https").build();
}
for (Site site : Sites.allSites()) { for (Site site : Sites.allSites()) {
if (site.respondsTo(httpUrl)) { Resolvable resolvable = site.resolvable();
if (resolvable.respondsTo(httpUrl)) {
return site; return site;
} }
} }
@ -60,12 +73,14 @@ public class SiteResolver {
if (httpUrl == null) { if (httpUrl == null) {
for (Resolvable resolvable : resolvables) { for (Resolvable resolvable : resolvables) {
if (resolvable.matchesName(url) == Resolvable.ResolveResult.NAME_MATCH) { if (resolvable.matchesName(url)) {
return new SiteResolverResult(SiteResolverResult.Match.BUILTIN, resolvable.getSiteClass(), null); return new SiteResolverResult(SiteResolverResult.Match.BUILTIN,
resolvable.getSiteClass(), null);
} }
} }
return new SiteResolverResult(SiteResolverResult.Match.NONE, null, null); return new SiteResolverResult(SiteResolverResult.Match.NONE,
null, null);
} }
if (!httpUrl.scheme().equals("https")) { if (!httpUrl.scheme().equals("https")) {
@ -73,8 +88,9 @@ public class SiteResolver {
} }
for (Resolvable resolvable : resolvables) { for (Resolvable resolvable : resolvables) {
if (resolvable.matchesName(httpUrl.toString()) == Resolvable.ResolveResult.FULL_MATCH) { if (resolvable.respondsTo(httpUrl)) {
return new SiteResolverResult(SiteResolverResult.Match.BUILTIN, resolvable.getSiteClass(), null); return new SiteResolverResult(SiteResolverResult.Match.BUILTIN,
resolvable.getSiteClass(), null);
} }
} }
@ -89,12 +105,14 @@ public class SiteResolver {
} }
for (Site site : Sites.allSites()) { for (Site site : Sites.allSites()) {
Loadable resolved = site.resolve(httpUrl); if (site.resolvable().respondsTo(httpUrl)) {
Loadable resolved = site.resolveLoadable(httpUrl);
if (resolved != null) { if (resolved != null) {
return new LoadableResult(resolved); return new LoadableResult(resolved);
} }
} }
}
return null; return null;
} }

@ -3,7 +3,7 @@ package org.floens.chan.core.site;
import android.util.SparseArray; import android.util.SparseArray;
import org.floens.chan.core.site.sites.chan4.Chan4; import org.floens.chan.core.site.sites.chan4.Chan4;
import org.floens.chan.core.site.sites.chan8.Chan8; import org.floens.chan.core.site.sites.vichan.ViChan;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -18,14 +18,14 @@ public class Sites {
// find the correct class to use. // find the correct class to use.
SITE_CLASSES.put(0, Chan4.class); SITE_CLASSES.put(0, Chan4.class);
SITE_CLASSES.put(1, Chan8.class); SITE_CLASSES.put(1, ViChan.class);
} }
public static final List<Resolvable> RESOLVABLES = new ArrayList<>(); public static final List<Resolvable> RESOLVABLES = new ArrayList<>();
static { static {
RESOLVABLES.add(Chan4.RESOLVABLE); RESOLVABLES.add(Chan4.RESOLVABLE);
RESOLVABLES.add(Chan8.RESOLVABLE); RESOLVABLES.add(ViChan.RESOLVABLE);
} }
private static List<Site> ALL_SITES = Collections.unmodifiableList(new ArrayList<Site>()); private static List<Site> ALL_SITES = Collections.unmodifiableList(new ArrayList<Site>());

@ -63,20 +63,20 @@ import okhttp3.Request;
public class Chan4 extends SiteBase { public class Chan4 extends SiteBase {
public static final Resolvable RESOLVABLE = new Resolvable() { public static final Resolvable RESOLVABLE = new Resolvable() {
@Override @Override
public ResolveResult matchesName(String value) { public Class<? extends Site> getSiteClass() {
switch (value) { return Chan4.class;
case "4chan":
return ResolveResult.NAME_MATCH;
case "https://4chan.org/":
return ResolveResult.FULL_MATCH;
default:
return ResolveResult.NO;
} }
@Override
public boolean matchesName(String value) {
return value.equals("4chan");
} }
@Override @Override
public Class<? extends Site> getSiteClass() { public boolean respondsTo(HttpUrl url) {
return Chan4.class; return url.host().equals("4chan.org") ||
url.host().equals("www.4chan.org") ||
url.host().equals("boards.4chan.org");
} }
}; };
@ -310,15 +310,12 @@ public class Chan4 extends SiteBase {
} }
@Override @Override
public boolean respondsTo(HttpUrl url) { public Resolvable resolvable() {
return url.host().equals("4chan.org") || return RESOLVABLE;
url.host().equals("www.4chan.org") ||
url.host().equals("boards.4chan.org");
} }
@Override @Override
public Loadable resolve(HttpUrl url) { public Loadable resolveLoadable(HttpUrl url) {
if (respondsTo(url)) {
List<String> parts = url.pathSegments(); List<String> parts = url.pathSegments();
if (!parts.isEmpty()) { if (!parts.isEmpty()) {
@ -360,7 +357,6 @@ public class Chan4 extends SiteBase {
} }
} }
} }
}
return null; return null;
} }

@ -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.site.sites.chan8; package org.floens.chan.core.site.sites.vichan;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@ -51,25 +51,23 @@ import okhttp3.Request;
import static org.floens.chan.Chan.injector; import static org.floens.chan.Chan.injector;
public class Chan8 extends SiteBase { public class ViChan extends SiteBase {
private static final String TAG = "Chan8"; private static final String TAG = "ViChan";
public static final Resolvable RESOLVABLE = new Resolvable() { public static final Resolvable RESOLVABLE = new Resolvable() {
@Override @Override
public ResolveResult matchesName(String value) { public Class<? extends Site> getSiteClass() {
switch (value) { return ViChan.class;
case "8chan":
return ResolveResult.NAME_MATCH;
case "https://8ch.net/":
return ResolveResult.FULL_MATCH;
default:
return ResolveResult.NO;
} }
@Override
public boolean matchesName(String value) {
return value.equals("8chan") || value.equals("8ch");
} }
@Override @Override
public Class<? extends Site> getSiteClass() { public boolean respondsTo(HttpUrl url) {
return Chan8.class; return url.host().equals("8ch.net");
} }
}; };
@ -187,13 +185,12 @@ public class Chan8 extends SiteBase {
} }
@Override @Override
public boolean respondsTo(HttpUrl url) { public Resolvable resolvable() {
return url.host().equals("8ch.net"); return RESOLVABLE;
} }
@Override @Override
public Loadable resolve(HttpUrl url) { public Loadable resolveLoadable(HttpUrl url) {
if (respondsTo(url)) {
List<String> parts = url.pathSegments(); List<String> parts = url.pathSegments();
if (!parts.isEmpty()) { if (!parts.isEmpty()) {
@ -232,7 +229,6 @@ public class Chan8 extends SiteBase {
} }
} }
} }
}
return null; return null;
} }
@ -278,7 +274,7 @@ public class Chan8 extends SiteBase {
@Override @Override
public ChanReader chanReader() { public ChanReader chanReader() {
FutabaChanParser parser = new FutabaChanParser(new Chan8ParserHandler()); FutabaChanParser parser = new FutabaChanParser(new ViChanParserHandler());
return new FutabaChanReader(parser); return new FutabaChanReader(parser);
} }
@ -286,7 +282,7 @@ public class Chan8 extends SiteBase {
public void post(Reply reply, final PostListener postListener) { public void post(Reply reply, final PostListener postListener) {
// TODO // TODO
HttpCallManager httpCallManager = injector().instance(HttpCallManager.class); HttpCallManager httpCallManager = injector().instance(HttpCallManager.class);
httpCallManager.makeHttpCall(new Chan8ReplyHttpCall(this, reply), httpCallManager.makeHttpCall(new ViChanReplyHttpCall(this, reply),
new HttpCall.HttpCallback<CommonReplyHttpCall>() { new HttpCall.HttpCallback<CommonReplyHttpCall>() {
@Override @Override
public void onHttpSuccess(CommonReplyHttpCall httpPost) { public void onHttpSuccess(CommonReplyHttpCall httpPost) {

@ -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.site.sites.chan8; package org.floens.chan.core.site.sites.vichan;
import android.text.SpannableString; import android.text.SpannableString;
@ -30,7 +30,7 @@ import org.jsoup.nodes.Element;
import java.util.Set; import java.util.Set;
public class Chan8ParserHandler extends DefaultFutabaChanParserHandler { public class ViChanParserHandler extends DefaultFutabaChanParserHandler {
@Override @Override
public CharSequence handleParagraph(FutabaChanParser parser, Theme theme, Post.Builder post, CharSequence text, Element element) { public CharSequence handleParagraph(FutabaChanParser parser, Theme theme, Post.Builder post, CharSequence text, Element element) {
if (element.hasClass("quote")) { if (element.hasClass("quote")) {

@ -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.site.sites.chan8; package org.floens.chan.core.site.sites.vichan;
import android.text.TextUtils; import android.text.TextUtils;
@ -36,12 +36,12 @@ import okhttp3.MultipartBody;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
public class Chan8ReplyHttpCall extends CommonReplyHttpCall { public class ViChanReplyHttpCall extends CommonReplyHttpCall {
private static final Pattern REQUIRE_AUTHENTICATION = Pattern.compile(".*\"captcha\": ?true.*"); private static final Pattern REQUIRE_AUTHENTICATION = Pattern.compile(".*\"captcha\": ?true.*");
private static final Pattern ERROR_MESSAGE = private static final Pattern ERROR_MESSAGE =
Pattern.compile(".*<h1>Error</h1>.*<h2[^>]*>(.*?)<\\/h2>.*"); Pattern.compile(".*<h1>Error</h1>.*<h2[^>]*>(.*?)<\\/h2>.*");
public Chan8ReplyHttpCall(Site site, Reply reply) { public ViChanReplyHttpCall(Site site, Reply reply) {
super(site, reply); super(site, reply);
} }
Loading…
Cancel
Save