package me.wcy.music.activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import me.wcy.music.R;
import me.wcy.music.adapter.OnMoreClickListener;
import me.wcy.music.adapter.SearchMusicAdapter;
import me.wcy.music.enums.LoadStateEnum;
import me.wcy.music.executor.DownloadSearchedMusic;
import me.wcy.music.executor.PlaySearchedMusic;
import me.wcy.music.executor.ShareOnlineMusic;
import me.wcy.music.http.HttpCallback;
import me.wcy.music.http.HttpClient;
import me.wcy.music.model.Music;
import me.wcy.music.model.SearchMusic;
import me.wcy.music.utils.FileUtils;
import me.wcy.music.utils.ToastUtils;
import me.wcy.music.utils.ViewUtils;
import me.wcy.music.utils.binding.Bind;
public class SearchMusicActivity extends BaseActivity implements SearchView.OnQueryTextListener
, AdapterView.OnItemClickListener, OnMoreClickListener {
@Bind(R.id.lv_search_music_list)
private ListView lvSearchMusic;
@Bind(R.id.ll_loading)
private LinearLayout llLoading;
@Bind(R.id.ll_load_fail)
private LinearLayout llLoadFail;
private List<SearchMusic.Song> mSearchMusicList = new ArrayList<>();
private SearchMusicAdapter mAdapter = new SearchMusicAdapter(mSearchMusicList);
private ProgressDialog mProgressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_music);
if (!checkServiceAlive()) {
return;
}
lvSearchMusic.setAdapter(mAdapter);
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage(getString(R.string.loading));
((TextView) llLoadFail.findViewById(R.id.tv_load_fail_text)).setText(R.string.search_empty);
}
@Override
protected void setListener() {
lvSearchMusic.setOnItemClickListener(this);
mAdapter.setOnMoreClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_search_music, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.onActionViewExpanded();
searchView.setQueryHint(getString(R.string.search_tips));
searchView.setOnQueryTextListener(this);
searchView.setSubmitButtonEnabled(true);
try {
Field field = searchView.getClass().getDeclaredField("mGoButton");
field.setAccessible(true);
ImageView mGoButton = (ImageView) field.get(searchView);
mGoButton.setImageResource(R.drawable.ic_menu_search);
} catch (Exception e) {
e.printStackTrace();
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onQueryTextSubmit(String query) {
ViewUtils.changeViewState(lvSearchMusic, llLoading, llLoadFail, LoadStateEnum.LOADING);
searchMusic(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
private void searchMusic(String keyword) {
HttpClient.searchMusic(keyword, new HttpCallback<SearchMusic>() {
@Override
public void onSuccess(SearchMusic response) {
if (response == null || response.getSong() == null) {
ViewUtils.changeViewState(lvSearchMusic, llLoading, llLoadFail, LoadStateEnum.LOAD_FAIL);
return;
}
ViewUtils.changeViewState(lvSearchMusic, llLoading, llLoadFail, LoadStateEnum.LOAD_SUCCESS);
mSearchMusicList.clear();
mSearchMusicList.addAll(response.getSong());
mAdapter.notifyDataSetChanged();
lvSearchMusic.requestFocus();
mHandler.post(new Runnable() {
@Override
public void run() {
lvSearchMusic.setSelection(0);
}
});
}
@Override
public void onFail(Exception e) {
ViewUtils.changeViewState(lvSearchMusic, llLoading, llLoadFail, LoadStateEnum.LOAD_FAIL);
}
});
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
new PlaySearchedMusic(this, mSearchMusicList.get(position)) {
@Override
public void onPrepare() {
mProgressDialog.show();
}
@Override
public void onExecuteSuccess(Music music) {
mProgressDialog.cancel();
getPlayService().play(music);
ToastUtils.show(getString(R.string.now_play, music.getTitle()));
}
@Override
public void onExecuteFail(Exception e) {
mProgressDialog.cancel();
ToastUtils.show(R.string.unable_to_play);
}
}.execute();
}
@Override
public void onMoreClick(int position) {
final SearchMusic.Song song = mSearchMusicList.get(position);
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle(song.getSongname());
String path = FileUtils.getMusicDir() + FileUtils.getMp3FileName(song.getArtistname(), song.getSongname());
File file = new File(path);
int itemsId = file.exists() ? R.array.search_music_dialog_no_download : R.array.search_music_dialog;
dialog.setItems(itemsId, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:// 分享
share(song);
break;
case 1:// 下载
download(song);
break;
}
}
});
dialog.show();
}
private void share(SearchMusic.Song song) {
new ShareOnlineMusic(this, song.getSongname(), song.getSongid()) {
@Override
public void onPrepare() {
mProgressDialog.show();
}
@Override
public void onExecuteSuccess(Void aVoid) {
mProgressDialog.cancel();
}
@Override
public void onExecuteFail(Exception e) {
mProgressDialog.cancel();
}
}.execute();
}
private void download(final SearchMusic.Song song) {
new DownloadSearchedMusic(this, song) {
@Override
public void onPrepare() {
mProgressDialog.show();
}
@Override
public void onExecuteSuccess(Void aVoid) {
mProgressDialog.cancel();
ToastUtils.show(getString(R.string.now_download, song.getSongname()));
}
@Override
public void onExecuteFail(Exception e) {
mProgressDialog.cancel();
ToastUtils.show(R.string.unable_to_download);
}
}.execute();
}
}