package com.todayinfo.ui.activity;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.Header;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.util.Xml;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.jinghua.todayinformation.R;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.todayinfo.model.NewItem;
import com.todayinfo.ui.component.ErrorHintView;
import com.todayinfo.ui.component.ErrorHintView.OperateListener;
import com.todayinfo.utils.AsyncHttpUtil;
/**
* 新闻详情的碎片
*
* @author zhou.ni 2015年4月12日
*/
public class NewsDetailActivity extends SuperActivity implements OnClickListener{
private WebView mWeb;
private TextView title;
private ErrorHintView mErrorHintView;
private NewItem item;
private String PATH = "http://wcf.open.cnblogs.com/news/item/";
public static int VIEW = 1;
/**显示断网**/
public static int VIEW_WIFIFAILUER = 2;
/** 显示加载数据失败 **/
public static int VIEW_LOADFAILURE = 3;
public static int VIEW_LOADING = 4;
private String url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_news_detail);
getWindow().setBackgroundDrawable(null);
initView();
}
/**
* 初始化控件
*/
private void initView() {
RelativeLayout headView = (RelativeLayout) this.findViewById(R.id.head);
RelativeLayout leftBack = (RelativeLayout) headView.findViewById(R.id.back_left);
title = (TextView) headView.findViewById(R.id.head_title);
mWeb = (WebView) this.findViewById(R.id.webview);
mErrorHintView = (ErrorHintView) this.findViewById(R.id.hintView);
LinearLayout top = (LinearLayout) this.findViewById(R.id.toolbar_top);
LinearLayout comment = (LinearLayout) this.findViewById(R.id.toolbar_comment);
LinearLayout save = (LinearLayout) this.findViewById(R.id.toolbar_save);
leftBack.setOnClickListener(this);
top.setOnClickListener(this);
comment.setOnClickListener(this);
save.setOnClickListener(this);
Intent intent = this.getIntent();
item = (NewItem) intent.getSerializableExtra("item");
if ( item!=null ) {
title.setText(item.getTitle());
url = PATH + item.getId();
showLoading(VIEW_LOADING);
loadNewsDetailInfo(url);
}
}
/**
* 加载详情内容
* @param url
*/
private void loadNewsDetailInfo(String url){
AsyncHttpUtil.get(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int code, Header[] headers, byte[] responseBody) {
if ( responseBody!=null && responseBody.length>0 ){
showLoading(VIEW);
ByteArrayInputStream inputStream = new ByteArrayInputStream(responseBody);
String result = parseDetailContentXml(inputStream);
initWebView(result);
} else {
showLoading(VIEW_LOADFAILURE);
}
}
@Override
public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
showLoading(VIEW_WIFIFAILUER);
}
});
}
private String parseDetailContentXml(InputStream in) {
String result = null;
XmlPullParser parser = Xml.newPullParser();
try {
parser.setInput(in, "UTF-8");
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if ("Content".equals(parser.getName())){
result = parser.nextText();
}
break;
case XmlPullParser.TEXT:
break;
case XmlPullParser.END_TAG:
break;
}
event = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 初始化WebView
* @param data
*/
@SuppressLint("SetJavaScriptEnabled")
private void initWebView(String data) {
// 如果访问的页面中有Javascript,则webview必须设置支持Javascript
mWeb.getSettings().setJavaScriptEnabled(true);
mWeb.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
// mWeb.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
// 触摸焦点起作用
mWeb.requestFocus();
// 取消滚动条
mWeb.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
mWeb.setHorizontalScrollBarEnabled(false);//水平不显示
mWeb.setVerticalScrollBarEnabled(false); //垂直不显示
// 设置WevView要显示的网页:
// mWeb.loadUrl(url);
mWeb.loadDataWithBaseURL(null, data,"text/html", "UTF-8", null);
// 设置不可缩放
mWeb.getSettings().setSupportZoom(false);
mWeb.getSettings().setBuiltInZoomControls(false);
mWeb.setWebViewClient(new MyWebViewClient());
mWeb.setWebChromeClient(new WebChromeClient());
// mWeb.addJavascriptInterface(this, "todayinfo");
}
class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!TextUtils.isEmpty(url)) {
Log.d("shouldOverrideUrlLoading", "onPageFinished");
mWeb.loadUrl(url);
}
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
String title = view.getTitle();
if( TextUtils.isEmpty(title) ){
return;
}
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
Log.d("onReceivedError", "onReceivedError");
}
}
/**
* 显示动态加载界面
*
* @param i
*/
private void showLoading(int i){
mErrorHintView.setVisibility(View.GONE);
mWeb.setVisibility(View.GONE);
switch(i){
case 1:
mErrorHintView.hideLoading();
mWeb.setVisibility(View.VISIBLE);
break;
case 2:
mErrorHintView.hideLoading();
mErrorHintView.netError(new OperateListener() {
@Override
public void operate() {
showLoading(VIEW_LOADING);
loadNewsDetailInfo(url);
}
});
break;
case 3:
mErrorHintView.hideLoading();
mErrorHintView.loadFailure(new OperateListener() {
@Override
public void operate() {
showLoading(VIEW_LOADING);
loadNewsDetailInfo(url);
}
});
break;
case 4:
mErrorHintView.loadingData();
break;
}
}
@Override
public void retry() {
}
@Override
public void netError() {
}
@Override
public void pwdError() {
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.back_left:
finish();
break;
case R.id.toolbar_top:
mWeb.scrollTo(0, 0);
break;
case R.id.toolbar_comment:
Intent intent = new Intent(mContext, NewsCommentActivity.class);
intent.putExtra("id", item.getId());
intent.putExtra("title", item.getTitle());
startActivity(intent);
break;
case R.id.toolbar_save:
Intent inte = new Intent(Intent.ACTION_SEND);
inte.setType("image/*");
inte.putExtra(Intent.EXTRA_SUBJECT, "Share");
inte.putExtra(Intent.EXTRA_TEXT, "I would like to share this with you...");
inte.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(Intent.createChooser(inte, item.getTitle()));
break;
default:
break;
}
}
@Override
protected void obtainInfo() {
}
}