package io.bxbxbai.zhuanlan.ui;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Base64;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import java.io.IOException;
import java.util.Scanner;
import butterknife.ButterKnife;
import io.bxbxbai.common.StopWatch;
import io.bxbxbai.common.utils.CommonExecutor;
import io.bxbxbai.common.view.CircleImageView;
import io.bxbxbai.zhuanlan.R;
import io.bxbxbai.zhuanlan.bean.Post;
import io.bxbxbai.zhuanlan.core.ZhuanLanApi;
import io.bxbxbai.zhuanlan.core.ZhuanLanWebViewClient;
import io.bxbxbai.zhuanlan.utils.Utils;
import io.bxbxbai.zhuanlan.widget.CommonWebView;
import io.bxbxbai.zhuanlan.widget.ObservableScrollView;
/**
* Created by xuebin on 15/10/15.
*/
public class StoryFragment extends Fragment {
public static final String KEY_POST = "_post";
private ObservableScrollView scrollView;
private CommonWebView mWebView;
private CircleImageView mAvatarView;
private ImageView headerImageView;
private TextView titleView;
private TextView authorTextView;
private Post mPost;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_story, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
mWebView = ButterKnife.findById(view, R.id.web_view);
scrollView = ButterKnife.findById(view, R.id.scroll_view);
titleView = ButterKnife.findById(view, R.id.tv_title);
authorTextView = ButterKnife.findById(view, R.id.tv_author);
headerImageView = ButterKnife.findById(view, R.id.iv_article_header);
mAvatarView = ButterKnife.findById(view, R.id.iv_avatar);
scrollView.addOnScrollListener(new ObservableScrollView.OnScrollListener() {
@Override
public void onScroll(int distance) {
StopWatch.log("dis: " + distance);
}
});
mPost = getArguments().getParcelable(KEY_POST);
if (mPost == null) {
getActivity().finish();
return;
}
mWebView.setWebViewClient(new ZhuanLanWebViewClient(getActivity()));
// mWebView.loadDataWithBaseURL(null, CSS_STYLE + mPost.getContent(), MIME_TYPE, ENCODING_UTF_8, null);
setStory();
}
private void setStory() {
loadHtmlContent(mPost.getContent());
Glide.with(getActivity()).load(mPost.getImageUrl()).crossFade().into(headerImageView);
titleView.setText(mPost.getTitle());
authorTextView.setText(mPost.getAuthorName() + ", " + Utils.convertPublishTime(mPost.getPublishedTime()));
String id = mPost.getAuthor().getAvatar().getId();
String picUrl = Utils.getAuthorAvatarUrl(mPost.getAuthor().getAvatar().getTemplate(),
id, ZhuanLanApi.PIC_SIZE_XS);
Glide.with(getActivity()).load(picUrl).crossFade().into(mAvatarView);
CommonExecutor.MAIN_HANDLER.postDelayed(new Runnable() {
@Override
public void run() {
injectCSS();
}
}, 200);
}
private void loadHtmlContent(String section) {
String content = String.format(readFile("template.txt"), section);
mWebView.loadDataWithBaseURL(null, content, CommonWebView.MIME_TYPE, CommonWebView.ENCODING_UTF_8, null);
}
private void injectCSS() {
String encoded = Base64.encodeToString(readFile("zhuanlan.main.css").getBytes(), Base64.NO_WRAP);
mWebView.loadUrl("javascript:(function() {" +
"var parent = document.getElementsByTagName('head').item(0);" +
"var style = document.createElement('style');" +
"style.type = 'text/css';" +
// Tell the browser to BASE64-decode the string into your script !!!
"style.innerHTML = window.atob('" + encoded + "');" +
"parent.appendChild(style)" +
"})()");
}
private String readFile(String fileName) {
AssetManager manager = getActivity().getAssets();
try {
Scanner scanner = new Scanner(manager.open(fileName));
StringBuilder builder = new StringBuilder();
while (scanner.hasNext()) {
builder.append(scanner.nextLine());
}
return builder.toString();
} catch (IOException e) {
e.printStackTrace();
}
return "";
}
public static StoryFragment newInstance(Post post) {
StoryFragment fragment = new StoryFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(KEY_POST, post);
fragment.setArguments(bundle);
return fragment;
}
}