package com.philosophicalhacker.philhackernews.ui.storydetail;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.philosophicalhacker.philhackernews.R;
import com.philosophicalhacker.philhackernews.model.Item;
import com.philosophicalhacker.philhackernews.ui.refresh.OnRefreshableViewCreatedListener;
import com.philosophicalhacker.philhackernews.ui.refresh.RefreshStatusListener;
import com.philosophicalhacker.philhackernews.ui.refresh.Refreshable;
import butterknife.Bind;
import butterknife.ButterKnife;
import rx.Observable;
import rx.functions.Action1;
/**
* Shows a webview that points to a link or the html text within the HackerNews story.
*/
public class StoryDetailFragment extends Fragment implements Refreshable {
private static final String ARGS_STORY = "ARGS_STORY";
private RefreshStatusListener mRefreshStatusListener;
private OnRefreshableViewCreatedListener mOnRefreshableViewCreatedListener;
public static StoryDetailFragment newInstance(Item item) {
StoryDetailFragment storyDetailFragment = new StoryDetailFragment();
Bundle args = new Bundle();
args.putParcelable(ARGS_STORY, item);
storyDetailFragment.setArguments(args);
return storyDetailFragment;
}
@Bind(R.id.webView)
WebView mWebView;
//----------------------------------------------------------------------------------
// Lifecycle Methods
//----------------------------------------------------------------------------------
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = inflater.inflate(R.layout.fragment_story_detail, container, false);
ButterKnife.bind(this, view);
Item item = getArguments().getParcelable(ARGS_STORY);
//noinspection ConstantConditions
getActivity().setTitle(item.getTitle());
mWebView.setWebViewClient(new RefreshIndicatorUpdatingWebViewClient(mRefreshStatusListener));
String url = item.getUrl();
if (url != null) {
mWebView.loadUrl(url);
} else {
mWebView.loadData(item.getText(), "text/html", "UTF-8");
}
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mOnRefreshableViewCreatedListener.onRefreshableViewCreated(mWebView);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Inflate the menu; this adds items to the action bar if it is present.
inflater.inflate(R.menu.menu_story_detail, menu);
}
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
//----------------------------------------------------------------------------------
// Refreshable - Interface Methods
//----------------------------------------------------------------------------------
@Override
public void setRefreshStatusListener(RefreshStatusListener refreshStatusListener) {
mRefreshStatusListener = refreshStatusListener;
}
@Override
public void onShouldRefreshObservableCreated(Observable<Void> swipeToRefreshObservable) {
swipeToRefreshObservable.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
mWebView.reload();
}
});
}
@Override
public void setOnRefreshableViewCreatedListener(OnRefreshableViewCreatedListener onRefreshableViewCreatedListener) {
mOnRefreshableViewCreatedListener = onRefreshableViewCreatedListener;
}
//----------------------------------------------------------------------------------
// Nested Inner Class
//----------------------------------------------------------------------------------
private static class RefreshIndicatorUpdatingWebViewClient extends WebViewClient {
public RefreshIndicatorUpdatingWebViewClient(RefreshStatusListener refreshStatusListener) {
mRefreshStatusListener = refreshStatusListener;
}
private RefreshStatusListener mRefreshStatusListener;
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mRefreshStatusListener.onRefreshingStatusChanged(RefreshStatusListener.REFRESHING);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mRefreshStatusListener.onRefreshingStatusChanged(RefreshStatusListener.NOT_REFRESHING);
}
}
}