Only pause pins on 404 network errors, not all errors.

Fix issue with the ThreadStatusCell not updating correctly on error status changes.
Fix crash on clicking up/down when no thread is loaded.
Abstract the volley error to abstract the message needed and if it's a 404.
multisite
Floens 9 years ago
parent 1510b12766
commit b9bc730e4f
  1. 7
      Clover/app/src/main/java/org/floens/chan/chan/ChanLoader.java
  2. 64
      Clover/app/src/main/java/org/floens/chan/core/exception/ChanLoaderException.java
  3. 22
      Clover/app/src/main/java/org/floens/chan/core/manager/WatchManager.java
  4. 7
      Clover/app/src/main/java/org/floens/chan/core/presenter/ThreadPresenter.java
  5. 5
      Clover/app/src/main/java/org/floens/chan/test/TestActivity.java
  6. 18
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PostAdapter.java
  7. 3
      Clover/app/src/main/java/org/floens/chan/ui/cell/ThreadStatusCell.java
  8. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/ViewThreadController.java
  9. 25
      Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java
  10. 3
      Clover/app/src/main/res/values/strings.xml

@ -25,6 +25,7 @@ import com.android.volley.VolleyError;
import org.floens.chan.Chan;
import org.floens.chan.core.database.DatabaseManager;
import org.floens.chan.core.exception.ChanLoaderException;
import org.floens.chan.core.model.ChanThread;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
@ -241,8 +242,10 @@ public class ChanLoader implements Response.ErrorListener, Response.Listener<Cha
clearTimer();
ChanLoaderException loaderException = new ChanLoaderException(error);
for (ChanLoaderCallback l : listeners) {
l.onChanLoaderError(error);
l.onChanLoaderError(loaderException);
}
}
@ -318,6 +321,6 @@ public class ChanLoader implements Response.ErrorListener, Response.Listener<Cha
public interface ChanLoaderCallback {
void onChanLoaderData(ChanThread result);
void onChanLoaderError(VolleyError error);
void onChanLoaderError(ChanLoaderException error);
}
}

@ -0,0 +1,64 @@
package org.floens.chan.core.exception;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkError;
import com.android.volley.ParseError;
import com.android.volley.ServerError;
import com.android.volley.TimeoutError;
import com.android.volley.VolleyError;
import org.floens.chan.R;
import javax.net.ssl.SSLException;
public class ChanLoaderException extends Exception {
private VolleyError volleyError;
public ChanLoaderException(VolleyError volleyError) {
this.volleyError = volleyError;
}
public ChanLoaderException() {
}
public ChanLoaderException(String message) {
super(message);
}
public ChanLoaderException(String message, Throwable cause) {
super(message, cause);
}
public ChanLoaderException(Throwable cause) {
super(cause);
}
public boolean isNotFound() {
return volleyError instanceof ServerError && isServerErrorNotFound((ServerError) volleyError);
}
public int getErrorMessage() {
int errorMessage;
if (volleyError.getCause() instanceof SSLException) {
errorMessage = R.string.thread_load_failed_ssl;
} else if (volleyError instanceof NetworkError ||
volleyError instanceof TimeoutError ||
volleyError instanceof ParseError ||
volleyError instanceof AuthFailureError) {
errorMessage = R.string.thread_load_failed_network;
} else if (volleyError instanceof ServerError) {
if (isServerErrorNotFound((ServerError) volleyError)) {
errorMessage = R.string.thread_load_failed_not_found;
} else {
errorMessage = R.string.thread_load_failed_server;
}
} else {
errorMessage = R.string.thread_load_failed_parsing;
}
return errorMessage;
}
private boolean isServerErrorNotFound(ServerError serverError) {
return serverError.networkResponse != null && serverError.networkResponse.statusCode == 404;
}
}

@ -26,12 +26,11 @@ import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
import com.android.volley.VolleyError;
import org.floens.chan.Chan;
import org.floens.chan.chan.ChanLoader;
import org.floens.chan.core.database.DatabaseManager;
import org.floens.chan.core.database.DatabasePinManager;
import org.floens.chan.core.exception.ChanLoaderException;
import org.floens.chan.core.model.ChanThread;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Pin;
@ -698,19 +697,14 @@ public class WatchManager {
}
}
/*private long getTimeUntilNextLoad() {
return chanLoader.getTimeUntilLoadMore();
}*/
/*public boolean isLoading() {
return chanLoader.isLoading();
}*/
@Override
public void onChanLoaderError(VolleyError error) {
pin.isError = true;
pin.watching = false;
public void onChanLoaderError(ChanLoaderException error) {
// Ignore normal network errors, we only pause pins when there is absolutely no way
// we'll ever need watching again: a 404.
if (error.isNotFound()) {
pin.isError = true;
pin.watching = false;
}
pinWatcherUpdated(this);
}

@ -19,13 +19,12 @@ package org.floens.chan.core.presenter;
import android.text.TextUtils;
import com.android.volley.VolleyError;
import org.floens.chan.Chan;
import org.floens.chan.R;
import org.floens.chan.chan.ChanLoader;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.database.DatabaseManager;
import org.floens.chan.core.exception.ChanLoaderException;
import org.floens.chan.core.http.DeleteHttpCall;
import org.floens.chan.core.http.ReplyManager;
import org.floens.chan.core.manager.BoardManager;
@ -283,7 +282,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
}
@Override
public void onChanLoaderError(VolleyError error) {
public void onChanLoaderError(ChanLoaderException error) {
threadPresenterCallback.showError(error);
}
@ -682,7 +681,7 @@ public class ThreadPresenter implements ChanLoader.ChanLoaderCallback, PostAdapt
void postClicked(Post post);
void showError(VolleyError error);
void showError(ChanLoaderException error);
void showLoading();

@ -25,11 +25,10 @@ import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import com.android.volley.VolleyError;
import org.floens.chan.Chan;
import org.floens.chan.chan.ChanLoader;
import org.floens.chan.core.cache.FileCache;
import org.floens.chan.core.exception.ChanLoaderException;
import org.floens.chan.core.model.ChanThread;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
@ -230,7 +229,7 @@ public class TestActivity extends Activity implements View.OnClickListener {
}
@Override
public void onChanLoaderError(VolleyError error) {
public void onChanLoaderError(ChanLoaderException error) {
}
});

