package org.petabytes.awesomeblogs.summary;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Toast;
import com.flipboard.bottomsheet.BottomSheetLayout;
import com.overzealous.remark.Remark;
import org.petabytes.api.source.local.Entry;
import org.petabytes.awesomeblogs.AwesomeBlogsApp;
import org.petabytes.awesomeblogs.R;
import org.petabytes.awesomeblogs.chrome.Chromes;
import org.petabytes.awesomeblogs.util.Alerts;
import org.petabytes.awesomeblogs.util.Analytics;
import org.petabytes.awesomeblogs.util.Intents;
import org.petabytes.awesomeblogs.util.Strings;
import org.petabytes.coordinator.Activity;
import org.petabytes.coordinator.Coordinator;
import java.util.HashMap;
import butterknife.BindView;
import butterknife.OnClick;
import eu.fiskur.markdownview.MarkdownView;
import rx.Observable;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import static org.petabytes.awesomeblogs.R.id.summary;
class SummaryCoordinator extends Coordinator {
@BindView(R.id.bottom_sheet) BottomSheetLayout bottomSheetView;
@BindView(summary) MarkdownView summaryView;
private final Context context;
private final String link;
private final String from;
private final Action1<Integer> onLoading;
private final Action0 onCloseAction;
private Entry entry;
SummaryCoordinator(@NonNull Context context, @NonNull String link, @NonNull String from,
@NonNull Action1<Integer> onLoadingAction, @NonNull Action0 onCloseAction) {
this.context = context;
this.link = link;
this.from = from;
this.onLoading = onLoadingAction;
this.onCloseAction = onCloseAction;
}
@Override
public void attach(@NonNull View view) {
super.attach(view);
bind(AwesomeBlogsApp.get().api().getEntry(link)
.doOnNext(entry -> this.entry = entry), this::onEntryChanged);
summaryView.setOnProgressChangedListener(onLoading::call);
summaryView.setOnOverrideUrlAction(
url -> {
Chromes.open(context, url);
Analytics.event(Analytics.Event.OPEN_IN_BROWSER, new HashMap<String, String>(2) {{
put(Analytics.Param.TITLE, entry.getTitle());
put(Analytics.Param.LINK, url);
}});
},
() -> Alerts.show((Activity) context, R.string.error_title, R.string.error_invalid_link));
}
private void onEntryChanged(@NonNull Entry entry) {
bind(Observable.just(entry.getSummary())
.map(summary -> new Remark().convert(summary))
.map(summary -> "## [" + entry.getTitle() + "](" + entry.getLink() + ")\n ###### "
+ Entry.getFormattedAuthorUpdatedAt(entry.getAuthor(), entry.getUpdatedAt()) + "\n" + summary)
.map(summary -> summary.replace("'", "\\'"))
.subscribeOn(Schedulers.io()), summary -> summaryView.showMarkdown(entry.getLink(), summary));
AwesomeBlogsApp.get().api().markAsRead(entry, System.currentTimeMillis());
Analytics.event(Analytics.Event.VIEW_SUMMARY, new HashMap<String, String>(3) {{
put(Analytics.Param.TITLE, entry.getTitle());
put(Analytics.Param.LINK, entry.getLink());
put(Analytics.Param.FROM, from);
}});
}
@OnClick(R.id.close)
void onCloseClick() {
onCloseAction.call();
}
@OnClick(R.id.share)
void onShareClick() {
context.startActivity(Intent.createChooser(Intents.createShareIntent(entry.getTitle(), link), context.getString(R.string.share)));
Analytics.event(Analytics.Event.SHARE, new HashMap<String, String>(2) {{
put(Analytics.Param.TITLE, entry.getTitle());
put(Analytics.Param.LINK, link);
}});
}
@OnClick(R.id.copy)
void onCopyClick() {
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText(Strings.EMPTY, link);
clipboard.setPrimaryClip(clip);
Toast.makeText(context, R.string.copy_link_completed, Toast.LENGTH_SHORT).show();
Analytics.event(Analytics.Event.COPY_LINK, Analytics.Param.LINK, link);
}
@OnClick(R.id.open)
void onOpenClick() {
try {
Chromes.open(context, link);
} catch (ActivityNotFoundException e) {
Alerts.show((Activity) context, R.string.error_title, R.string.error_invalid_link);
}
Analytics.event(Analytics.Event.OPEN_IN_BROWSER, new HashMap<String, String>(2) {{
put(Analytics.Param.TITLE, entry.getTitle());
put(Analytics.Param.LINK, link);
}});
}
}