From a15e70630e9730cf65b3836f8838a1ec2db3b567 Mon Sep 17 00:00:00 2001 From: Floens Date: Sat, 30 Dec 2017 17:47:56 +0100 Subject: [PATCH] implement site add error messages set applicationcontext to androidutils, not the other way around. --- .../src/main/java/org/floens/chan/Chan.java | 2 +- .../core/presenter/SitesSetupPresenter.java | 18 +++++++++++---- .../java/org/floens/chan/core/site/Site.java | 4 +++- .../floens/chan/core/site/SiteManager.java | 8 ++++++- .../floens/chan/core/site/SiteResolver.java | 18 ++++++++++++++- .../chan/core/site/sites/chan4/Chan4.java | 9 +++++--- .../chan/core/site/sites/chan8/Chan8.java | 9 +++++--- .../ui/controller/SitesSetupController.java | 18 ++++++--------- .../floens/chan/ui/layout/SiteAddLayout.java | 22 ++++++++++++++++++- .../org/floens/chan/utils/AndroidUtils.java | 20 +++++++++++------ .../src/main/res/layout/layout_site_add.xml | 1 + 11 files changed, 96 insertions(+), 33 deletions(-) diff --git a/Clover/app/src/main/java/org/floens/chan/Chan.java b/Clover/app/src/main/java/org/floens/chan/Chan.java index 4cc209f9..d6fc8342 100644 --- a/Clover/app/src/main/java/org/floens/chan/Chan.java +++ b/Clover/app/src/main/java/org/floens/chan/Chan.java @@ -82,7 +82,7 @@ public class Chan extends Application implements UserAgentProvider, Application. registerActivityLifecycleCallbacks(this); - AndroidUtils.init(); + AndroidUtils.init(this); userAgent = createUserAgent(); diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/SitesSetupPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/SitesSetupPresenter.java index c9c1782b..c229db81 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/SitesSetupPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/SitesSetupPresenter.java @@ -33,6 +33,7 @@ public class SitesSetupPresenter { private BoardManager boardManager; private Callback callback; + private AddCallback addCallback; private List sites = new ArrayList<>(); @@ -52,6 +53,14 @@ public class SitesSetupPresenter { this.callback.setNextAllowed(!sites.isEmpty(), false); } + public void bindAddDialog(AddCallback addCallback) { + this.addCallback = addCallback; + } + + public void unbindAddDialog() { + this.addCallback = null; + } + public boolean mayExit() { return sites.size() > 0; } @@ -69,13 +78,12 @@ public class SitesSetupPresenter { @Override public void onSiteAddFailed(String message) { - // TODO + addCallback.showAddError(message); } }); } public void onDoneClicked() { - callback.dismiss(); } public int getSiteBoardCount(Site site) { @@ -98,12 +106,14 @@ public class SitesSetupPresenter { public interface Callback { void showAddDialog(); - void dismiss(); - void setAddedSites(List sites); void setNextAllowed(boolean nextAllowed, boolean animate); void openSiteConfiguration(Site site); } + + public interface AddCallback { + void showAddError(String error); + } } 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 96b6a31c..f2dc304e 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 @@ -131,7 +131,9 @@ public interface Site { SiteIcon icon(); - Loadable respondsTo(HttpUrl url); + boolean respondsTo(HttpUrl url); + + Loadable resolve(HttpUrl url); boolean feature(Feature feature); diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java b/Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java index 959aa59d..90dbba9b 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java @@ -47,13 +47,19 @@ public class SiteManager { } public void addSite(String url, SiteAddCallback callback) { + Site existing = resolver.findSiteForUrl(url); + if (existing != null) { + callback.onSiteAddFailed("site already added"); + return; + } + SiteResolver.SiteResolverResult resolve = resolver.resolveSiteForUrl(url); Class siteClass; if (resolve.match == SiteResolver.SiteResolverResult.Match.BUILTIN) { siteClass = resolve.builtinResult; } else if (resolve.match == SiteResolver.SiteResolverResult.Match.EXTERNAL) { - callback.onSiteAddFailed("external todo"); + callback.onSiteAddFailed("external sites not hardcoded is not implemented yet"); return; } else { callback.onSiteAddFailed("not a url"); diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/SiteResolver.java b/Clover/app/src/main/java/org/floens/chan/core/site/SiteResolver.java index f0ad4ed7..65f0c3dc 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/SiteResolver.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/SiteResolver.java @@ -37,6 +37,22 @@ public class SiteResolver { this.loadableProvider = loadableProvider; } + Site findSiteForUrl(String url) { + HttpUrl httpUrl = sanitizeUrl(url); + + if (httpUrl == null) { + return null; + } + + for (Site site : Sites.allSites()) { + if (site.respondsTo(httpUrl)) { + return site; + } + } + + return null; + } + SiteResolverResult resolveSiteForUrl(String url) { List resolvables = Sites.RESOLVABLES; @@ -73,7 +89,7 @@ public class SiteResolver { } for (Site site : Sites.allSites()) { - Loadable resolved = site.respondsTo(httpUrl); + Loadable resolved = site.resolve(httpUrl); if (resolved != null) { return new LoadableResult(resolved); diff --git a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java index e2af5592..1cae5166 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java +++ b/Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java @@ -272,12 +272,15 @@ public class Chan4 extends SiteBase { } @Override - public Loadable respondsTo(HttpUrl url) { - boolean responds = url.host().equals("4chan.org") || + public boolean respondsTo(HttpUrl url) { + return url.host().equals("4chan.org") || url.host().equals("www.4chan.org") || url.host().equals("boards.4chan.org"); + } - if (responds) { + @Override + public Loadable resolve(HttpUrl url) { + if (respondsTo(url)) { List parts = url.pathSegments(); if (!parts.isEmpty()) { 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 9115d991..9429dacb 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 @@ -187,10 +187,13 @@ public class Chan8 extends SiteBase { } @Override - public Loadable respondsTo(HttpUrl url) { - boolean responds = url.host().equals("8ch.net"); + public boolean respondsTo(HttpUrl url) { + return url.host().equals("8ch.net"); + } - if (responds) { + @Override + public Loadable resolve(HttpUrl url) { + if (respondsTo(url)) { List parts = url.pathSegments(); if (!parts.isEmpty()) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/SitesSetupController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/SitesSetupController.java index 637af738..e454a440 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/SitesSetupController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/SitesSetupController.java @@ -28,6 +28,7 @@ import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; @@ -139,22 +140,17 @@ public class SitesSetupController extends StyledToolbarNavigationController impl dialogView.setPresenter(presenter); - new AlertDialog.Builder(context) + final AlertDialog dialog = new AlertDialog.Builder(context) .setView(dialogView) .setTitle(R.string.setup_sites_add_title) - .setPositiveButton(R.string.add, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialogView.onPositiveClicked(); - } - }) + .setPositiveButton(R.string.add, null) .setNegativeButton(R.string.cancel, null) .show(); - } - @Override - public void dismiss() { - navigationController.stopPresenting(); + Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE); + positiveButton.setOnClickListener((v) -> { + dialogView.onPositiveClicked(); + }); } @Override diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/SiteAddLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/SiteAddLayout.java index 0d2cb715..685f6c6f 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/SiteAddLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/SiteAddLayout.java @@ -2,14 +2,16 @@ package org.floens.chan.ui.layout; import android.content.Context; import android.support.constraint.ConstraintLayout; +import android.support.design.widget.TextInputLayout; import android.util.AttributeSet; import android.widget.EditText; import org.floens.chan.R; import org.floens.chan.core.presenter.SitesSetupPresenter; -public class SiteAddLayout extends ConstraintLayout { +public class SiteAddLayout extends ConstraintLayout implements SitesSetupPresenter.AddCallback { private EditText url; + private TextInputLayout urlContainer; private SitesSetupPresenter presenter; public SiteAddLayout(Context context) { @@ -28,6 +30,7 @@ public class SiteAddLayout extends ConstraintLayout { protected void onFinishInflate() { super.onFinishInflate(); + urlContainer = findViewById(R.id.url_container); url = findViewById(R.id.url); } @@ -35,7 +38,24 @@ public class SiteAddLayout extends ConstraintLayout { this.presenter = presenter; } + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + presenter.bindAddDialog(this); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + presenter.unbindAddDialog(); + } + public void onPositiveClicked() { presenter.onAddClicked(url.getText().toString()); } + + @Override + public void showAddError(String error) { + urlContainer.setError(error); + } } diff --git a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java index a37b82be..e72420a6 100644 --- a/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java +++ b/Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java @@ -17,8 +17,10 @@ */ package org.floens.chan.utils; +import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; +import android.app.Application; import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.ComponentName; @@ -48,7 +50,6 @@ import android.view.inputmethod.InputMethodManager; import android.widget.TextView; import android.widget.Toast; -import org.floens.chan.Chan; import org.floens.chan.R; import java.util.ArrayList; @@ -67,24 +68,29 @@ public class AndroidUtils { public static Typeface ROBOTO_MEDIUM_ITALIC; public static Typeface ROBOTO_CONDENSED_REGULAR; + @SuppressLint("StaticFieldLeak") + private static Application application; private static ConnectivityManager connectivityManager; private static final Handler mainHandler = new Handler(Looper.getMainLooper()); - public static void init() { + public static void init(Application application) { + AndroidUtils.application = application; + ROBOTO_MEDIUM = getTypeface("Roboto-Medium.ttf"); ROBOTO_MEDIUM_ITALIC = getTypeface("Roboto-MediumItalic.ttf"); ROBOTO_CONDENSED_REGULAR = getTypeface("RobotoCondensed-Regular.ttf"); - connectivityManager = (ConnectivityManager) getAppContext().getSystemService(Context.CONNECTIVITY_SERVICE); + connectivityManager = (ConnectivityManager) + application.getSystemService(Context.CONNECTIVITY_SERVICE); } public static Resources getRes() { - return Chan.getInstance().getResources(); + return application.getResources(); } public static Context getAppContext() { - return Chan.getInstance(); + return application; } public static String getString(int res) { @@ -92,11 +98,11 @@ public class AndroidUtils { } public static SharedPreferences getPreferences() { - return PreferenceManager.getDefaultSharedPreferences(Chan.getInstance()); + return PreferenceManager.getDefaultSharedPreferences(application); } public static SharedPreferences getPreferences(String name) { - return Chan.getInstance().getSharedPreferences(name, Context.MODE_PRIVATE); + return application.getSharedPreferences(name, Context.MODE_PRIVATE); } /** diff --git a/Clover/app/src/main/res/layout/layout_site_add.xml b/Clover/app/src/main/res/layout/layout_site_add.xml index b95b9fcf..76776e8b 100644 --- a/Clover/app/src/main/res/layout/layout_site_add.xml +++ b/Clover/app/src/main/res/layout/layout_site_add.xml @@ -21,6 +21,7 @@ along with this program. If not, see . android:layout_height="match_parent">