package com.gapp.gvoa.ui; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.gapp.gvoa.R; import com.gapp.gvoa.datatype.RssFeed; import com.gapp.gvoa.datatype.RssItem; import com.gapp.gvoa.db.DbRssItem; import com.gapp.gvoa.parser.FeedParser; import com.gapp.gvoa.util.MsgCenter; import com.gapp.gvoa.util.MsgCenter.GSubscriber; import com.gapp.gvoa.util.NetworkUtil; public class RssItemListActivity extends Activity implements OnItemClickListener, GSubscriber { private static final int MSG_SUCCESS = 0; private static final int MSG_FAILURE = 1; public static final String TAG = "RssItemListActivity"; private List<RssItem> rssItemList = null; private RssFeed rssFeed = null; private ListView itemListView= null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MsgCenter.instance().register(this); setContentView(R.layout.rss_item_list); rssFeed = getIntent().getParcelableExtra(RssFeed.class.getName()); TextView titleView =(TextView) findViewById(R.id.rss_list_title); titleView.setText(rssFeed.getTitle()); //get item from db rssItemList = DbRssItem.getAllItems(rssFeed.getId()); itemListView=(ListView)findViewById(android.R.id.list); this.refreshList(); this.addListenerOnButton(); } void refreshList() { ItemListAdapter adapter = new ItemListAdapter(this, rssItemList); itemListView.setAdapter(adapter); itemListView.setClickable(true); itemListView.setOnItemClickListener(this); } private Thread mThread; private Handler mHandler = new Handler() { public void handleMessage (Message msg) {//姝ゆ柟娉曞湪ui绾跨▼杩愯 switch(msg.what) { case MSG_SUCCESS: //reload date from db Log.i(TAG, "Reload rss from db now"); rssItemList = DbRssItem.getAllItems(rssFeed.getId()); refreshList(); mThread = null; break; case MSG_FAILURE: Toast.makeText(getApplication(), getApplication().getString(R.string.get_rss_failure), Toast.LENGTH_LONG).show(); mThread = null; break; } } }; @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Log.i(TAG, "item clicked! [" + rssItemList.get(arg2).getTitle() + "]"); //get the content from feed and parse the content RssItem rssItem = rssItemList.get(arg2); Intent itemintent = new Intent(this, ShowDetailActivity.class); Bundle bundle = new Bundle(); bundle.putParcelable(RssItem.class.getName(), rssItem); itemintent.putExtras(bundle); startActivity(itemintent); } public void addListenerOnButton() { ImageButton imageButton = (ImageButton) findViewById(R.id.refresh); imageButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Log.i(TAG, "refresh clicked"); if(mThread == null) { mThread = new Thread(runnable); mThread.start(); } else { Toast.makeText(getApplication(), getApplication().getString(R.string.thread_started), Toast.LENGTH_LONG).show(); } } }); } Runnable runnable = new Runnable() { @Override public void run() { try { HttpClient httpclient = new DefaultHttpClient(); HttpGet request = new HttpGet(rssFeed.getFeedUrl()); HttpResponse response = httpclient.execute(request); if(response.getStatusLine().getStatusCode() == 200){ HttpEntity entity = response.getEntity(); if (entity != null) { InputStream inputStream = entity.getContent(); FeedParser feedFarser = new FeedParser(rssFeed); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); XMLReader xmlreader = parser.getXMLReader(); xmlreader.setContentHandler(feedFarser); Reader reader = new InputStreamReader(inputStream,"UTF-8"); InputSource is = new InputSource(reader); is.setEncoding("UTF-8"); xmlreader.parse(is); Log.i(TAG, "end parse"); List<RssItem> latestList = feedFarser.getRssFeed().getItemList(); for(RssItem item : latestList) { boolean bExist = false; for(RssItem oldItem: rssItemList){ if(item.getLink().equals(oldItem.getLink())){ bExist = true; Log.i(TAG,"Already in DB:"+item.getTitle()); break; } } if(!bExist) { if(NetworkUtil.isReachable(item.getLink())) { DbRssItem.addRssItem(item); } else{ Log.w(TAG,"Not reachable:" +item.getLink()); } } } } } } catch (Exception e) { Log.e(TAG, "Connect or parse Error", e); mHandler.obtainMessage(MSG_FAILURE).sendToTarget(); return; } mHandler.obtainMessage(MSG_SUCCESS).sendToTarget(); } }; @Override public void onMessage(final Message msg) { Log.i(TAG, "Get registered message from MsgCenter"); this.runOnUiThread(new Runnable() { public void run() { handleMsg(msg); } }); } private void handleMsg(Message msg){ RssItem updatedItem = (RssItem) msg.obj; int itemIndex = 0; boolean bFound = false; Log.i(TAG, ""+updatedItem); for(RssItem item : rssItemList){ Log.i(TAG, ""+item); if(item.getId()==updatedItem.getId()){ item.updateValues(updatedItem); bFound=true; break; } itemIndex++; } if (!bFound){ Log.i(TAG,"cannt find updatedItem"); return; } int start = itemListView.getFirstVisiblePosition(); int end = itemListView.getLastVisiblePosition(); Log.i(TAG,"start="+start+",end="+end+",itemIndex="+itemIndex); if(start<=itemIndex && itemIndex<=end){ View view = itemListView.getChildAt(itemIndex-start); itemListView.getAdapter().getView(itemIndex, view, itemListView); } } @Override protected void onDestroy() { MsgCenter.instance().unRegister(this); super.onDestroy(); Log.i(TAG, "onDestroy"); } }