package me.wcy.music.activity;
import android.content.ComponentName;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import me.wcy.music.R;
import me.wcy.music.adapter.FragmentAdapter;
import me.wcy.music.application.AppCache;
import me.wcy.music.constants.Extras;
import me.wcy.music.executor.NaviMenuExecutor;
import me.wcy.music.executor.WeatherExecutor;
import me.wcy.music.fragment.LocalMusicFragment;
import me.wcy.music.fragment.PlayFragment;
import me.wcy.music.fragment.SongListFragment;
import me.wcy.music.model.Music;
import me.wcy.music.receiver.RemoteControlReceiver;
import me.wcy.music.service.OnPlayerEventListener;
import me.wcy.music.service.PlayService;
import me.wcy.music.utils.CoverLoader;
import me.wcy.music.utils.SystemUtils;
import me.wcy.music.utils.ToastUtils;
import me.wcy.music.utils.binding.Bind;
import me.wcy.music.utils.permission.PermissionReq;
import me.wcy.music.utils.permission.PermissionResult;
import me.wcy.music.utils.permission.Permissions;
public class MusicActivity extends BaseActivity implements View.OnClickListener, OnPlayerEventListener,
NavigationView.OnNavigationItemSelectedListener, ViewPager.OnPageChangeListener {
@Bind(R.id.drawer_layout)
private DrawerLayout drawerLayout;
@Bind(R.id.navigation_view)
private NavigationView navigationView;
@Bind(R.id.iv_menu)
private ImageView ivMenu;
@Bind(R.id.iv_search)
private ImageView ivSearch;
@Bind(R.id.tv_local_music)
private TextView tvLocalMusic;
@Bind(R.id.tv_online_music)
private TextView tvOnlineMusic;
@Bind(R.id.viewpager)
private ViewPager mViewPager;
@Bind(R.id.fl_play_bar)
private FrameLayout flPlayBar;
@Bind(R.id.iv_play_bar_cover)
private ImageView ivPlayBarCover;
@Bind(R.id.tv_play_bar_title)
private TextView tvPlayBarTitle;
@Bind(R.id.tv_play_bar_artist)
private TextView tvPlayBarArtist;
@Bind(R.id.iv_play_bar_play)
private ImageView ivPlayBarPlay;
@Bind(R.id.iv_play_bar_next)
private ImageView ivPlayBarNext;
@Bind(R.id.pb_play_bar)
private ProgressBar mProgressBar;
private View vNavigationHeader;
private LocalMusicFragment mLocalMusicFragment;
private SongListFragment mSongListFragment;
private PlayFragment mPlayFragment;
private AudioManager mAudioManager;
private ComponentName mRemoteReceiver;
private boolean isPlayFragmentShow = false;
private MenuItem timerItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music);
if (!checkServiceAlive()) {
return;
}
getPlayService().setOnPlayEventListener(this);
setupView();
updateWeather();
registerReceiver();
onChange(getPlayService().getPlayingMusic());
parseIntent();
}
@Override
protected void onNewIntent(Intent intent) {
setIntent(intent);
parseIntent();
}
@Override
protected void setListener() {
ivMenu.setOnClickListener(this);
ivSearch.setOnClickListener(this);
tvLocalMusic.setOnClickListener(this);
tvOnlineMusic.setOnClickListener(this);
mViewPager.setOnPageChangeListener(this);
flPlayBar.setOnClickListener(this);
ivPlayBarPlay.setOnClickListener(this);
ivPlayBarNext.setOnClickListener(this);
navigationView.setNavigationItemSelectedListener(this);
}
private void setupView() {
// add navigation header
vNavigationHeader = LayoutInflater.from(this).inflate(R.layout.navigation_header, navigationView, false);
navigationView.addHeaderView(vNavigationHeader);
// setup view pager
mLocalMusicFragment = new LocalMusicFragment();
mSongListFragment = new SongListFragment();
FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager());
adapter.addFragment(mLocalMusicFragment);
adapter.addFragment(mSongListFragment);
mViewPager.setAdapter(adapter);
tvLocalMusic.setSelected(true);
}
private void updateWeather() {
PermissionReq.with(this)
.permissions(Permissions.LOCATION)
.result(new PermissionResult() {
@Override
public void onGranted() {
new WeatherExecutor(getPlayService(), vNavigationHeader).execute();
}
@Override
public void onDenied() {
ToastUtils.show(getString(R.string.no_permission, Permissions.LOCATION_DESC, "更新天气"));
}
})
.request();
}
private void registerReceiver() {
mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
mRemoteReceiver = new ComponentName(getPackageName(), RemoteControlReceiver.class.getName());
mAudioManager.registerMediaButtonEventReceiver(mRemoteReceiver);
}
private void parseIntent() {
Intent intent = getIntent();
if (intent.hasExtra(Extras.EXTRA_NOTIFICATION)) {
showPlayingFragment();
setIntent(new Intent());
}
}
/**
* 更新播放进度
*/
@Override
public void onPublish(int progress) {
mProgressBar.setProgress(progress);
if (mPlayFragment != null) {
mPlayFragment.onPublish(progress);
}
}
@Override
public void onChange(Music music) {
onPlay(music);
if (mPlayFragment != null) {
mPlayFragment.onChange(music);
}
}
@Override
public void onPlayerPause() {
ivPlayBarPlay.setSelected(false);
if (mPlayFragment != null) {
mPlayFragment.onPlayerPause();
}
}
@Override
public void onPlayerResume() {
ivPlayBarPlay.setSelected(true);
if (mPlayFragment != null) {
mPlayFragment.onPlayerResume();
}
}
@Override
public void onTimer(long remain) {
if (timerItem == null) {
timerItem = navigationView.getMenu().findItem(R.id.action_timer);
}
String title = getString(R.string.menu_timer);
timerItem.setTitle(remain == 0 ? title : SystemUtils.formatTime(title + "(mm:ss)", remain));
}
@Override
public void onMusicListUpdate() {
if (mLocalMusicFragment != null) {
mLocalMusicFragment.onMusicListUpdate();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv_menu:
drawerLayout.openDrawer(GravityCompat.START);
break;
case R.id.iv_search:
startActivity(new Intent(this, SearchMusicActivity.class));
break;
case R.id.tv_local_music:
mViewPager.setCurrentItem(0);
break;
case R.id.tv_online_music:
mViewPager.setCurrentItem(1);
break;
case R.id.fl_play_bar:
showPlayingFragment();
break;
case R.id.iv_play_bar_play:
play();
break;
case R.id.iv_play_bar_next:
next();
break;
}
}
@Override
public boolean onNavigationItemSelected(final MenuItem item) {
drawerLayout.closeDrawers();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
item.setChecked(false);
}
}, 500);
return NaviMenuExecutor.onNavigationItemSelected(item, this);
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (position == 0) {
tvLocalMusic.setSelected(true);
tvOnlineMusic.setSelected(false);
} else {
tvLocalMusic.setSelected(false);
tvOnlineMusic.setSelected(true);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
public void onPlay(Music music) {
if (music == null) {
return;
}
Bitmap cover = CoverLoader.getInstance().loadThumbnail(music);
ivPlayBarCover.setImageBitmap(cover);
tvPlayBarTitle.setText(music.getTitle());
tvPlayBarArtist.setText(music.getArtist());
if (getPlayService().isPlaying() || getPlayService().isPreparing()) {
ivPlayBarPlay.setSelected(true);
} else {
ivPlayBarPlay.setSelected(false);
}
mProgressBar.setMax((int) music.getDuration());
mProgressBar.setProgress(0);
if (mLocalMusicFragment != null) {
mLocalMusicFragment.onItemPlay();
}
}
private void play() {
getPlayService().playPause();
}
private void next() {
getPlayService().next();
}
private void showPlayingFragment() {
if (isPlayFragmentShow) {
return;
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.fragment_slide_up, 0);
if (mPlayFragment == null) {
mPlayFragment = new PlayFragment();
ft.replace(android.R.id.content, mPlayFragment);
} else {
ft.show(mPlayFragment);
}
ft.commitAllowingStateLoss();
isPlayFragmentShow = true;
}
private void hidePlayingFragment() {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(0, R.anim.fragment_slide_down);
ft.hide(mPlayFragment);
ft.commitAllowingStateLoss();
isPlayFragmentShow = false;
}
@Override
public void onBackPressed() {
if (mPlayFragment != null && isPlayFragmentShow) {
hidePlayingFragment();
return;
}
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawers();
return;
}
super.onBackPressed();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// 切换夜间模式不保存状态
}
@Override
protected void onDestroy() {
if (mRemoteReceiver != null) {
mAudioManager.unregisterMediaButtonEventReceiver(mRemoteReceiver);
}
PlayService service = AppCache.getPlayService();
if (service != null) {
service.setOnPlayEventListener(null);
}
super.onDestroy();
}
}