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);
AndroidUtils.init();
AndroidUtils.init(this);
userAgent = createUserAgent();

@ -33,6 +33,7 @@ public class SitesSetupPresenter {
private BoardManager boardManager;
private Callback callback;
private AddCallback addCallback;
private List<Site> 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<Site> sites);
void setNextAllowed(boolean nextAllowed, boolean animate);
void openSiteConfiguration(Site site);
}
public interface AddCallback {
void showAddError(String error);
}
}

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

@ -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<? extends Site> 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");

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

@ -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<String> parts = url.pathSegments();
if (!parts.isEmpty()) {

@ -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<String> parts = url.pathSegments();
if (!parts.isEmpty()) {

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

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

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

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

Loading…
Cancel
Save