package com.teleca.jamendo.activity.search; import java.util.ArrayList; import org.json.JSONException; import com.teleca.jamendo.activity.playview.PlayView; import com.teleca.jamendo.adapter.AlbumAdp; import com.teleca.jamendo.adapter.PlaylistRemoteAdp; import com.teleca.jamendo.api.IServerApi; import com.teleca.jamendo.api_impl.ServerApiImpl; import com.teleca.jamendo.model.Album; import com.teleca.jamendo.model.PlaylistRemote; import com.teleca.jamendo.model.ErrorMsg; import com.teleca.jamendo.ui.loadDialog.LoadDialog; import com.teleca.jamendo.R; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.Spinner; import android.widget.ViewFlipper; import android.widget.AdapterView.OnItemClickListener; /** * 搜索界面 * * @author lilin * @date 2012-1-6 下午09:19:33 * @ClassName: SearchView */ public class SearchView extends Activity { enum SearchMode { Artist, Tag, UserPlaylist, UserStarredAlbums }; private Spinner mSearchSpinner; private ListView mSearchListView; private EditText mSearchEditText; private Button mSearchButton; private ViewFlipper mViewFlipper; private PlaylistRemote[] mPlaylistRemotes = null; private SearchMode mSearchMode; public static void launch(Context c) { Intent intent = new Intent(c, SearchView.class); c.startActivity(intent); } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.searchview); mSearchSpinner = (Spinner) findViewById(R.id.SearchSpinner); ArrayAdapter adapter = ArrayAdapter.createFromResource(this, R.array.search_modes, android.R.layout.simple_spinner_item); adapter .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mSearchSpinner.setAdapter(adapter); mSearchButton = (Button) findViewById(R.id.SearchButton); mSearchButton.setOnClickListener(mSearchButtonListener); mSearchEditText = (EditText) findViewById(R.id.SearchEditText); mSearchListView = (ListView) findViewById(R.id.SearchListView); mViewFlipper = (ViewFlipper) findViewById(R.id.SearchViewFlipper); if (mSearchListView.getCount() == 0) { mViewFlipper.setDisplayedChild(2); // search list hint } } @SuppressWarnings("unchecked") @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { mSearchMode = (SearchMode) savedInstanceState.getSerializable("mode"); if (mSearchMode != null) { if (mSearchMode.equals(SearchMode.Artist) || mSearchMode.equals(SearchMode.Tag) || mSearchMode.equals(SearchMode.UserStarredAlbums)) { AlbumAdp adapter = new AlbumAdp(this); adapter.setList((ArrayList<Album>) savedInstanceState .get("values")); mSearchListView.setAdapter(adapter); mSearchListView.setOnItemClickListener(mAlbumClickListener); } if (mSearchMode.equals(SearchMode.UserPlaylist)) { PlaylistRemoteAdp adapter = new PlaylistRemoteAdp(this); adapter.setList((ArrayList<PlaylistRemote>) savedInstanceState .get("values")); mSearchListView.setAdapter(adapter); mSearchListView.setOnItemClickListener(mPlaylistClickListener); } mViewFlipper.setDisplayedChild(savedInstanceState .getInt("flipper_page")); } super.onRestoreInstanceState(savedInstanceState); } @Override protected void onSaveInstanceState(Bundle outState) { if (mSearchMode != null) { outState.putSerializable("mode", mSearchMode); if (mSearchMode.equals(SearchMode.Artist) || mSearchMode.equals(SearchMode.Tag) || mSearchMode.equals(SearchMode.UserStarredAlbums)) { AlbumAdp adapter = (AlbumAdp) mSearchListView.getAdapter(); outState.putSerializable("values", adapter.getList()); } if (mSearchMode.equals(SearchMode.UserPlaylist)) { PlaylistRemoteAdp adapter = (PlaylistRemoteAdp) mSearchListView .getAdapter(); outState.putSerializable("values", adapter.getList()); } outState.putInt("flipper_page", mViewFlipper.getDisplayedChild()); } super.onSaveInstanceState(outState); } private OnClickListener mSearchButtonListener = new OnClickListener() { @Override public void onClick(View v) { new SearchingDialog(SearchView.this, R.string.searching, R.string.search_fail).execute(mSearchSpinner .getSelectedItemPosition()); } }; private OnItemClickListener mAlbumClickListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long time) { Album album = (Album) adapterView.getItemAtPosition(position); PlayView.launch(SearchView.this, album); } }; private OnItemClickListener mPlaylistClickListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View arg1, int position, long arg3) { PlaylistRemote playlistRemote = (PlaylistRemote) adapterView .getItemAtPosition(position); PlayView.launch(SearchView.this, playlistRemote); } }; /** * Allows cancelling search query * * @author Lukasz Wisniewski */ private class SearchingDialog extends LoadDialog<Integer, Integer> { private Integer mSearchMode; private BaseAdapter mAdapter; public SearchingDialog(Activity activity, int loadingMsg, int failMsg) { super(activity, loadingMsg, failMsg); } @Override public Integer doInBackground(Integer... params) { mSearchMode = params[0]; switch (mSearchMode) { case 0: // artist search albumSearch(0); break; case 1: // tag search albumSearch(1); break; case 2: // playlist search playlistSearch(); break; case 3: // starred album search albumSearch(3); break; default: } return mSearchMode; } @Override public void doStuffWithResult(Integer result) { mSearchListView.setAdapter(mAdapter); if (mSearchListView.getCount() > 0) { mViewFlipper.setDisplayedChild(0); // display results } else { mViewFlipper.setDisplayedChild(1); // display no results message } // results are albums if (mSearchMode.equals(0) || mSearchMode.equals(1) || mSearchMode.equals(3)) { mSearchListView.setOnItemClickListener(mAlbumClickListener); } // results are playlists if (mSearchMode.equals(2)) { mSearchListView.setOnItemClickListener(mPlaylistClickListener); } } private void albumSearch(int id) { IServerApi service = new ServerApiImpl(); String query = mSearchEditText.getText().toString(); Album[] albums = null; try { switch (id) { case 0: albums = service.searchForAlbumsByArtist(query); SearchView.this.mSearchMode = SearchMode.Artist; break; case 1: albums = service.searchForAlbumsByTag(query); SearchView.this.mSearchMode = SearchMode.Tag; break; case 3: albums = service.getUserStarredAlbums(query); SearchView.this.mSearchMode = SearchMode.UserStarredAlbums; break; default: return; } AlbumAdp albumAdapter = new AlbumAdp(SearchView.this); albumAdapter.setList(albums); albumAdapter.setListView(mSearchListView); mAdapter = albumAdapter; } catch (JSONException e) { e.printStackTrace(); } catch (ErrorMsg e) { publishProgress(e); this.cancel(true); } } private void playlistSearch() { IServerApi service = new ServerApiImpl(); String user = mSearchEditText.getText().toString(); try { mPlaylistRemotes = service.getUserPlaylist(user); if (mPlaylistRemotes != null) { PlaylistRemoteAdp purpleAdapter = new PlaylistRemoteAdp( SearchView.this); purpleAdapter.setList(mPlaylistRemotes); mAdapter = purpleAdapter; SearchView.this.mSearchMode = SearchMode.UserPlaylist; } } catch (JSONException e) { e.printStackTrace(); } catch (ErrorMsg e) { publishProgress(e); this.cancel(true); } } } }