package com.airplayer.fragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import com.airplayer.R;
import com.airplayer.activity.AirMainActivity;
import com.airplayer.model.Song;
import com.airplayer.service.PlayMusicService;
import com.airplayer.util.BitmapUtils;
import com.airplayer.util.QueryUtils;
import com.airplayer.util.StringUtils;
/**
* Created by ZiyiTsang on 15/6/10.
*/
public class PlayMusicFragment extends Fragment implements View.OnClickListener{
public static final String TAG = "PlayMusicFragment";
public static final int HANDLE_SEEK_BAR_PROGRESS = 0;
public static final int HANDLE_TIMER = 1;
private PlayMusicService.PlayerControlBinder mBinder;
private Song mSong;
// head action bar section
private Toolbar mTopToolBar;
public Toolbar getSlidingUpPanelTopBar() {
return mTopToolBar;
}
private ImageView mTitleImageView;
private TextView mTitleTextView;
private TextView mArtistTextView;
// center contain section
private TextView mPlayingTimeTextView;
private TextView mDurationTextView;
private ImageView mCenterAlbumArt;
// bottom control bar section
private SeekBar mSeekBar;
private ImageView mSwitchPlayMode;
private ImageView mPreviousButton;
private ImageView mPlayAndPauseButton;
private ImageView mNextButton;
private ImageView mShuffleList;
// control values
// control the play list button actions
private boolean isPlayListShow = false;
public boolean isPlayListShow() {
return isPlayListShow;
}
public void setIsPlayListShow(boolean isPlayListShow) {
this.isPlayListShow = isPlayListShow;
}
// control shuffle button actions and display
private boolean shuffle = false;
// control loop button action and display
private int mLoopMode = 0;
// receiver
private GetSongReceiver receiver;
// handle msg about seek bar and play timer
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case HANDLE_SEEK_BAR_PROGRESS:
mSeekBar.setProgress(Math.round((float) msg.obj));
break;
case HANDLE_TIMER:
mPlayingTimeTextView.setText(StringUtils.getFormatTime(Math.round((float) msg.obj)));
default:
break;
}
}
};
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinder = ((AirMainActivity) getActivity()).getPlayerControlBinder();
mSong = mBinder.getSongPlaying();
receiver = new GetSongReceiver();
IntentFilter filter = new IntentFilter(PlayMusicService.PLAY_STATE_CHANGE);
getActivity().registerReceiver(receiver, filter);
new Thread(new Runnable() {
@Override
public void run() {
int count = 0;
while (true) {
if (mBinder.isPlaying()) {
if (!mBinder.isPause()) {
Message seekBarMsg = new Message();
seekBarMsg.what = HANDLE_SEEK_BAR_PROGRESS;
seekBarMsg.obj = mBinder.getProgress() * 1000;
handler.sendMessage(seekBarMsg);
count+= 1000;
if (count % 1000 == 0) {
Message timerMsg = new Message();
timerMsg.what = HANDLE_TIMER;
timerMsg.obj = mBinder.getProgress() * mBinder.getSongPlaying().getDuration();
handler.sendMessage(timerMsg);
}
}
sleepThread(100);
}
}
}
private void sleepThread(int ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
Log.e(TAG, "Fail to sleep thread " + e);
}
}
}).start();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_sliding_up_panel, container, false);
// head tool bar section
mTopToolBar = (Toolbar) rootView.findViewById(R.id.sliding_layout_top_tool_bar);
if (mBinder.isPause()) {
mTopToolBar.inflateMenu(R.menu.menu_sliding_panel_down_play_menu);
} else {
mTopToolBar.inflateMenu(R.menu.menu_sliding_panel_down_pause_menu);
}
mTopToolBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()) {
case R.id.action_sliding_panel_top_list:
PlayListFragment fragment = new PlayListFragment();
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
if (isPlayListShow) {
getActivity().onBackPressed();
} else {
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.replace(R.id.sliding_panel_inside_fragment_container, fragment).commit();
isPlayListShow = !isPlayListShow;
}
break;
case R.id.action_sliding_panel_top_play:
playButtonAction();
mTopToolBar.getMenu().clear();
mTopToolBar.inflateMenu(R.menu.menu_sliding_panel_down_pause_menu);
break;
case R.id.action_sliding_panel_top_pause:
playButtonAction();
mTopToolBar.getMenu().clear();
mTopToolBar.inflateMenu(R.menu.menu_sliding_panel_down_play_menu);
}
return false;
}
});
mTitleImageView = (ImageView) rootView.findViewById(R.id.sliding_layout_title_image);
mTitleTextView = (TextView) rootView.findViewById(R.id.sliding_layout_title_song_title);
mArtistTextView = (TextView) rootView.findViewById(R.id.sliding_layout_title_artist_name);
// center contain section
mCenterAlbumArt = (ImageView) rootView.findViewById(R.id.sliding_panel_center_album_art);
mPlayingTimeTextView = (TextView) rootView.findViewById(R.id.sliding_layout_time_progress);
mDurationTextView = (TextView) rootView.findViewById(R.id.sliding_layout_duration);
// foot player control section
mSeekBar = (SeekBar) rootView.findViewById(R.id.sliding_layout_bottom_seek_bar);
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
int maxProgress = seekBar.getMax();
double percentOfBar = ((double) progress) / ((double) maxProgress);
Log.d(TAG, progress + " / " + maxProgress + " = " + percentOfBar);
mBinder.setProgress(percentOfBar);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
mSwitchPlayMode = (ImageView) rootView.findViewById(R.id.sliding_layout_switch_mode);
mSwitchPlayMode.setOnClickListener(this);
mPreviousButton = (ImageView) rootView.findViewById(R.id.sliding_layout_previous_button);
mPreviousButton.setOnClickListener(this);
mPlayAndPauseButton = (ImageView) rootView.findViewById(R.id.sliding_layout_play_and_pause_button);
mPlayAndPauseButton.setOnClickListener(this);
mNextButton = (ImageView) rootView.findViewById(R.id.sliding_layout_next_button);
mNextButton.setOnClickListener(this);
mShuffleList = (ImageView) rootView.findViewById(R.id.sliding_layout_shuffle_play);
mShuffleList.setOnClickListener(this);
if (mBinder.isPlaying()) {
updateUI();
}
return rootView;
}
@Override
public void onDestroy() {
getActivity().unregisterReceiver(receiver);
super.onDestroy();
}
public class GetSongReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
mSong = mBinder.getSongPlaying();
updateUI();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.sliding_layout_switch_mode:
switchLoopMode();
mBinder.setPlayMode(mLoopMode);
if (mLoopMode == PlayMusicService.SINGLE_SONG_LOOP_MODE) {
mSwitchPlayMode.setImageResource(R.drawable.ic_repeat_one);
} else if (mLoopMode == PlayMusicService.LOOP_LIST_MODE) {
mSwitchPlayMode.setImageResource(R.drawable.ic_repeat_on);
} else {
mSwitchPlayMode.setImageResource(R.drawable.ic_repeat_off);
}
break;
case R.id.sliding_layout_previous_button:
mBinder.previousMusic();
break;
case R.id.sliding_layout_play_and_pause_button:
playButtonAction();
break;
case R.id.sliding_layout_next_button:
mBinder.nextMusic();
break;
case R.id.sliding_layout_shuffle_play:
shuffle = !shuffle;
mBinder.setShuffle(shuffle);
mShuffleList.setImageResource(shuffle ?
R.drawable.ic_shuffle_on : R.drawable.ic_shuffle_off);
break;
}
}
private void updateUI() {
//setup images
new LoadBitmapTask().execute();
// head tool bar section
mTitleTextView.setText(mSong.getTitle());
mArtistTextView.setText(mSong.getAlbum().getArtist().getName());
// background and center image section
mDurationTextView.setText(StringUtils.getFormatTime(mSong.getDuration()));
// foot player control section
if (mBinder.getPlayMode() == PlayMusicService.SINGLE_SONG_LOOP_MODE) {
mSwitchPlayMode.setImageResource(R.drawable.ic_repeat_one);
} else if (mBinder.getPlayMode() == PlayMusicService.LOOP_LIST_MODE) {
mSwitchPlayMode.setImageResource(R.drawable.ic_repeat_on);
} else {
mSwitchPlayMode.setImageResource(R.drawable.ic_repeat_off);
}
mPlayAndPauseButton.setImageResource(mBinder.isPause() ?
R.drawable.ic_play_circle_filled : R.drawable.ic_pause_circle_filled);
mShuffleList.setImageResource((mBinder.isShuffle() ?
R.drawable.ic_shuffle_on : R.drawable.ic_shuffle_off));
}
private void playButtonAction() {
if (mBinder.isPause()) {
mBinder.resumeMusic();
mPlayAndPauseButton.setImageResource(R.drawable.ic_pause_circle_filled);
} else {
mBinder.pauseMusic();
mPlayAndPauseButton.setImageResource(R.drawable.ic_play_circle_filled);
}
}
private void switchLoopMode() {
mLoopMode++;
if (mLoopMode > 2) {
mLoopMode = 0;
}
}
private class LoadBitmapTask extends AsyncTask<Void, Void, Bitmap> {
@Override
protected Bitmap doInBackground(Void... params) {
return BitmapUtils.getWindowWideBitmap(PlayMusicFragment.this.getActivity(), mSong.getAlbum().getAlbumArtPath(), true);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
mTitleImageView.setImageBitmap(bitmap);
mCenterAlbumArt.setImageBitmap(bitmap);
}
}
}