package cn.yo2.aquarium.example.viewpager;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Toast;
import nl.matshofman.saxrssreader.RssFeed;
import nl.matshofman.saxrssreader.RssItem;
import nl.matshofman.saxrssreader.RssReader;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class ViewPagerDemoActivity extends Activity implements OnPageChangeListener {
private static final String TAG = ViewPagerDemoActivity.class.getSimpleName();
private ViewPager mViewPager;
private TextView mTitle;
private RssFeed mFeed;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mViewPager = (ViewPager) findViewById(R.id.view_pager);
mViewPager.setOnPageChangeListener(this);
mTitle = (TextView) findViewById(R.id.title);
new LoadFeedTask().execute("http://tech2ipo.com/feed");
// new LoadFeedTask().execute("http://www.ifanr.com/feed");
// new LoadFeedTask().execute("http://feed.cnblogs.com/blog/sitehome/rss");
// new LoadFeedTask().execute("http://www.cnbeta.com/backend.php");
// new LoadFeedTask().execute("http://blog.csdn.net/rss.html?type=Home&channel=");
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int arg0) {
if (mFeed != null) {
ArrayList<RssItem> items = mFeed.getRssItems();
if (items != null && items.size() > arg0) {
mTitle.setText(items.get(arg0).getTitle());
}
}
}
private class LoadFeedTask extends AsyncTask<String, Void, RssFeed> {
private ProgressDialog mProgressDialog;
@Override
protected RssFeed doInBackground(String... params) {
URL url;
try {
url = new URL(params[0]);
Log.d(TAG, "url - " + url);
return RssReader.read(url);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(RssFeed result) {
if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
if (result != null) {
mFeed = result;
mViewPager.setAdapter(new SimpleViewPagerAdapter(ViewPagerDemoActivity.this, result));
mViewPager.setCurrentItem(0);
} else {
Toast.makeText(ViewPagerDemoActivity.this, "failed to load feed", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onPreExecute() {
mProgressDialog = ProgressDialog.show(ViewPagerDemoActivity.this, "Loading...", "Loading feed");
}
}
private static class HtmlBuilder {
private static final String CSS = "<head><style type=\"text/css\">body {max-width: 100%}\nimg {max-width: 100%; height: auto;}\npre {white-space: pre-wrap;}</style></head>";
private static final String HTML_START = "<html>";
private static final String HTML_END = "</html>";
private static final String BODY_START = "<body>";
private static final String BODY_END = "</body>";
public static final String buildHtml(String content) {
StringBuilder builder = new StringBuilder();
builder.append(HTML_START);
builder.append(CSS);
builder.append(BODY_START);
builder.append(content);
builder.append(BODY_END);
builder.append(HTML_END);
return builder.toString();
}
}
private static class SimpleViewPagerAdapter extends PagerAdapter {
private Queue<WebView> mWebViews;
private RssFeed mFeed;
private Context mContext;
private SimpleViewPagerAdapter(Context context, RssFeed feed) {
mContext = context;
mWebViews = new LinkedList<WebView>();
for (int i = 0; i < 4; i++) {
WebView webView = new WebView(context);
WebSettings webSettings = webView.getSettings();
webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
mWebViews.add(webView);
}
mFeed = feed;
}
@Override
public int getCount() {
return mFeed.getRssItems().size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Log.d(TAG, "instantiateItem position = " + position);
RssItem item = mFeed.getRssItems().get(position);
WebView webView = mWebViews.remove();
final String html = HtmlBuilder.buildHtml(item.getContent());
Log.d(TAG, html);
webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", null);
container.addView(webView);
return webView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
Log.d(TAG, "destroyItem position = " + position);
container.removeView((View) object);
mWebViews.add((WebView) object);
}
}
}