package com.malmstein.yahnac.story;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import com.malmstein.yahnac.BuildConfig;
import com.malmstein.yahnac.HNewsActivity;
import com.malmstein.yahnac.R;
import com.malmstein.yahnac.data.DataPersister;
import com.malmstein.yahnac.injection.Inject;
import com.malmstein.yahnac.model.Story;
import com.malmstein.yahnac.views.SnackBarView;
import com.novoda.notils.caster.Views;
public class StoryActivity extends HNewsActivity {
public static final String ARG_STORY = BuildConfig.APPLICATION_ID + ".ARG_STORY";
private WebView webView;
private ProgressBar webViewProgress;
private SnackBarView snackbarView;
private int croutonAnimationDuration;
private int croutonBackgroundAlpha;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_story);
setupSubActivity();
setupSnackbar();
setupWebView();
}
@Override
protected void onResume() {
super.onResume();
Inject.usageAnalytics().trackStory(
getString(R.string.analytics_page_story), getStory());
}
private Story getStory() {
return (Story) getIntent().getExtras().getSerializable(ARG_STORY);
}
private void setupSnackbar() {
snackbarView = Views.findById(this, R.id.snackbar);
croutonBackgroundAlpha = getResources().getInteger(R.integer.feed_crouton_background_alpha);
croutonAnimationDuration = getResources().getInteger(R.integer.feed_crouton_animation_duration);
}
private void setupWebView() {
webView = Views.findById(this, R.id.article_webview);
webViewProgress = Views.findById(this, R.id.article_progress);
WebSettings webSettings = webView.getSettings();
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false);
webSettings.setSupportZoom(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setUseWideViewPort(true);
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.setWebViewClient(new HackerNewsWebClient());
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
webViewProgress.setProgress(progress);
if (webViewProgress.getProgress() >= 100) {
webViewProgress.setVisibility(View.GONE);
}
}
});
webView.loadUrl(getStory().getUrl());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_article, menu);
MenuItem bookmarks = menu.findItem(R.id.action_bookmark);
if (getStory().isBookmark()) {
checkBookmarkMenuItem(bookmarks);
} else {
uncheckBookmarkMenuItem(bookmarks);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_comments:
Inject.usageAnalytics().trackNavigateEvent(getString(R.string.analytics_event_view_comments_story),
getStory());
navigate().toComments(getStory());
finish();
return true;
case R.id.action_bookmark:
onBookmarkClicked(item);
return true;
case R.id.action_share:
Inject.usageAnalytics().trackShareEvent(getString(R.string.analytics_event_share_story),
getStory());
Intent chooserIntent = Intent.createChooser(getStory().createShareIntent(), SHARE_DIALOG_DEFAULT_TITLE);
startActivity(chooserIntent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void onBookmarkClicked(MenuItem item) {
DataPersister persister = Inject.dataPersister();
if (item.isChecked()) {
Inject.usageAnalytics().trackBookmarkEvent(getString(R.string.analytics_event_remove_bookmark_story),
getStory());
removeBookmark(persister, getStory());
uncheckBookmarkMenuItem(item);
} else {
Inject.usageAnalytics().trackBookmarkEvent(getString(R.string.analytics_event_add_bookmark_story),
getStory());
addBookmark(persister, getStory());
checkBookmarkMenuItem(item);
}
getStory().toggleBookmark();
}
private void checkBookmarkMenuItem(MenuItem bookmarks) {
bookmarks.setChecked(true);
bookmarks.setIcon(R.drawable.ic_bookmark_white);
}
private void uncheckBookmarkMenuItem(MenuItem bookmarks) {
bookmarks.setChecked(false);
bookmarks.setIcon(R.drawable.ic_bookmark_outline_white);
}
private void removeBookmark(DataPersister persister, Story story) {
persister.removeBookmark(story);
showRemovedBookmarkSnackbar(persister, story);
}
private void addBookmark(DataPersister persister, Story story) {
persister.addBookmark(story);
showAddedBookmarkSnackbar(persister, story);
}
private void showAddedBookmarkSnackbar(final DataPersister persister, final Story story) {
snackbarView.showSnackBar(getResources().getText(R.string.feed_snackbar_added_bookmark))
.withBackgroundColor(R.color.black, croutonBackgroundAlpha)
.withAnimationDuration(croutonAnimationDuration)
.withUndoClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Inject.usageAnalytics().trackBookmarkEvent(getString(R.string.analytics_event_remove_bookmark_story),
getStory());
snackbarView.hideCrouton();
removeBookmark(persister, story);
invalidateOptionsMenu();
}
})
.animating();
}
private void showRemovedBookmarkSnackbar(final DataPersister persister, final Story story) {
snackbarView.showSnackBar(getResources().getText(R.string.feed_snackbar_removed_bookmark))
.withBackgroundColor(R.color.black, croutonBackgroundAlpha)
.withAnimationDuration(croutonAnimationDuration)
.withUndoClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
snackbarView.hideCrouton();
addBookmark(persister, story);
invalidateOptionsMenu();
}
})
.animating();
}
private Intent createShareArticleIntent() {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, getStory().getUrl());
return shareIntent;
}
private class HackerNewsWebClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
String javascript = "javascript:document.getElementsByName('viewport')[0].setAttribute('content', 'initial-scale=1.0,maximum-scale=10.0');";
view.loadUrl(javascript);
}
}
}