implement site add error messages

set applicationcontext to androidutils, not the other way around.
multisite
Floens 8 years ago
parent 182da4604c
commit a15e70630e
  1. 2
      Clover/app/src/main/java/org/floens/chan/Chan.java
  2. 18
      Clover/app/src/main/java/org/floens/chan/core/presenter/SitesSetupPresenter.java
  3. 4
      Clover/app/src/main/java/org/floens/chan/core/site/Site.java
  4. 8
      Clover/app/src/main/java/org/floens/chan/core/site/SiteManager.java
  5. 18
      Clover/app/src/main/java/org/floens/chan/core/site/SiteResolver.java
  6. 9
      Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java
  7. 9
      Clover/app/src/main/java/org/floens/chan/core/site/sites/chan8/Chan8.java
  8. 18
      Clover/app/src/main/java/org/floens/chan/ui/controller/SitesSetupController.java
  9. 22
      Clover/app/src/main/java/org/floens/chan/ui/layout/SiteAddLayout.java
  10. 20
      Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java
  11. 1
      Clover/app/src/main/res/layout/layout_site_add.xml

@ -82,7 +82,7 @@ public class Chan extends Application implements UserAgentProvider, Application.
registerActivityLifecycleCallbacks(this); registerActivityLifecycleCallbacks(this);
AndroidUtils.init(); AndroidUtils.init(this);
userAgent = createUserAgent(); userAgent = createUserAgent();

