diff --git a/res/color/tab_indicator_text.xml b/res/color/tab_indicator_text.xml new file mode 100644 index 00000000..84101823 --- /dev/null +++ b/res/color/tab_indicator_text.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/res/drawable/buttonbar.xml b/res/drawable/buttonbar.xml new file mode 100644 index 00000000..1c3df76a --- /dev/null +++ b/res/drawable/buttonbar.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/res/drawable/buttonbar_active.9.png b/res/drawable/buttonbar_active.9.png new file mode 100644 index 00000000..83c3f220 Binary files /dev/null and b/res/drawable/buttonbar_active.9.png differ diff --git a/res/drawable/buttonbar_focused.9.png b/res/drawable/buttonbar_focused.9.png new file mode 100644 index 00000000..bc00f30b Binary files /dev/null and b/res/drawable/buttonbar_focused.9.png differ diff --git a/res/drawable/buttonbar_inactive.9.png b/res/drawable/buttonbar_inactive.9.png new file mode 100644 index 00000000..afe798a2 Binary files /dev/null and b/res/drawable/buttonbar_inactive.9.png differ diff --git a/res/drawable/buttonbar_pressed.9.png b/res/drawable/buttonbar_pressed.9.png new file mode 100644 index 00000000..2288f28b Binary files /dev/null and b/res/drawable/buttonbar_pressed.9.png differ diff --git a/res/drawable/ic_menu_shuffle.png b/res/drawable/ic_menu_shuffle.png old mode 100755 new mode 100644 diff --git a/res/drawable/tab_albums.xml b/res/drawable/ic_tab_albums.xml similarity index 100% rename from res/drawable/tab_albums.xml rename to res/drawable/ic_tab_albums.xml diff --git a/res/drawable/tab_artists.xml b/res/drawable/ic_tab_artists.xml similarity index 100% rename from res/drawable/tab_artists.xml rename to res/drawable/ic_tab_artists.xml diff --git a/res/drawable/tab_playlists.xml b/res/drawable/ic_tab_playlists.xml similarity index 100% rename from res/drawable/tab_playlists.xml rename to res/drawable/ic_tab_playlists.xml diff --git a/res/drawable/tab_songs.xml b/res/drawable/ic_tab_songs.xml similarity index 100% rename from res/drawable/tab_songs.xml rename to res/drawable/ic_tab_songs.xml diff --git a/res/layout/library_content.xml b/res/layout/library_content.xml index 80af7a81..8811ee56 100644 --- a/res/layout/library_content.xml +++ b/res/layout/library_content.xml @@ -21,46 +21,118 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> - - + + + + + + + + - - + - - - - - - - - + android:layout_height="fill_parent" /> + + + + + + diff --git a/src/org/kreed/vanilla/LibraryActivity.java b/src/org/kreed/vanilla/LibraryActivity.java index 099730d6..f2651454 100644 --- a/src/org/kreed/vanilla/LibraryActivity.java +++ b/src/org/kreed/vanilla/LibraryActivity.java @@ -50,14 +50,14 @@ import android.widget.AdapterView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; -import android.widget.TabHost; +import android.widget.TabWidget; import android.widget.TextView; import android.widget.Toast; /** * The library activity where songs to play can be selected from the library. */ -public class LibraryActivity extends PlaybackActivity implements AdapterView.OnItemClickListener, TextWatcher, TabHost.OnTabChangeListener { +public class LibraryActivity extends PlaybackActivity implements AdapterView.OnItemClickListener, TextWatcher { /** * The number of tabs in the song selector. */ @@ -69,7 +69,9 @@ public class LibraryActivity extends PlaybackActivity implements AdapterView.OnI private static final int[] modeForAction = { SongTimeline.MODE_PLAY, SongTimeline.MODE_ENQUEUE }; - private TabHost mTabHost; + private TabWidget mTabWidget; + private ViewGroup mLists; + private int mCurrentTab; private View mSearchBox; private boolean mSearchBoxVisible; @@ -130,17 +132,6 @@ public class LibraryActivity extends PlaybackActivity implements AdapterView.OnI setContentView(R.layout.library_nocontrols); } - mTabHost = (TabHost)findViewById(android.R.id.tabhost); - mTabHost.setup(); - - Resources res = getResources(); - mTabHost.addTab(mTabHost.newTabSpec("tab_artists").setIndicator(res.getText(R.string.artists), res.getDrawable(R.drawable.tab_artists)).setContent(R.id.artist_list)); - mTabHost.addTab(mTabHost.newTabSpec("tab_albums").setIndicator(res.getText(R.string.albums), res.getDrawable(R.drawable.tab_albums)).setContent(R.id.album_list)); - mTabHost.addTab(mTabHost.newTabSpec("tab_songs").setIndicator(res.getText(R.string.songs), res.getDrawable(R.drawable.tab_songs)).setContent(R.id.song_list)); - mTabHost.addTab(mTabHost.newTabSpec("tab_playlists").setIndicator(res.getText(R.string.playlists), res.getDrawable(R.drawable.tab_playlists)).setContent(R.id.playlist_list)); - // TODO: find/create genre icon - mTabHost.addTab(mTabHost.newTabSpec("tab_genres").setIndicator(res.getText(R.string.genres), res.getDrawable(R.drawable.tab_songs)).setContent(R.id.genre_list)); - mSearchBox = findViewById(R.id.search_box); mTextFilter = (TextView)findViewById(R.id.filter_text); @@ -159,21 +150,31 @@ public class LibraryActivity extends PlaybackActivity implements AdapterView.OnI // These should be in the same order as MediaUtils.TYPE_* mAdapters = new MediaAdapter[] { mArtistAdapter, mAlbumAdapter, mSongAdapter, mPlaylistAdapter, mGenreAdapter }; + mLists = (ViewGroup)findViewById(R.id.lists); + TabWidget tabWidget = (TabWidget)findViewById(R.id.tab_widget); + tabWidget.setCurrentTab(0); + mTabWidget = tabWidget; + for (int i = 0, count = tabWidget.getTabCount(); i != count; ++i) { + View view = tabWidget.getChildTabViewAt(i); + view.setOnClickListener(this); + view.setTag(i); + } + getContentResolver().registerContentObserver(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, true, mPlaylistObserver); - mCurrentAdapter = mAdapters[mTabHost.getCurrentTab()]; - - mTabHost.setOnTabChangedListener(this); + int currentTab = 0; if (state != null) { if (state.getBoolean("search_box_visible")) setSearchBoxVisible(true); - int currentTab = state.getInt("current_tab", -1); - if (currentTab != -1) - mTabHost.setCurrentTab(currentTab); - mTextFilter.setText(state.getString("filter")); + currentTab = state.getInt("current_tab", 0); } + setCurrentTab(currentTab); + + if (state != null) + mTextFilter.setText(state.getString("filter")); + // query adapters onMediaChange(); } @@ -193,7 +194,7 @@ public class LibraryActivity extends PlaybackActivity implements AdapterView.OnI protected void onSaveInstanceState(Bundle out) { out.putBoolean("search_box_visible", mSearchBoxVisible); - out.putInt("current_tab", mTabHost.getCurrentTab()); + out.putInt("current_tab", mCurrentTab); out.putString("filter", mTextFilter.getText().toString()); out.putSerializable("limiter_albums", mAlbumAdapter.getLimiter()); out.putSerializable("limiter_songs", mSongAdapter.getLimiter()); @@ -291,7 +292,7 @@ public class LibraryActivity extends PlaybackActivity implements AdapterView.OnI { int type = intent.getIntExtra("type", 1); long id = intent.getLongExtra("id", -1); - mTabHost.setCurrentTab(setLimiter(mAdapters[type - 1].getLimiter(id))); + setCurrentTab(setLimiter(mAdapters[type - 1].getLimiter(id))); } /** @@ -398,12 +399,6 @@ public class LibraryActivity extends PlaybackActivity implements AdapterView.OnI } } - public void onTabChanged(String tabId) - { - mCurrentAdapter = mAdapters[mTabHost.getCurrentTab()]; - updateLimiterViews(); - } - @Override public void onClick(View view) { @@ -415,31 +410,35 @@ public class LibraryActivity extends PlaybackActivity implements AdapterView.OnI } else if (view == mCover) { startActivity(new Intent(this, FullPlaybackActivity.class)); } else if (view.getTag() != null) { - // a limiter view was clicked - int i = (Integer)view.getTag(); - if (i == 1) { - // generate the artist limiter (we need to query the artist id) - MediaAdapter.Limiter limiter = mSongAdapter.getLimiter(); - assert(limiter.type == MediaUtils.TYPE_ALBUM); + if (view.getParent() instanceof TabWidget) { + // a tab was clicked + setCurrentTab(i); + } else { + // a limiter view was clicked + if (i == 1) { + // generate the artist limiter (we need to query the artist id) + MediaAdapter.Limiter limiter = mSongAdapter.getLimiter(); + assert(limiter.type == MediaUtils.TYPE_ALBUM); - ContentResolver resolver = getContentResolver(); - Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; - String[] projection = new String[] { MediaStore.Audio.Media.ARTIST_ID }; - Cursor cursor = resolver.query(uri, projection, limiter.selection, null, null); - if (cursor != null) { - if (cursor.moveToNext()) { - setLimiter(mArtistAdapter.getLimiter(cursor.getLong(0))); - updateLimiterViews(); + ContentResolver resolver = getContentResolver(); + Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + String[] projection = new String[] { MediaStore.Audio.Media.ARTIST_ID }; + Cursor cursor = resolver.query(uri, projection, limiter.selection, null, null); + if (cursor != null) { + if (cursor.moveToNext()) { + setLimiter(mArtistAdapter.getLimiter(cursor.getLong(0))); + updateLimiterViews(); + cursor.close(); + return; + } cursor.close(); - return; } - cursor.close(); } - } - setLimiter(null); - updateLimiterViews(); + setLimiter(null); + updateLimiterViews(); + } } else { super.onClick(view); } @@ -806,4 +805,17 @@ public class LibraryActivity extends PlaybackActivity implements AdapterView.OnI mCover.setVisibility(cover == null ? View.GONE : View.VISIBLE); } } + + /** + * Switch to the tab at the given index. + */ + private void setCurrentTab(int i) + { + mCurrentAdapter = mAdapters[i]; + mTabWidget.setCurrentTab(i); + mLists.getChildAt(mCurrentTab).setVisibility(View.GONE); + mLists.getChildAt(i).setVisibility(View.VISIBLE); + mCurrentTab = i; + updateLimiterViews(); + } }