package cl.monsoon.s1next.view.dialog;
import android.os.Bundle;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import cl.monsoon.s1next.R;
import cl.monsoon.s1next.data.api.model.ThreadLink;
import cl.monsoon.s1next.util.ErrorUtil;
import cl.monsoon.s1next.view.activity.PostListActivity;
import rx.Observable;
/**
* A {@link ProgressDialogFragment} parses quote post page for thread.
*/
public final class QuotePostPageParserDialogFragment extends ProgressDialogFragment<String> {
public static final String TAG = QuotePostPageParserDialogFragment.class.getName();
private static final String ARG_THREAD_LINK = "thread_link";
private boolean mShouldFinishActivity = true;
public static QuotePostPageParserDialogFragment newInstance(ThreadLink threadLink) {
QuotePostPageParserDialogFragment fragment = new QuotePostPageParserDialogFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(ARG_THREAD_LINK, threadLink);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onDestroy() {
super.onDestroy();
if (mShouldFinishActivity) {
getActivity().finish();
}
}
@Override
protected Observable<String> getSourceObservable() {
ThreadLink threadLink = Preconditions.checkNotNull(getArguments().getParcelable(
ARG_THREAD_LINK));
return mS1Service.getQuotePostResponseBody(threadLink.getThreadId(),
threadLink.getQuotePostId().get()).map(voidResponse ->
voidResponse.raw().request().url().toString());
}
@Override
protected void onNext(String url) {
Optional<Integer> jumpPage = parseQuotePostPage(url);
if (jumpPage.isPresent()) {
ThreadLink threadLink = Preconditions.checkNotNull(getArguments().getParcelable(
ARG_THREAD_LINK));
ThreadLink threadLinkWithJumpPage = new ThreadLink.Builder(threadLink.getThreadId())
.jumpPage(jumpPage.get())
.quotePostId(threadLink.getQuotePostId().get())
.build();
PostListActivity.startPostListActivity(getActivity(), threadLinkWithJumpPage);
} else {
ThreadLinkInvalidPromptDialogFragment.newInstance(getContext(),
R.string.dialog_message_quote_not_found).show(getFragmentManager(),
ThreadLinkInvalidPromptDialogFragment.TAG);
mShouldFinishActivity = false;
}
}
@Override
protected void onError(Throwable throwable) {
ThreadLinkInvalidPromptDialogFragment.newInstance(getContext(), ErrorUtil.parse(throwable))
.show(getFragmentManager(), ThreadLinkInvalidPromptDialogFragment.TAG);
mShouldFinishActivity = false;
}
@Override
protected CharSequence getProgressMessage() {
return getString(R.string.dialog_message_processing);
}
/**
* Parses redirect link in order to get quote post page.
*
* @param url The redirect link.
*/
private Optional<Integer> parseQuotePostPage(String url) {
// example: http://bbs.saraba1st.com/2b/forum.php?mod=viewthread&tid=1074030&page=1#pid27217893
Pattern pattern = Pattern.compile("page=(\\d+)");
Matcher matcher = pattern.matcher(url);
if (matcher.find()) {
return Optional.of(Integer.parseInt(matcher.group(1)));
}
return Optional.absent();
}
}