diff --git a/app/src/main/java/me/ghui/v2er/module/append/AppendTopicActivity.java b/app/src/main/java/me/ghui/v2er/module/append/AppendTopicActivity.java index d282dace..a3474a53 100644 --- a/app/src/main/java/me/ghui/v2er/module/append/AppendTopicActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/append/AppendTopicActivity.java @@ -134,26 +134,49 @@ public void handleError(GeneralError generalError) { if (Check.isEmpty(response)) return; Observable.just(response) .compose(rx(null)) - .map(s -> APIService.fruit().fromHtml(s, AppendTopicPageInfo.class)) - .subscribe(new GeneralConsumer() { + .map(s -> { + // First, check if this is actually a successful append + // (V2EX may return the topic page on success, which triggers error handler due to redirects) + TopicInfo topicInfo = APIService.fruit().fromHtml(s, TopicInfo.class); + if (isSuccessfulTopicResponse(topicInfo)) { + return topicInfo; + } + // If not a valid topic, try parsing as error page + return APIService.fruit().fromHtml(s, AppendTopicPageInfo.class); + }) + .subscribe(new GeneralConsumer() { @Override - public void onConsume(AppendTopicPageInfo pageInfo) { - AppendTopicPageInfo.Problem problem = pageInfo.getProblem(); - if (problem != null) { - StringBuilder msg = new StringBuilder(); - for (int i = 0; i < problem.getTips().size(); i++) { - msg.append(i + 1).append(". ").append(problem.getTips().get(i)).append("\n"); + public void onConsume(BaseInfo baseInfo) { + if (baseInfo instanceof TopicInfo) { + // Actually a success! Treat it as such + onAfterAppendTopic((TopicInfo) baseInfo); + } else if (baseInfo instanceof AppendTopicPageInfo) { + AppendTopicPageInfo pageInfo = (AppendTopicPageInfo) baseInfo; + AppendTopicPageInfo.Problem problem = pageInfo.getProblem(); + if (problem != null) { + StringBuilder msg = new StringBuilder(); + for (int i = 0; i < problem.getTips().size(); i++) { + msg.append(i + 1).append(". ").append(problem.getTips().get(i)).append("\n"); + } + new ConfirmDialog.Builder(getActivity()) + .title(problem.getTitle()) + .msg(msg.toString()) + .positiveText(R.string.ok) + .build().show(); } - new ConfirmDialog.Builder(getActivity()) - .title(problem.getTitle()) - .msg(msg.toString()) - .positiveText(R.string.ok) - .build().show(); } } }); } + private boolean isSuccessfulTopicResponse(TopicInfo topicInfo) { + if (topicInfo == null || !topicInfo.isValid()) { + return false; + } + TopicInfo.Problem problem = topicInfo.getProblem(); + return (problem == null || problem.isEmpty()) && Check.notEmpty(topicInfo.getTopicLink()); + } + @Override public void onAfterAppendTopic(TopicInfo topicInfo) { Utils.toggleKeyboard(false, mContentET); diff --git a/app/src/main/java/me/ghui/v2er/module/create/CreateTopicActivity.java b/app/src/main/java/me/ghui/v2er/module/create/CreateTopicActivity.java index f8fe2b37..1b78c95b 100644 --- a/app/src/main/java/me/ghui/v2er/module/create/CreateTopicActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/create/CreateTopicActivity.java @@ -203,6 +203,13 @@ public void handleError(GeneralError generalError) { Observable.just(response) .compose(rx(null)) .map(s -> { + // First, check if this is actually a successful topic creation + // (V2EX may return the topic page on success, which triggers error handler due to redirects) + TopicInfo topicInfo = APIService.fruit().fromHtml(s, TopicInfo.class); + if (isSuccessfulTopicResponse(topicInfo)) { + return topicInfo; + } + // If not a valid topic, try parsing as error pages BaseInfo resultInfo = APIService.fruit().fromHtml(s, CreateTopicPageInfo.class); if (!resultInfo.isValid()) { resultInfo = APIService.fruit().fromHtml(s, NewUserBannedCreateInfo.class); @@ -212,7 +219,10 @@ public void handleError(GeneralError generalError) { .subscribe(new GeneralConsumer(this) { @Override public void onConsume(BaseInfo baseInfo) { - if (baseInfo instanceof CreateTopicPageInfo) { + if (baseInfo instanceof TopicInfo) { + // Actually a success! Treat it as such + onPostSuccess((TopicInfo) baseInfo); + } else if (baseInfo instanceof CreateTopicPageInfo) { onPostFailure((CreateTopicPageInfo) baseInfo); } else { onBannedCreateTopic((NewUserBannedCreateInfo) baseInfo); @@ -234,4 +244,12 @@ private void onBannedCreateTopic(NewUserBannedCreateInfo bannedCreateInfo) { }).build().show(); } + private boolean isSuccessfulTopicResponse(TopicInfo topicInfo) { + if (topicInfo == null || !topicInfo.isValid()) { + return false; + } + TopicInfo.Problem problem = topicInfo.getProblem(); + return (problem == null || problem.isEmpty()) && Check.notEmpty(topicInfo.getTopicLink()); + } + }