package com.kitty.poclient.fragment; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.fourthline.cling.model.ModelUtil; import org.fourthline.cling.model.action.ActionInvocation; import org.fourthline.cling.model.message.UpnpResponse; import org.fourthline.cling.model.types.UnsignedIntegerFourBytes; import org.fourthline.cling.support.avtransport.callback.GetPositionInfo; import org.fourthline.cling.support.avtransport.callback.Pause; import org.fourthline.cling.support.avtransport.callback.Play; import org.fourthline.cling.support.avtransport.callback.Seek; import org.fourthline.cling.support.avtransport.callback.SetAVTransportURI; import org.fourthline.cling.support.model.PositionInfo; import org.fourthline.cling.support.renderingcontrol.callback.GetMute; import org.fourthline.cling.support.renderingcontrol.callback.GetVolume; import org.fourthline.cling.support.renderingcontrol.callback.SetMute; import org.fourthline.cling.support.renderingcontrol.callback.SetVolume; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import com.kitty.poclient.R; import com.kitty.poclient.activity.MainActivity; import com.kitty.poclient.adapter.MusicListAdapter; import com.kitty.poclient.common.BroadcastManager; import com.kitty.poclient.common.Constant; import com.kitty.poclient.common.UIHelper; import com.kitty.poclient.common.UpnpApp; import com.kitty.poclient.common.WatchDog; import com.kitty.poclient.data.VirtualData; import com.kitty.poclient.domain.Music; import com.kitty.poclient.fragment.usb.ExternalDeviceFragment; import com.kitty.poclient.interfaces.OnCurrentPlayingInfoChangedListener; import com.kitty.poclient.test.MusicPlayService; import com.kitty.poclient.upnp.Cacher; import com.kitty.poclient.upnp.Player; import com.kitty.poclient.util.BitmapUtil; import com.kitty.poclient.util.DateTimeFormatUtil; import com.kitty.poclient.util.MediaUtil; import com.kitty.poclient.util.PowerfulBigMan; import com.kitty.poclient.util.URIParams; import com.kitty.poclient.util.LoadImageAysnc.ImageCallBack; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; public class PlayerFragment extends Fragment implements OnCurrentPlayingInfoChangedListener { private final String TAG = PlayerFragment.class.getSimpleName() + ":";// UpnpApp.mainHandler private View view; // 控件 private FrameLayout flControlArea; private FrameLayout flSbProgress;// flSbProgress.setVisibility(View.GONE) private Button btnPlayPause, btnNext, btnPrev;// btnPrev.seton private ImageButton btnBack; private ImageButton btnPlaylist; private Button btnPlaymode; private Button btnVolumn; private TextView tvCurrentTime, tvTotalTime; private TextView tvMusicName; private TextView tvArtistName; private SeekBar sbProgress, sbVolumn; private ImageView ivPicPlaying; private ListView lvPlaylist; // 播放状态 private String currentState = "STOPPED"; private String formerState = "STOPPED"; public static final String PLAYING = "PLAYING"; public static final String PAUSED = "PAUSED"; public static final String STOPPED = "STOPPED"; // 播放模式 public static final int MODE_ORDER = 1; public static final int MODE_SHUFFLE = 2; public static final int MODE_SINGLE = 3; public static final int MODE_ALL = 4; public static final int SWITCH_TO_PLAY_PROGRESS = 6; private MusicListAdapter adapter; private MainActivity mainActivity; // 加载图片 private ImageLoader loader; private DisplayImageOptions options; // 进度相关 private String duration = "00:00"; private int totalSeconds = 0; private long startMillis = 0L; private int stopTrackingProgress = 0; private Runnable currentPlayingProgressRunnable = null; private Runnable progressRunnable = new Runnable() { @Override public void run() { while (System.currentTimeMillis() - startMillis < totalSeconds * 1000 && PLAYING.equals(currentState)) { int progress = DateTimeFormatUtil.getPlayingProgress(System.currentTimeMillis() - startMillis, totalSeconds * 1000L); String elapsedTimeStr = DateTimeFormatUtil.parseMills2Time(System.currentTimeMillis() - startMillis); Message msg = handler.obtainMessage(MSG_UPDATE_PLAYING_PROGRESS); msg.arg1 = progress; msg.obj = elapsedTimeStr; handler.sendMessage(msg); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("elapsedMills=" + (System.currentTimeMillis() - startMillis)); System.out.println("currentState=" + currentState); if (!PAUSED.equals(currentState)) { handler.sendEmptyMessage(MSG_SET_STATE_STOPPED); } } }; // 声音 private boolean llVolumnShown = false; private LinearLayout llVolumn; // handler private final int MSG_INIT_PLAYING_INFO = 10; private final int MSG_UPDATE_PLAYING_PROGRESS = 11; private final int MSG_SET_STATE_STOPPED = 12; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case MSG_INIT_PLAYING_INFO: initPlayingInfo(); setStatePlaying(true); break; case MSG_UPDATE_PLAYING_PROGRESS: sbProgress.setProgress(msg.arg1); tvCurrentTime.setText((String) msg.obj); break; case MSG_SET_STATE_STOPPED: setStateStopped(); break; } } }; protected void checkIfCurrentListEmpty() { if (WatchDog.currentListType == 0 || WatchDog.currentListType == -1 || WatchDog.currentList == null || WatchDog.currentList.size() == 0) { setBtnsEnabled(false); clearProgress(); } else { Log.e("BUG901", "WatchDog.currentList.size()=" + WatchDog.currentList.size()); setBtnsEnabled(true); } } private void clearProgress() { sbProgress.setProgress(0); sbProgress.setSecondaryProgress(0); tvTotalTime.setText("00:00"); tvCurrentTime.setText("00:00"); } public PlayerFragment() { initImageLoader(); } public PlayerFragment(MainActivity mainActivity) { this.mainActivity = mainActivity; initImageLoader(); } private void initImageLoader() { loader = ImageLoader.getInstance(); options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.pic).cacheInMemory(true).cacheOnDisc(true).considerExifParams(true).bitmapConfig(Bitmap.Config.RGB_565).build(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e(TAG, "onCreateView()"); WatchDog.cpiListeners.add(this); view = inflater.inflate(R.layout.player, null); initComponents(); initParams(); initListeners(); return view; } private void initParams() { llVolumnShown=false; } private void initListeners() { btnPlayPause.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (currentState.equals(PLAYING)) { pause(); } else { play(); } } }); sbProgress.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { stopTrackingProgress = seekBar.getProgress(); seekTo(stopTrackingProgress * totalSeconds * 1000 / 100); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } }); btnVolumn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showOrHideVolumn(); } }); sbVolumn.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { int pro = seekBar.getProgress(); System.out.println("pro=" + pro); setVolumn(pro); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // System.out.println("newProgress="+progress); } }); } protected void setVolumn(int pro) { if(MusicPlayService.mPlayer!=null){ MusicPlayService.mPlayer.setVolume(pro/100f, pro/100f); } } private void showOrHideVolumn() { if (llVolumnShown == false) { btnVolumn.setBackgroundResource(R.drawable.btn_volumn_hover); llVolumn.setVisibility(View.VISIBLE); flSbProgress.setVisibility(View.GONE); llVolumnShown = true; } else { btnVolumn.setBackgroundResource(R.drawable.btn_volumn); llVolumn.setVisibility(View.GONE); flSbProgress.setVisibility(View.VISIBLE); llVolumnShown = false; } } protected void seekTo(int progressOfMillis) { if (MusicPlayService.mPlayer != null && MusicPlayService.mPlayer.isPlaying()) { startMillis = processStartMillis(); MusicPlayService.mPlayer.seekTo(progressOfMillis); } } private long processStartMillis() { startMillis = System.currentTimeMillis() - stopTrackingProgress * (totalSeconds * 1000) / 100; return startMillis; } protected void play() { MusicPlayService.mPlayer.start(); // 假设已成功 if (PAUSED.equals(currentState)) { setStatePlaying(false); } else if (STOPPED.equals(currentState)) { setStatePlaying(true); } } protected void pause() { MusicPlayService.mPlayer.pause(); // 假设已成功 setStatePaused(); } protected void setStatePlaying(boolean playFromBeginning) { currentState = PLAYING; WatchDog.setCurrentPlayingState(PLAYING); btnPlayPause.setBackgroundDrawable(getActivity().getResources().getDrawable(R.drawable.btn_pause_selector)); totalSeconds = DateTimeFormatUtil.time2IntMillis(duration) / 1000; if (playFromBeginning) { startMillis = System.currentTimeMillis(); } else { System.out.println("sbProgress.getProgress()="+sbProgress.getProgress()); startMillis = System.currentTimeMillis() - sbProgress.getProgress()*(totalSeconds*1000)/100; } System.out.println("totalSeconds=" + totalSeconds); startProgressUpadate(); } protected void setStatePaused() { currentState = PAUSED; WatchDog.setCurrentPlayingState(PAUSED); handler.removeCallbacks(currentPlayingProgressRunnable); btnPlayPause.setBackgroundDrawable(getActivity().getResources().getDrawable(R.drawable.btn_play_selector)); } protected void setStateStopped() { currentState = STOPPED; WatchDog.setCurrentPlayingState(STOPPED); startMillis = 0L; stopTrackingProgress = 0; sbProgress.setProgress(0); tvCurrentTime.setText("00:00"); btnPlayPause.setBackgroundDrawable(getActivity().getResources().getDrawable(R.drawable.btn_play_selector)); } @Override public void onDetach() { super.onDetach(); } private void initComponents() { flControlArea = (FrameLayout) view.findViewById(R.id.fl_control_area); flSbProgress = (FrameLayout) view.findViewById(R.id.fl_sb_progress); ivPicPlaying = (ImageView) view.findViewById(R.id.iv_pic_playing); lvPlaylist = (ListView) view.findViewById(R.id.lv_playlist); btnPlayPause = (Button) view.findViewById(R.id.btn_play_pause); btnPrev = (Button) view.findViewById(R.id.btn_prev); btnNext = (Button) view.findViewById(R.id.btn_next); btnBack = (ImageButton) view.findViewById(R.id.btn_back); btnPlaylist = (ImageButton) view.findViewById(R.id.btn_playlist); btnPlaymode = (Button) view.findViewById(R.id.btn_playmode); btnVolumn = (Button) view.findViewById(R.id.btn_volumn); tvCurrentTime = (TextView) view.findViewById(R.id.tv_current_time); tvTotalTime = (TextView) view.findViewById(R.id.tv_total_time); tvMusicName = (TextView) view.findViewById(R.id.tv_music_name); tvArtistName = (TextView) view.findViewById(R.id.tv_artist_name); sbProgress = (SeekBar) view.findViewById(R.id.sb_progress); sbVolumn = (SeekBar) view.findViewById(R.id.sb_volumn); llVolumn = (LinearLayout) view.findViewById(R.id.ll_volumn); } private void setBtnsEnabled(boolean b) { btnPlaylist.setEnabled(b); btnPlayPause.setEnabled(b); btnNext.setEnabled(b); btnPrev.setEnabled(b); sbProgress.setEnabled(b); } protected void clearPlayingProgress() { sbProgress.setProgress(0); tvCurrentTime.setText("00:00"); tvTotalTime.setText("00:00"); } @Override public void onResume() { Log.e(TAG, "onResume()"); super.onResume(); } private void initPlayingInfo() { Log.e(TAG, "WatchDog.currentPlayingInfo=" + WatchDog.getCurrentPlayingInfo()); if (WatchDog.getCurrentPlayingInfo() != null) { duration = WatchDog.getCurrentPlayingInfo().getDuration().substring(3); tvMusicName.setText(WatchDog.getCurrentPlayingInfo().getName()); tvArtistName.setText(WatchDog.getCurrentPlayingInfo().getArtist()); tvTotalTime.setText(WatchDog.getCurrentPlayingInfo().getDuration().substring(3)); // 显示专辑图片 String imgUrl = WatchDog.getCurrentPlayingInfo().getImgUrl(); System.out.println("imgUrl=" + imgUrl); loader.displayImage(imgUrl, ivPicPlaying, options); } } private void startProgressUpadate() { currentPlayingProgressRunnable = progressRunnable; new Thread(currentPlayingProgressRunnable).start(); } @Override public void onCurrentPlayingInfoChanged() { handler.sendEmptyMessage(MSG_INIT_PLAYING_INFO); } }