@ -33,6 +33,7 @@ public class SitesSetupPresenter {
private BoardManager boardManager; private BoardManager boardManager;
private Callback callback; private Callback callback;
private AddCallback addCallback;
private List<Site> sites = new ArrayList<>(); private List<Site> sites = new ArrayList<>();
@ -52,6 +53,14 @@ public class SitesSetupPresenter {
this.callback.setNextAllowed(!sites.isEmpty(), false); this.callback.setNextAllowed(!sites.isEmpty(), false);
} }
public void bindAddDialog(AddCallback addCallback) {
this.addCallback = addCallback;
}
public void unbindAddDialog() {
this.addCallback = null;
}
public boolean mayExit() { public boolean mayExit() {
return sites.size() > 0; return sites.size() > 0;
} }
@ -69,13 +78,12 @@ public class SitesSetupPresenter {
@Override @Override
public void onSiteAddFailed(String message) { public void onSiteAddFailed(String message) {
// TODO addCallback.showAddError(message);
} }
}); });
} }
public void onDoneClicked() { public void onDoneClicked() {
callback.dismiss();
} }
public int getSiteBoardCount(Site site) { public int getSiteBoardCount(Site site) {
@ -98,12 +106,14 @@ public class SitesSetupPresenter {
public interface Callback { public interface Callback {
void showAddDialog(); void showAddDialog();
void dismiss();
void setAddedSites(List<Site> sites); void setAddedSites(List<Site> sites);
void setNextAllowed(boolean nextAllowed, boolean animate); void setNextAllowed(boolean nextAllowed, boolean animate);
void openSiteConfiguration(Site site); void openSiteConfiguration(Site site);
} }
public interface AddCallback {
void showAddError(String error);
}
} }

@ -131,7 +131,9 @@ public interface Site {
SiteIcon icon(); SiteIcon icon();
Loadable respondsTo(HttpUrl url); boolean respondsTo(HttpUrl url);
Loadable resolve(HttpUrl url);
boolean feature(Feature feature); boolean feature(Feature feature);

@ -47,13 +47,19 @@ public class SiteManager {
} }
public void addSite(String url, SiteAddCallback callback) { 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); SiteResolver.SiteResolverResult resolve = resolver.resolveSiteForUrl(url);
Class<? extends Site> siteClass; Class<? extends Site> siteClass;
if (resolve.match == SiteResolver.SiteResolverResult.Match.BUILTIN) { if (resolve.match == SiteResolver.SiteResolverResult.Match.BUILTIN) {
siteClass = resolve.builtinResult; siteClass = resolve.builtinResult;
} else if (resolve.match == SiteResolver.SiteResolverResult.Match.EXTERNAL) { } else if (resolve.match == SiteResolver.SiteResolverResult.Match.EXTERNAL) {
callback.onSiteAddFailed("external todo"); callback.onSiteAddFailed("external sites not hardcoded is not implemented yet");
return; return;
} else { } else {
callback.onSiteAddFailed("not a url"); callback.onSiteAddFailed("not a url");

@ -37,6 +37,22 @@ public class SiteResolver {
this.loadableProvider = loadableProvider; 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) { SiteResolverResult resolveSiteForUrl(String url) {
List<Resolvable> resolvables = Sites.RESOLVABLES; List<Resolvable> resolvables = Sites.RESOLVABLES;
@ -73,7 +89,7 @@ public class SiteResolver {
} }
for (Site site : Sites.allSites()) { for (Site site : Sites.allSites()) {
Loadable resolved = site.respondsTo(httpUrl); Loadable resolved = site.resolve(httpUrl);
if (resolved != null) { if (resolved != null) {
return new LoadableResult(resolved); return new LoadableResult(resolved);

@ -272,12 +272,15 @@ public class Chan4 extends SiteBase {
} }
@Override @Override
public Loadable respondsTo(HttpUrl url) { public boolean respondsTo(HttpUrl url) {
boolean responds = url.host().equals("4chan.org") || return url.host().equals("4chan.org") ||
url.host().equals("www.4chan.org") || url.host().equals("www.4chan.org") ||
url.host().equals("boards.4chan.org"); url.host().equals("boards.4chan.org");
}
if (responds) { @Override
public Loadable resolve(HttpUrl url) {
if (respondsTo(url)) {
List<String> parts = url.pathSegments(); List<String> parts = url.pathSegments();
if (!parts.isEmpty()) { if (!parts.isEmpty()) {

@ -187,10 +187,13 @@ public class Chan8 extends SiteBase {
} }
@Override @Override
public Loadable respondsTo(HttpUrl url) { public boolean respondsTo(HttpUrl url) {
boolean responds = url.host().equals("8ch.net"); return url.host().equals("8ch.net");
}
if (responds) { @Override
public Loadable resolve(HttpUrl url) {
if (respondsTo(url)) {
List<String> parts = url.pathSegments(); List<String> parts = url.pathSegments();
if (!parts.isEmpty()) { if (!parts.isEmpty()) {

@ -28,6 +28,7 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
@ -139,22 +140,17 @@ public class SitesSetupController extends StyledToolbarNavigationController impl
dialogView.setPresenter(presenter); dialogView.setPresenter(presenter);
new AlertDialog.Builder(context) final AlertDialog dialog = new AlertDialog.Builder(context)
.setView(dialogView) .setView(dialogView)
.setTitle(R.string.setup_sites_add_title) .setTitle(R.string.setup_sites_add_title)
.setPositiveButton(R.string.add, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.add, null)
@Override
public void onClick(DialogInterface dialog, int which) {
dialogView.onPositiveClicked();
}
})
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.show(); .show();
}
@Override Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
public void dismiss() { positiveButton.setOnClickListener((v) -> {
navigationController.stopPresenting(); dialogView.onPositiveClicked();
});
} }
@Override @Override

@ -2,14 +2,16 @@ package org.floens.chan.ui.layout;
import android.content.Context; import android.content.Context;
import android.support.constraint.ConstraintLayout; import android.support.constraint.ConstraintLayout;
import android.support.design.widget.TextInputLayout;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.widget.EditText; import android.widget.EditText;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.core.presenter.SitesSetupPresenter; import org.floens.chan.core.presenter.SitesSetupPresenter;
public class SiteAddLayout extends ConstraintLayout { public class SiteAddLayout extends ConstraintLayout implements SitesSetupPresenter.AddCallback {
private EditText url; private EditText url;
private TextInputLayout urlContainer;
private SitesSetupPresenter presenter; private SitesSetupPresenter presenter;
public SiteAddLayout(Context context) { public SiteAddLayout(Context context) {
@ -28,6 +30,7 @@ public class SiteAddLayout extends ConstraintLayout {
protected void onFinishInflate() { protected void onFinishInflate() {
super.onFinishInflate(); super.onFinishInflate();
urlContainer = findViewById(R.id.url_container);
url = findViewById(R.id.url); url = findViewById(R.id.url);
} }
@ -35,7 +38,24 @@ public class SiteAddLayout extends ConstraintLayout {
this.presenter = presenter; this.presenter = presenter;
} }
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
presenter.bindAddDialog(this);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
presenter.unbindAddDialog();
}
public void onPositiveClicked() { public void onPositiveClicked() {
presenter.onAddClicked(url.getText().toString()); presenter.onAddClicked(url.getText().toString());
} }
@Override
public void showAddError(String error) {
urlContainer.setError(error);
}
} }

@ -17,8 +17,10 @@
*/ */
package org.floens.chan.utils; package org.floens.chan.utils;
import android.annotation.SuppressLint;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.Activity; import android.app.Activity;
import android.app.Application;
import android.app.Dialog; import android.app.Dialog;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.ComponentName; import android.content.ComponentName;
@ -48,7 +50,6 @@ import android.view.inputmethod.InputMethodManager;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import org.floens.chan.Chan;
import org.floens.chan.R; import org.floens.chan.R;
import java.util.ArrayList; import java.util.ArrayList;
@ -67,24 +68,29 @@ public class AndroidUtils {
public static Typeface ROBOTO_MEDIUM_ITALIC; public static Typeface ROBOTO_MEDIUM_ITALIC;
public static Typeface ROBOTO_CONDENSED_REGULAR; public static Typeface ROBOTO_CONDENSED_REGULAR;
@SuppressLint("StaticFieldLeak")
private static Application application;
private static ConnectivityManager connectivityManager; private static ConnectivityManager connectivityManager;
private static final Handler mainHandler = new Handler(Looper.getMainLooper()); 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 = getTypeface("Roboto-Medium.ttf");
ROBOTO_MEDIUM_ITALIC = getTypeface("Roboto-MediumItalic.ttf"); ROBOTO_MEDIUM_ITALIC = getTypeface("Roboto-MediumItalic.ttf");
ROBOTO_CONDENSED_REGULAR = getTypeface("RobotoCondensed-Regular.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() { public static Resources getRes() {
return Chan.getInstance().getResources(); return application.getResources();
} }
public static Context getAppContext() { public static Context getAppContext() {
return Chan.getInstance(); return application;
} }
public static String getString(int res) { public static String getString(int res) {
@ -92,11 +98,11 @@ public class AndroidUtils {
} }
public static SharedPreferences getPreferences() { public static SharedPreferences getPreferences() {
return PreferenceManager.getDefaultSharedPreferences(Chan.getInstance()); return PreferenceManager.getDefaultSharedPreferences(application);
} }
public static SharedPreferences getPreferences(String name) { public static SharedPreferences getPreferences(String name) {
return Chan.getInstance().getSharedPreferences(name, Context.MODE_PRIVATE); return application.getSharedPreferences(name, Context.MODE_PRIVATE);
} }
/** /**

@ -21,6 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
android:layout_height="match_parent"> android:layout_height="match_parent">
<android.support.design.widget.TextInputLayout <android.support.design.widget.TextInputLayout
android:id="@+id/url_container"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"

Loading…
Cancel
Save