package com.wm.remusic.activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
import com.wm.remusic.MediaAidlInterface;
import com.wm.remusic.R;
import com.wm.remusic.fragment.QuickControlsFragment;
import com.wm.remusic.service.MediaService;
import com.wm.remusic.service.MusicPlayer;
import com.wm.remusic.uitl.IConstants;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import static com.wm.remusic.service.MusicPlayer.mService;
/**
* Created by wm on 2016/2/25.
* activity基类
*/
public class BaseActivity extends AppCompatActivity implements ServiceConnection {
private MusicPlayer.ServiceToken mToken;
private PlaybackStatus mPlaybackStatus; //receiver 接受播放状态变化等
private QuickControlsFragment fragment; //底部播放控制栏
private String TAG = "BaseActivity";
private ArrayList<MusicStateListener> mMusicListener = new ArrayList<>();
/**
* 更新播放队列
*/
public void updateQueue() {
}
/**
* 更新歌曲状态信息
*/
public void updateTrackInfo() {
for (final MusicStateListener listener : mMusicListener) {
if (listener != null) {
listener.reloadAdapter();
listener.updateTrackInfo();
}
}
}
/**
* fragment界面刷新
*/
public void refreshUI() {
for (final MusicStateListener listener : mMusicListener) {
if (listener != null) {
listener.reloadAdapter();
}
}
}
public void updateTime() {
for (final MusicStateListener listener : mMusicListener) {
if (listener != null) {
listener.updateTime();
}
}
}
/**
* 歌曲切换
*/
public void updateTrack() {
}
public void updateLrc() {
}
/**
* @param p 更新歌曲缓冲进度值,p取值从0~100
*/
public void updateBuffer(int p) {
}
public void changeTheme() {
for (final MusicStateListener listener : mMusicListener) {
if (listener != null) {
listener.changeTheme();
}
}
}
/**
* @param l 歌曲是否加载中
*/
public void loading(boolean l){
}
/**
* @param outState 取消保存状态
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
//super.onSaveInstanceState(outState);
}
/**
* @param savedInstanceState 取消保存状态
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
//super.onRestoreInstanceState(savedInstanceState);
}
/**
* @param show 显示或关闭底部播放控制栏
*/
protected void showQuickControl(boolean show) {
Log.d(TAG, MusicPlayer.getQueue().length + "");
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (show) {
if (fragment == null) {
fragment = QuickControlsFragment.newInstance();
ft.add(R.id.bottom_container, fragment).commitAllowingStateLoss();
} else {
ft.show(fragment).commitAllowingStateLoss();
}
} else {
if (fragment != null)
ft.hide(fragment).commitAllowingStateLoss();
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mToken = MusicPlayer.bindToService(this, this);
mPlaybackStatus = new PlaybackStatus(this);
IntentFilter f = new IntentFilter();
f.addAction(MediaService.PLAYSTATE_CHANGED);
f.addAction(MediaService.META_CHANGED);
f.addAction(MediaService.QUEUE_CHANGED);
f.addAction(IConstants.MUSIC_COUNT_CHANGED);
f.addAction(MediaService.TRACK_PREPARED);
f.addAction(MediaService.BUFFER_UP);
f.addAction(IConstants.EMPTY_LIST);
f.addAction(MediaService.MUSIC_CHANGED);
f.addAction(MediaService.LRC_UPDATED);
f.addAction(IConstants.PLAYLIST_COUNT_CHANGED);
f.addAction(MediaService.MUSIC_LODING);
registerReceiver(mPlaybackStatus, new IntentFilter(f));
showQuickControl(true);
}
@Override
public void onServiceConnected(final ComponentName name, final IBinder service) {
mService = MediaAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(final ComponentName name) {
mService = null;
}
@Override
protected void onDestroy() {
super.onDestroy();
// Unbind from the service
unbindService();
try {
unregisterReceiver(mPlaybackStatus);
} catch (final Throwable e) {
}
mMusicListener.clear();
}
public void unbindService() {
if (mToken != null) {
MusicPlayer.unbindFromService(mToken);
mToken = null;
}
}
public void setMusicStateListenerListener(final MusicStateListener status) {
if (status == this) {
throw new UnsupportedOperationException("Override the method, don't add a listener");
}
if (status != null) {
mMusicListener.add(status);
}
}
public void removeMusicStateListenerListener(final MusicStateListener status) {
if (status != null) {
mMusicListener.remove(status);
}
}
private final static class PlaybackStatus extends BroadcastReceiver {
private final WeakReference<BaseActivity> mReference;
public PlaybackStatus(final BaseActivity activity) {
mReference = new WeakReference<>(activity);
}
@Override
public void onReceive(final Context context, final Intent intent) {
final String action = intent.getAction();
BaseActivity baseActivity = mReference.get();
if (baseActivity != null) {
if (action.equals(MediaService.META_CHANGED)) {
baseActivity.updateTrackInfo();
} else if (action.equals(MediaService.PLAYSTATE_CHANGED)) {
} else if (action.equals(MediaService.TRACK_PREPARED)) {
baseActivity.updateTime();
} else if (action.equals(MediaService.BUFFER_UP)) {
baseActivity.updateBuffer(intent.getIntExtra("progress", 0));
} else if (action.equals(MediaService.MUSIC_LODING)) {
baseActivity.loading(intent.getBooleanExtra("isloading",false));
} else if (action.equals(MediaService.REFRESH)) {
} else if (action.equals(IConstants.MUSIC_COUNT_CHANGED)) {
baseActivity.refreshUI();
} else if (action.equals(IConstants.PLAYLIST_COUNT_CHANGED)) {
baseActivity.refreshUI();
} else if (action.equals(MediaService.QUEUE_CHANGED)) {
baseActivity.updateQueue();
} else if (action.equals(MediaService.TRACK_ERROR)) {
final String errorMsg = context.getString(R.string.exit,
intent.getStringExtra(MediaService.TrackErrorExtra.TRACK_NAME));
Toast.makeText(baseActivity, errorMsg, Toast.LENGTH_SHORT).show();
} else if (action.equals(MediaService.MUSIC_CHANGED)) {
baseActivity.updateTrack();
} else if (action.equals(MediaService.LRC_UPDATED)) {
baseActivity.updateLrc();
}
}
}
}
}