package com.gapp.gvoa.ui; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.net.ConnectivityManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.text.Html; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import com.gapp.gvoa.R; import com.gapp.gvoa.datatype.RssItem; import com.gapp.gvoa.db.DbRssItem; import com.gapp.gvoa.parser.ItemHtmlParser; import com.gapp.gvoa.util.GPreference; import com.gapp.gvoa.util.GvoaUtil; import com.gapp.gvoa.util.MsgCenter; import com.gapp.gvoa.util.MsgCenter.GSubscriber; import com.gapp.gvoa.util.NetworkUtil; public class ShowDetailActivity extends Activity implements GSubscriber { private static final String TAG = "ShowDetailActivity"; public static final int MSG_SUCCESS = 0; public static final int MSG_FAILURE = 1; public static final int MSG_MP3_PROGRESS = 2; public static final int MSG_MP3 = 3; private static final int EXTRA_SHOW_NONE=0; private static final int EXTRA_SHOW_DOWNLOADING=1; private static final int EXTRA_SHOW_PLAYCONTROL=2; private RelativeLayout mPlayView=null; private View mDownloadView=null; private ImageButton buttonPlayStop; private SeekBar seekBar; private ProgressBar mProgressBar; private MediaPlayer mediaPlayer=null; private RssItem rssItem; private Thread mThread; public void onCreate(Bundle icicle) { super.onCreate(icicle); MsgCenter.instance().register(this); setContentView(R.layout.rss_detail); rssItem = getIntent().getParcelableExtra(RssItem.class.getName()); Log.i(TAG, "load rssitem url="+rssItem.getLink()); TextView title= (TextView) findViewById(R.id.title); title.setText(Html.fromHtml(rssItem.getTitle())); if(rssItem.getStatus()<RssItem.E_PARSE_TXT_OK) { if(mThread == null) { mThread = new Thread(runnable); mThread.start(); } else { Toast.makeText(getApplication(), getApplication().getString(R.string.thread_started), Toast.LENGTH_LONG).show(); } } else { TextView detail= (TextView) findViewById(R.id.detail); detail.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, GPreference.getPreferredTextSize()); detail.setText(Html.fromHtml(rssItem.getFullText())); if(rssItem.getStatus()<RssItem.E_DOWN_MP3_OK||!GvoaUtil.isFileExists(rssItem.getLocalmp3())) { if(null==rssItem.getMp3url()) { Toast.makeText(getApplication(), getApplication().getString(R.string.no_mp3_content), Toast.LENGTH_LONG).show(); }else { checkAndDownMp3(); } } } if(null==rssItem.getMp3url()) { showExtra(EXTRA_SHOW_NONE); } else if(null==rssItem.getLocalmp3()||!GvoaUtil.isFileExists(rssItem.getLocalmp3())) { Log.i(TAG, "localmp3 is null"); showExtra(EXTRA_SHOW_DOWNLOADING); } else { showExtra(EXTRA_SHOW_PLAYCONTROL); initMp3Player(); } } void showExtra(int showType) { LinearLayout detail_linear_layout_view = (LinearLayout) findViewById(R.id.detail_linear_layout); switch( showType) { case EXTRA_SHOW_NONE: break; case EXTRA_SHOW_DOWNLOADING: if(null!=mPlayView) { detail_linear_layout_view.removeView(mPlayView); mPlayView.setVisibility(View.GONE); } mDownloadView = (View) LayoutInflater.from(this).inflate(R.layout.download_mp3, null); detail_linear_layout_view.addView(mDownloadView); mProgressBar = (ProgressBar) findViewById(R.id.downprogressloadbar); break; case EXTRA_SHOW_PLAYCONTROL: if(null!=mDownloadView) { Log.i(TAG,"remove mDownloadView"); detail_linear_layout_view.removeView(mDownloadView); mDownloadView.setVisibility(View.GONE); } mPlayView =(RelativeLayout) LayoutInflater.from(this).inflate(R.layout.audio_play, null); detail_linear_layout_view.addView(mPlayView); buttonPlayStop = (ImageButton) findViewById(R.id.play_pause); seekBar = (SeekBar) findViewById(R.id.SeekBar01); break; } } private void initMp3Player() { try { mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(rssItem.getLocalmp3()); mediaPlayer.prepare(); buttonPlayStop.setOnClickListener(new OnClickListener() {@Override public void onClick(View v) {buttonClick();}}); seekBar.setMax(mediaPlayer.getDuration()); seekBar.setOnTouchListener(new OnTouchListener() {@Override public boolean onTouch(View v, MotionEvent event) { seekChange(v); return false; } }); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // This is event handler thumb moving event private void seekChange(View v){ if(mediaPlayer.isPlaying()){ SeekBar sb = (SeekBar)v; mediaPlayer.seekTo(sb.getProgress()); } } // This is event handler for buttonClick event private void buttonClick(){ if (mediaPlayer.isPlaying()) { buttonPlayStop.setImageResource(R.drawable.ic_media_play); mediaPlayer.pause(); } else { buttonPlayStop.setImageResource(R.drawable.ic_media_pause); try{ mediaPlayer.start(); startPlayProgressUpdater(); }catch (IllegalStateException e) { mediaPlayer.pause(); } } } public void startPlayProgressUpdater() { seekBar.setProgress(mediaPlayer.getCurrentPosition()); if (mediaPlayer.isPlaying()) { Runnable notification = new Runnable() { public void run() { startPlayProgressUpdater(); } }; mHandler.postDelayed(notification,1000); }else{ mediaPlayer.pause(); buttonPlayStop.setImageResource(R.drawable.ic_media_play); } } public void onMessage(final Message msg){ Log.i(TAG, "Get registered message from MsgCenter"); this.runOnUiThread(new Runnable() { public void run() { mHandler.handleMessage(msg); } }); } private Handler mHandler = new Handler() { public void handleMessage (Message msg) { switch(msg.what) { case MSG_SUCCESS: //reload date from db Log.i(TAG, "Parse rssItem SUCCESS"); TextView detail= (TextView) findViewById(R.id.detail); detail.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, GPreference.getPreferredTextSize()); detail.setText(Html.fromHtml(rssItem.getFullText())); DbRssItem.updateItem(rssItem); if(null!=rssItem.getMp3url()) { showExtra(EXTRA_SHOW_DOWNLOADING); } checkAndDownMp3(); break; case MSG_FAILURE: Toast.makeText(getApplication(), getApplication().getString(R.string.get_rss_failure), Toast.LENGTH_LONG).show(); mThread = null; break; case MSG_MP3_PROGRESS: Integer downloadedSize =msg.arg1; Integer totalSize =msg.arg2; RssItem item = (RssItem) msg.obj; if(item == rssItem && null!=mProgressBar) { mProgressBar.setProgress(downloadedSize*100/totalSize); } break; case MSG_MP3: RssItem downItem = (RssItem) msg.obj; if (rssItem!=downItem) { Log.i(TAG, "downloaded item is not the same as current one"); break; } if(rssItem.getStatus()==RssItem.E_DOWN_MP3_OK) { Toast.makeText(getApplication(), getApplication().getString(R.string.get_mp3_success), Toast.LENGTH_LONG).show(); showExtra(EXTRA_SHOW_PLAYCONTROL); initMp3Player(); } else { Toast.makeText(getApplication(), getApplication().getString(R.string.get_mp3_failure), Toast.LENGTH_LONG).show(); } mThread = null; break; } } }; private void checkAndDownMp3() { int netStatus = GPreference.getNetWork(); if(0xFFFF==netStatus) { Toast.makeText(getApplication(), getApplication().getString(R.string.no_network_connected), Toast.LENGTH_LONG).show(); return; } //WIFI_ONLY, WIFI_AND_3G, NONE String mp3Pref = GPreference.downloadMp3Pref(); if(netStatus == ConnectivityManager.TYPE_WIFI) { if(mp3Pref.equals("WIFI_ONLY")||mp3Pref.equals("WIFI_AND_3G")) { mThread = new Thread(runnableMp3); mThread.start(); } else { Toast.makeText(getApplication(), getApplication().getString(R.string.audio_is_not_downloaded), Toast.LENGTH_LONG).show(); } } else { if(mp3Pref.equals("WIFI_AND_3G")) { mThread = new Thread(runnableMp3); mThread.start(); } else { Toast.makeText(getApplication(), getApplication().getString(R.string.audio_is_not_downloaded), Toast.LENGTH_LONG).show(); } } } Runnable runnable = new Runnable() { @Override public void run() { try { ItemHtmlParser.parseItemDetail(rssItem); } catch (Exception e) { Log.e(TAG, "Connect or parse Error", e); rssItem.setStatus(RssItem.E_PARSE_TXT_FAIL); mHandler.obtainMessage(MSG_FAILURE).sendToTarget(); return; } mHandler.obtainMessage(MSG_SUCCESS).sendToTarget(); } }; Runnable runnableMp3 = new Runnable() { @Override public void run() { Log.i(TAG, "Start download mp3"); NetworkUtil.downloadMp3 (rssItem, mHandler); } }; @Override protected void onStart() { super.onStart(); Log.i(TAG, "onStart"); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "onResume"); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "onPause"); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop"); } @Override protected void onDestroy() { if(mediaPlayer!=null && mediaPlayer.isPlaying()) { mediaPlayer.stop(); } MsgCenter.instance().unRegister(this); super.onDestroy(); Log.i(TAG, "onDestroy"); } }