From aaeb4833ac72cac7d0aeb3d6b2c09fa7f150274f Mon Sep 17 00:00:00 2001 From: Floens Date: Mon, 13 Apr 2015 11:55:58 +0200 Subject: [PATCH] Add thread load error layout --- .../chan/core/presenter/ThreadPresenter.java | 1 + .../floens/chan/ui/layout/ThreadLayout.java | 79 ++++++++++++++++--- .../chan/ui/layout/ThreadListLayout.java | 6 -- .../main/res/layout/layout_thread_error.xml | 23 ++++++ Clover/app/src/main/res/values/strings.xml | 2 +- 5 files changed, 93 insertions(+), 18 deletions(-) create mode 100644 Clover/app/src/main/res/layout/layout_thread_error.xml diff --git a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java index 4760a999..e23645ef 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java +++ b/Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java @@ -113,6 +113,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt @Override public void onChanLoaderError(VolleyError error) { + // TODO show error in status view is content is shown threadPresenterCallback.showError(error); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java index fd45a9f7..1d656c0a 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java @@ -23,8 +23,16 @@ import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.TextView; import android.widget.Toast; +import com.android.volley.NetworkError; +import com.android.volley.NoConnectionError; +import com.android.volley.ServerError; import com.android.volley.VolleyError; import org.floens.chan.R; @@ -43,16 +51,28 @@ import org.floens.chan.utils.AndroidUtils; import java.util.List; +import javax.net.ssl.SSLException; + /** * Wrapper around ThreadListLayout, so that it cleanly manages between loadbar and listview. */ -public class ThreadLayout extends LoadView implements ThreadPresenter.ThreadPresenterCallback, PostPopupHelper.PostPopupHelperCallback { +public class ThreadLayout extends LoadView implements ThreadPresenter.ThreadPresenterCallback, PostPopupHelper.PostPopupHelperCallback, View.OnClickListener { + private enum Visible { + LOADING, + THREAD, + ERROR; + } + private ThreadLayoutCallback callback; - private ThreadPresenter presenter; + private ThreadPresenter presenter; private ThreadListLayout threadListLayout; + + private LinearLayout errorLayout; + private TextView errorText; + private Button errorRetryButton; private PostPopupHelper postPopupHelper; - private boolean visible; + private Visible visible; public ThreadLayout(Context context) { super(context); @@ -77,7 +97,22 @@ public class ThreadLayout extends LoadView implements ThreadPresenter.ThreadPres postPopupHelper = new PostPopupHelper(getContext(), presenter, this); - switchVisible(false); + errorLayout = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.layout_thread_error, this, false); + errorText = (TextView) errorLayout.findViewById(R.id.text); + errorText.setTypeface(AndroidUtils.ROBOTO_MEDIUM); + + errorRetryButton = (Button) errorLayout.findViewById(R.id.button); + errorRetryButton.setOnClickListener(this); + + + switchVisible(Visible.LOADING); + } + + @Override + public void onClick(View v) { + if (v == errorRetryButton) { + presenter.requestData(); + } } public void setCallback(ThreadLayoutCallback callback) { @@ -90,20 +125,32 @@ public class ThreadLayout extends LoadView implements ThreadPresenter.ThreadPres @Override public void showPosts(ChanThread thread) { - threadListLayout.showPosts(thread, !visible); - switchVisible(true); + threadListLayout.showPosts(thread, visible != Visible.THREAD); + switchVisible(Visible.THREAD); callback.onShowPosts(); } @Override public void showError(VolleyError error) { - switchVisible(true); - threadListLayout.showError(error); + switchVisible(Visible.ERROR); + + String errorMessage; + if (error.getCause() instanceof SSLException) { + errorMessage = getContext().getString(R.string.thread_load_failed_ssl); + } else if ((error instanceof NoConnectionError) || (error instanceof NetworkError)) { + errorMessage = getContext().getString(R.string.thread_load_failed_network); + } else if (error instanceof ServerError) { + errorMessage = getContext().getString(R.string.thread_load_failed_server); + } else { + errorMessage = getContext().getString(R.string.thread_load_failed_parsing); + } + + errorText.setText(errorMessage); } @Override public void showLoading() { - switchVisible(false); + switchVisible(Visible.LOADING); } public void showPostInfo(String info) { @@ -187,10 +234,20 @@ public class ThreadLayout extends LoadView implements ThreadPresenter.ThreadPres return postPopupHelper.isOpen(); } - private void switchVisible(boolean visible) { + private void switchVisible(Visible visible) { if (this.visible != visible) { this.visible = visible; - setView(visible ? threadListLayout : null); + switch (visible) { + case LOADING: + setView(null); + break; + case THREAD: + setView(threadListLayout); + break; + case ERROR: + setView(errorLayout); + break; + } } } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java index c5b4adde..d02fce70 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java @@ -23,8 +23,6 @@ import android.view.View; import android.widget.ListView; import android.widget.RelativeLayout; -import com.android.volley.VolleyError; - import org.floens.chan.core.model.ChanThread; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostImage; @@ -94,10 +92,6 @@ public class ThreadListLayout extends RelativeLayout { postAdapter.setThread(thread); } - public void showError(VolleyError error) { - - } - public ThumbnailView getThumbnail(PostImage postImage) { ThumbnailView thumbnail = null; for (int i = 0; i < listView.getChildCount(); i++) { diff --git a/Clover/app/src/main/res/layout/layout_thread_error.xml b/Clover/app/src/main/res/layout/layout_thread_error.xml new file mode 100644 index 00000000..6c8fdc96 --- /dev/null +++ b/Clover/app/src/main/res/layout/layout_thread_error.xml @@ -0,0 +1,23 @@ + + + + + +