@ -51,7 +51,7 @@ public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private String highlightedPostId;
private int highlightedPostNo = -1;
private String highlightedPostTripcode;
private int selectedPost;
private int selectedPost = -1;
private int lastSeenIndicatorPosition = -1;
private boolean bound;
@ -213,19 +213,23 @@ public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
highlightedPostId = null;
highlightedPostNo = -1;
highlightedPostTripcode = null;
selectedPost = -1;
lastSeenIndicatorPosition = -1;
error = null;
bound = false;
}
public void showError(String error) {
this.error = error;
if (showStatusView()) {
RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(getItemCount() - 1);
// Recyclerview did not sync yet
if (viewHolder instanceof StatusViewHolder) {
ThreadStatusCell threadStatusCell = ((StatusViewHolder) viewHolder).threadStatusCell;
threadStatusCell.setError(error);
threadStatusCell.update();
final int childCount = recyclerView.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = recyclerView.getChildAt(i);
if (child instanceof ThreadStatusCell) {
ThreadStatusCell threadStatusCell = (ThreadStatusCell) child;
threadStatusCell.setError(error);
threadStatusCell.update();
}
}
}
}

@ -83,6 +83,9 @@ public class ThreadStatusCell extends LinearLayout implements View.OnClickListen
public void setError(String error) {
this.error = error;
if (error == null) {
schedule();
}
}
public boolean update() {

@ -120,7 +120,7 @@ public class ViewThreadController extends ThreadController implements ThreadLayo
setPinIconState();
// Update title
if (message.pin.loadable == loadable) {
threadLayout.getPresenter().refreshUI();
onShowPosts();
}
}

@ -40,17 +40,11 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkError;
import com.android.volley.ParseError;
import com.android.volley.ServerError;
import com.android.volley.TimeoutError;
import com.android.volley.VolleyError;
import org.floens.chan.Chan;
import org.floens.chan.R;
import org.floens.chan.controller.Controller;
import org.floens.chan.core.database.DatabaseManager;
import org.floens.chan.core.exception.ChanLoaderException;
import org.floens.chan.core.model.ChanThread;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
@ -69,8 +63,6 @@ import org.floens.chan.utils.AndroidUtils;
import java.util.List;
import javax.net.ssl.SSLException;
import static org.floens.chan.ui.theme.ThemeHelper.theme;
import static org.floens.chan.utils.AndroidUtils.fixSnackbarText;
import static org.floens.chan.utils.AndroidUtils.getString;
@ -221,17 +213,8 @@ public class ThreadLayout extends CoordinatorLayout implements ThreadPresenter.T
}
@Override
public void showError(VolleyError error) {
String errorMessage;
if (error.getCause() instanceof SSLException) {
errorMessage = getContext().getString(R.string.thread_load_failed_ssl);
} else if (error instanceof NetworkError || error instanceof TimeoutError || error instanceof ParseError || error instanceof AuthFailureError) {
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);
}
public void showError(ChanLoaderException error) {
String errorMessage = getString(error.getErrorMessage());
if (visible == Visible.THREAD) {
threadListLayout.showError(errorMessage);
@ -343,7 +326,7 @@ public class ThreadLayout extends CoordinatorLayout implements ThreadPresenter.T
public void scrollTo(int displayPosition, boolean smooth) {
if (postPopupHelper.isOpen()) {
postPopupHelper.scrollTo(displayPosition, smooth);
} else {
} else if (visible == Visible.THREAD) {
threadListLayout.scrollTo(displayPosition, smooth);
}
}

@ -158,7 +158,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<string name="thread_load_failed_ssl">HTTPS error</string>
<string name="thread_load_failed_network">Network error</string>
<string name="thread_load_failed_parsing">API parse error</string>
<string name="thread_load_failed_server">404 not found</string>
<string name="thread_load_failed_server">Server error</string>
<string name="thread_load_failed_not_found">404 not found</string>
<string name="thread_refresh_bar_inactive">Tap to refresh</string>
<string name="thread_refresh_now">Loading</string>
<string name="thread_refresh_countdown">Loading in %1$d</string>

Loading…
Cancel
Save