diff options
43 files changed, 324 insertions, 166 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 3a4fc9f..fe80222 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -20,7 +20,7 @@ <!-- ICS to Jelly Bean --> <uses-sdk - android:minSdkVersion="14" + android:minSdkVersion="16" android:targetSdkVersion="18" /> <!-- Used for caching and creating new playlists --> diff --git a/res/drawable-hdpi/cardcontainer.9.png b/res/drawable-hdpi/cardcontainer.9.png Binary files differnew file mode 100644 index 0000000..246064e --- /dev/null +++ b/res/drawable-hdpi/cardcontainer.9.png diff --git a/res/drawable-mdpi/cardcontainer.9.png b/res/drawable-mdpi/cardcontainer.9.png Binary files differnew file mode 100644 index 0000000..2e6032b --- /dev/null +++ b/res/drawable-mdpi/cardcontainer.9.png diff --git a/res/drawable-xhdpi/cardcontainer.9.png b/res/drawable-xhdpi/cardcontainer.9.png Binary files differnew file mode 100644 index 0000000..e019df0 --- /dev/null +++ b/res/drawable-xhdpi/cardcontainer.9.png diff --git a/res/drawable-xxhdpi/cardcontainer.9.png b/res/drawable-xxhdpi/cardcontainer.9.png Binary files differnew file mode 100644 index 0000000..1048fc8 --- /dev/null +++ b/res/drawable-xxhdpi/cardcontainer.9.png diff --git a/res/layout/edit_queue_list_item.xml b/res/layout/edit_queue_list_item.xml index 57f510c..57603c6 100644 --- a/res/layout/edit_queue_list_item.xml +++ b/res/layout/edit_queue_list_item.xml @@ -29,8 +29,8 @@ <FrameLayout android:id="@+id/edit_track_list_container" - android:layout_width="match_parent" - android:layout_height="@dimen/item_normal_height" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_toRightOf="@+id/edit_track_list_item_handle" android:gravity="center_vertical" > diff --git a/res/layout/fragment_music_browser_phone.xml b/res/layout/fragment_music_browser_phone.xml index c461c79..d62ffc2 100644 --- a/res/layout/fragment_music_browser_phone.xml +++ b/res/layout/fragment_music_browser_phone.xml @@ -30,6 +30,7 @@ android:layout_width="match_parent" android:layout_height="@dimen/tpi_height" android:textColor="@color/tpi_text_color" + tpi:boldAll="true" tpi:selectedColor="@color/tpi_selected_text_color" tpi:footerLineHeight="@dimen/tpi_footer_line_height" tpi:footerIndicatorHeight="@dimen/tpi_footer_indicator_height" diff --git a/res/layout/fragment_themes_base.xml b/res/layout/fragment_themes_base.xml deleted file mode 100644 index d9b9584..0000000 --- a/res/layout/fragment_themes_base.xml +++ /dev/null @@ -1,47 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2012 Andrew Neal - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:padding="@dimen/grid_item_spacing" > - - <ImageView - android:id="@+id/image" - android:layout_width="match_parent" - android:layout_height="155.0dip" - android:scaleType="centerCrop" - tools:ignore="ContentDescription" /> - - <RelativeLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_below="@+id/image" > - - <TextView - android:id="@+id/line_one" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_centerHorizontal="true" - android:layout_centerVertical="true" - android:background="@color/transparent_black" - android:gravity="center" - android:textColor="@color/white" - android:textSize="@dimen/text_size_dayum" /> - </RelativeLayout> - -</RelativeLayout>
\ No newline at end of file diff --git a/res/layout/grid_base.xml b/res/layout/grid_base.xml index 3b51674..ad38b92 100644 --- a/res/layout/grid_base.xml +++ b/res/layout/grid_base.xml @@ -40,9 +40,9 @@ android:drawSelectorOnTop="true" android:fadingEdge="vertical" android:fastScrollEnabled="true" - android:horizontalSpacing="@dimen/grid_item_spacing" + android:horizontalSpacing="@dimen/grid_item_horizontal_spacing" android:scrollbarStyle="outsideOverlay" android:scrollbars="vertical" - android:verticalSpacing="@dimen/grid_item_spacing" /> + android:verticalSpacing="@dimen/grid_item_vertical_spacing" /> </FrameLayout>
\ No newline at end of file diff --git a/res/layout/grid_items_normal.xml b/res/layout/grid_items_normal.xml index 69c447d..f61af9a 100644 --- a/res/layout/grid_items_normal.xml +++ b/res/layout/grid_items_normal.xml @@ -16,37 +16,31 @@ --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="match_parent" + android:layout_height="wrap_content" android:gravity="center_vertical" > <include layout="@layout/square_image_view" /> <RelativeLayout android:layout_width="match_parent" - android:layout_height="@dimen/item_normal_height" - android:layout_alignParentBottom="true" - android:background="@color/transparent_black" - android:gravity="center_vertical" + android:layout_height="@dimen/grid_bottom_height" + android:layout_below="@+id/square_view" + android:background="@drawable/cardcontainer" android:paddingLeft="@dimen/grid_item_padding_left" > <TextView android:id="@+id/line_one" + style="@style/ListItemMainText.Grid.Single" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_alignParentTop="true" - android:maxLines="2" - android:textColor="@color/white" - android:textSize="@dimen/text_size_medium" - android:textStyle="bold" /> + android:layout_alignParentTop="true" /> <TextView android:id="@+id/line_two" + style="@style/ListItemSecondaryText.Grid.Single" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_below="@+id/line_one" - android:singleLine="true" - android:textColor="@color/transparent_white" - android:textSize="@dimen/text_size_small" /> + android:layout_below="@+id/line_one" /> </RelativeLayout> </RelativeLayout>
\ No newline at end of file diff --git a/res/layout/header_bar.xml b/res/layout/header_bar.xml index 6230573..b83a818 100644 --- a/res/layout/header_bar.xml +++ b/res/layout/header_bar.xml @@ -28,6 +28,7 @@ android:layout_weight="1" android:ellipsize="end" android:singleLine="true" + android:textAllCaps="true" android:textColor="@color/header_action_bar_text_color" android:textSize="@dimen/text_size_large" /> diff --git a/res/layout/list_header.xml b/res/layout/list_header.xml index f10aa90..aff83b4 100644 --- a/res/layout/list_header.xml +++ b/res/layout/list_header.xml @@ -21,4 +21,5 @@ android:background="@null" android:gravity="center_vertical" android:textColor="@color/list_item_header_text_color" - android:textSize="@dimen/list_item_header_size" /> + android:textSize="@dimen/list_item_header_size" + android:fontFamily="sans-serif-light" /> diff --git a/res/layout/list_item_normal.xml b/res/layout/list_item_normal.xml index ee34ec9..775ec1f 100644 --- a/res/layout/list_item_normal.xml +++ b/res/layout/list_item_normal.xml @@ -30,7 +30,7 @@ android:layout_height="@dimen/list_item_image_height" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" - android:scaleType="fitXY" /> + android:scaleType="centerCrop" /> <RelativeLayout android:layout_width="match_parent" diff --git a/res/layout/list_item_queue.xml b/res/layout/list_item_queue.xml index f3efbdb..9cf1fc5 100644 --- a/res/layout/list_item_queue.xml +++ b/res/layout/list_item_queue.xml @@ -5,15 +5,26 @@ android:layout_width="match_parent" android:layout_height="@dimen/item_normal_height" android:gravity="center_vertical" - android:minHeight="@dimen/item_normal_height"> + android:minHeight="@dimen/item_normal_height" + android:paddingTop="@dimen/list_item_padding_top" + android:paddingBottom="@dimen/list_item_padding_bottom"> + + <com.cyngn.eleven.widgets.SquareImageView + android:id="@+id/image" + android:layout_width="@dimen/list_item_image_width" + android:layout_height="@dimen/list_item_image_height" + android:layout_alignParentLeft="true" + android:layout_alignParentTop="true" + android:scaleType="centerCrop" /> <!-- center the text views vertically --> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_vertical" - android:layout_alignParentLeft="true" android:layout_toLeftOf="@+id/play_pause_container" + android:layout_toRightOf="@id/image" + android:paddingLeft="@dimen/list_item_queue_text_padding_left" android:orientation="vertical"> <TextView android:id="@+id/line_one" @@ -26,12 +37,6 @@ style="@style/ListItemSecondaryText.Light.Single" android:layout_width="match_parent" android:layout_height="wrap_content" /> - - <TextView - android:id="@+id/line_three" - style="@style/ListItemSecondaryText.Light.Single" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> </LinearLayout> <FrameLayout @@ -39,7 +44,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_toLeftOf="@+id/line_one_right" + android:layout_alignParentRight="true" android:paddingLeft="@dimen/list_item_progress_padding_left" android:paddingRight="@dimen/list_item_progress_padding_right"> <include @@ -48,12 +53,4 @@ android:layout_centerVertical="true" layout="@layout/play_pause_progress_button"/> </FrameLayout> - - <TextView - android:id="@+id/line_one_right" - style="@style/ListItemSecondaryText.Light.Single" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerVertical="true" - android:layout_alignParentRight="true" /> </RelativeLayout>
\ No newline at end of file diff --git a/res/values/arrays.xml b/res/values/arrays.xml index c9f3bde..258950e 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -19,12 +19,10 @@ <!-- Main TitlePageIndicator titles --> <string-array name="page_titles" translatable="false"> - <item>@string/page_playlists</item> - <item>@string/page_recent</item> <item>@string/page_artists</item> <item>@string/page_albums</item> <item>@string/page_songs</item> - <item>@string/page_genres</item> + <item>@string/page_playlists</item> </string-array> </resources> diff --git a/res/values/colors.xml b/res/values/colors.xml index bbbee0d..3d57335 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -64,7 +64,7 @@ <!-- Color for the action bar --> <color name="header_action_bar_color">#ff31353f</color> <color name="header_action_bar_text_color">@color/white</color> - <color name="bottom_action_bar_text_color">@color/white</color> + <color name="bottom_action_bar_text_color">@color/default_text_color_light</color> <!-- Color for the pop up menu --> @@ -77,6 +77,7 @@ <color name="list_item_text_color">@color/default_text_color</color> <color name="list_item_text_color_light">@color/default_text_color_light</color> <color name="list_item_divider_color">#4c231f20</color> + <color name="grid_list_item_text_color">#cc231f20</color> <!-- Top title page colors --> <color name="tpi_background_color">#fff4f4f4</color> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 72d0749..92aeb23 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -37,26 +37,30 @@ <dimen name="list_item_header_size">16.0sp</dimen> <dimen name="list_item_main_text_size">14.0sp</dimen> <dimen name="list_item_secondary_text_size">12.0sp</dimen> + <dimen name="list_item_queue_text_padding_left">15.0dip</dimen> <!-- List view fast scroll padding left --> <dimen name="fast_scroll_padding_left">8.0dip</dimen> <!-- List view fast scroll padding right --> <dimen name="fast_scroll_padding_right">8.0dip</dimen> <!-- grid view vertical and horizontal spacing --> - <dimen name="grid_item_spacing">4.0dip</dimen> + <dimen name="grid_item_horizontal_spacing">4.0dip</dimen> + <dimen name="grid_item_vertical_spacing">6.0dip</dimen> <!-- List item detailed height --> <dimen name="list_item_detailed_height">120.0dip</dimen> <!-- Top margin of "line_two" --> <dimen name="list_item_line_two_margin_top">8.0dip</dimen> <!-- Left padding in the grid text --> <dimen name="grid_item_padding_left">8.0dip</dimen> + <!-- Left padding in the grid text --> + <dimen name="grid_bottom_height">40dip</dimen> <!-- Grid and list item normal height --> <dimen name="item_normal_height">70.0dip</dimen> <dimen name="list_item_image_height">50.0dip</dimen> <dimen name="list_item_image_width">50.0dip</dimen> <!-- Bottom Action Bar --> - <dimen name="bottom_action_bar_height">48.0dip</dimen> + <dimen name="bottom_action_bar_height">50.0dip</dimen> <dimen name="bottom_action_bar_item_width">56.0dip</dimen> <dimen name="bottom_action_bar_item_padding_left">12.0dip</dimen> <dimen name="bottom_action_bar_item_padding_right">12.0dip</dimen> diff --git a/res/values/strings.xml b/res/values/strings.xml index 108994e..02f0614 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -194,4 +194,6 @@ <string name="header_1_album">1 Album</string> <string name="header_n_albums"><xliff:g id="number">%d</xliff:g> Albums</string> <string name="header_5_plus_albums">5+ Albums</string> + + <string name="combine_two_strings">%1$s | %2$s</string> </resources> diff --git a/res/values/styles.xml b/res/values/styles.xml index 30bd95b..9aa37a0 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -53,12 +53,14 @@ <!-- Sets up the pop up menu text color and size --> <style name="SmallPopupMenu" parent="@android:style/TextAppearance.Widget.PopupMenu.Small"> + <item name="android:fontFamily">sans-serif-light</item> <item name="android:textColor">@color/menu_text_color</item> <item name="android:textSize">@dimen/text_size_medium</item> </style> <!-- Sets up the pop up menu text color and size --> <style name="LargePopupMenu" parent="@android:style/TextAppearance.Widget.PopupMenu.Large"> + <item name="android:fontFamily">sans-serif-light</item> <item name="android:textColor">@color/menu_text_color</item> <item name="android:textSize">@dimen/text_size_medium</item> </style> @@ -88,6 +90,7 @@ <style name="ListItemMainText"> <item name="android:textColor">@color/list_item_text_color</item> <item name="android:textSize">@dimen/list_item_main_text_size</item> + <item name="android:fontFamily">sans-serif</item> <item name="android:textStyle">bold</item> <item name="android:ellipsize">end</item> </style> @@ -96,10 +99,16 @@ <item name="android:singleLine">true</item> </style> + <style name="ListItemMainText.Grid.Single" parent="ListItemMainText.Single"> + <item name="android:textColor">@color/grid_list_item_text_color</item> + </style> + <!-- The list item secondary text style/color --> <style name="ListItemSecondaryText"> <item name="android:textColor">@color/list_item_text_color</item> <item name="android:textSize">@dimen/list_item_secondary_text_size</item> + <item name="android:fontFamily">sans-serif-light</item> + <item name="android:textStyle">normal</item> <item name="android:ellipsize">end</item> </style> @@ -107,6 +116,10 @@ <item name="android:singleLine">true</item> </style> + <style name="ListItemSecondaryText.Grid.Single" parent="ListItemSecondaryText.Single"> + <item name="android:textColor">@color/grid_list_item_text_color</item> + </style> + <style name="ListItemMainText.Light.Single" parent="ListItemMainText.Single"> <item name="android:textColor">@color/list_item_text_color_light</item> </style> @@ -170,18 +183,22 @@ <item name="android:layout_height">wrap_content</item> <item name="android:ellipsize">end</item> <item name="android:paddingLeft">5dp</item> + <item name="android:paddingRight">16dp</item> <item name="android:gravity">top|left|center</item> <item name="android:singleLine">true</item> - <item name="android:textAllCaps">true</item> <item name="android:textColor">@color/bottom_action_bar_text_color</item> - <item name="android:textSize">@dimen/text_size_extra_micro</item> </style> <style name="BottomActionBarLineOne" parent="@style/BottomActionBarText"> + <item name="android:fontFamily">sans-serif</item> <item name="android:textStyle">bold</item> + <item name="android:textSize">@dimen/text_size_small</item> </style> - <style name="BottomActionBarLineTwo" parent="@style/BottomActionBarText"></style> + <style name="BottomActionBarLineTwo" parent="@style/BottomActionBarText"> + <item name="android:fontFamily">sans-serif-light</item> + <item name="android:textSize">@dimen/text_size_extra_micro</item> + </style> <!-- Bottom Action Bar Image Buttons --> <style name="BottomActionBarItem"> diff --git a/res/values/vpi__attrs.xml b/res/values/vpi__attrs.xml index a4d1f10..989d302 100644 --- a/res/values/vpi__attrs.xml +++ b/res/values/vpi__attrs.xml @@ -102,6 +102,8 @@ <attr name="selectedColor" /> <!-- Whether or not the selected item is displayed as bold. --> <attr name="selectedBold" format="boolean" /> + <!-- Whether or not to bold all items. --> + <attr name="boldAll" format="boolean" /> <!-- Color of regular titles. --> <attr name="android:textColor" /> <!-- Size of title text. --> diff --git a/res/values/vpi__defaults.xml b/res/values/vpi__defaults.xml index e4d44cb..84e2dce 100644 --- a/res/values/vpi__defaults.xml +++ b/res/values/vpi__defaults.xml @@ -41,6 +41,7 @@ <integer name="default_title_indicator_line_position">0</integer> <color name="default_title_indicator_selected_color">#FFFFFFFF</color> <bool name="default_title_indicator_selected_bold">true</bool> + <bool name="default_title_indicator_bold_all">false</bool> <color name="default_title_indicator_text_color">#BBFFFFFF</color> <dimen name="default_title_indicator_text_size">15dp</dimen> <dimen name="default_title_indicator_title_padding">5dp</dimen> diff --git a/src/com/cyngn/eleven/adapters/AlbumArtPagerAdapter.java b/src/com/cyngn/eleven/adapters/AlbumArtPagerAdapter.java index 2a03ea6..6303188 100644 --- a/src/com/cyngn/eleven/adapters/AlbumArtPagerAdapter.java +++ b/src/com/cyngn/eleven/adapters/AlbumArtPagerAdapter.java @@ -204,6 +204,12 @@ public class AlbumArtPagerAdapter extends FragmentStatePagerAdapter { if (details != null) { loadImageAsync(details); } else { + // Cancel any previous tasks + if (mTask != null) { + mTask.cancel(true); + mTask = null; + } + mTask = new AlbumArtistLoader(this, getActivity()); ApolloUtils.execute(false, mTask, mAudioId); } diff --git a/src/com/cyngn/eleven/adapters/ArtistAdapter.java b/src/com/cyngn/eleven/adapters/ArtistAdapter.java index dfb5358..46cbe14 100644 --- a/src/com/cyngn/eleven/adapters/ArtistAdapter.java +++ b/src/com/cyngn/eleven/adapters/ArtistAdapter.java @@ -13,6 +13,7 @@ package com.cyngn.eleven.adapters; import android.app.Activity; import android.content.Context; +import android.content.res.Resources; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -165,12 +166,18 @@ public class ArtistAdapter extends ArrayAdapter<Artist> implements SectionAdapte mData[i].mItemId = artist.mArtistId; // Artist names (line one) mData[i].mLineOne = artist.mArtistName; - // Number of albums (line two) - mData[i].mLineTwo = MusicUtils.makeLabel(getContext(), + + String albumNumber = MusicUtils.makeLabel(getContext(), R.plurals.Nalbums, artist.mAlbumNumber); - // Number of songs (line three) - mData[i].mLineThree = MusicUtils.makeLabel(getContext(), + String songNumber = MusicUtils.makeLabel(getContext(), R.plurals.Nsongs, artist.mSongNumber); + + final Resources resources = getContext().getResources(); + // combine the ablum number and song number + String combinedString = resources.getString(R.string.combine_two_strings, + albumNumber, songNumber); + + mData[i].mLineTwo = combinedString; } } diff --git a/src/com/cyngn/eleven/adapters/PagerAdapter.java b/src/com/cyngn/eleven/adapters/PagerAdapter.java index d2e06b7..bfbf30a 100644 --- a/src/com/cyngn/eleven/adapters/PagerAdapter.java +++ b/src/com/cyngn/eleven/adapters/PagerAdapter.java @@ -167,14 +167,6 @@ public class PagerAdapter extends FragmentPagerAdapter { */ public enum MusicFragments { /** - * The playlist fragment - */ - PLAYLIST(PlaylistFragment.class), - /** - * The recent fragment - */ - RECENT(RecentFragment.class), - /** * The artist fragment */ ARTIST(ArtistFragment.class), @@ -187,9 +179,9 @@ public class PagerAdapter extends FragmentPagerAdapter { */ SONG(SongFragment.class), /** - * The genre fragment + * The playlist fragment */ - GENRE(GenreFragment.class); + PLAYLIST(PlaylistFragment.class); private Class<? extends Fragment> mFragmentClass; diff --git a/src/com/cyngn/eleven/adapters/SongAdapter.java b/src/com/cyngn/eleven/adapters/SongAdapter.java index 1cefb05..ac38cf0 100644 --- a/src/com/cyngn/eleven/adapters/SongAdapter.java +++ b/src/com/cyngn/eleven/adapters/SongAdapter.java @@ -11,18 +11,22 @@ package com.cyngn.eleven.adapters; +import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; +import com.cyngn.eleven.cache.ImageFetcher; +import com.cyngn.eleven.model.Artist; import com.cyngn.eleven.model.Song; import com.cyngn.eleven.sectionadapter.SectionAdapter; import com.cyngn.eleven.ui.MusicHolder; import com.cyngn.eleven.ui.MusicHolder.DataHolder; import com.cyngn.eleven.ui.fragments.QueueFragment; import com.cyngn.eleven.ui.fragments.SongFragment; +import com.cyngn.eleven.utils.ApolloUtils; import com.cyngn.eleven.utils.MusicUtils; import com.cyngn.eleven.widgets.PlayPauseProgressButton; @@ -46,6 +50,11 @@ public class SongAdapter extends ArrayAdapter<Song> implements SectionAdapter.Ba private final int mLayoutId; /** + * Image cache and image fetcher + */ + private final ImageFetcher mImageFetcher; + + /** * The index of the item that is currently playing */ private long mCurrentlyPlayingSongId = -1; @@ -61,10 +70,12 @@ public class SongAdapter extends ArrayAdapter<Song> implements SectionAdapter.Ba * @param context The {@link Context} to use. * @param layoutId The resource Id of the view to inflate. */ - public SongAdapter(final Context context, final int layoutId) { + public SongAdapter(final Activity context, final int layoutId) { super(context, 0); // Get the layout Id mLayoutId = layoutId; + // Initialize the cache & image fetcher + mImageFetcher = ApolloUtils.getImageFetcher(context); } /** @@ -77,8 +88,6 @@ public class SongAdapter extends ArrayAdapter<Song> implements SectionAdapter.Ba if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(mLayoutId, parent, false); holder = new MusicHolder(convertView); - // Hide the third line of text - holder.mLineThree.get().setVisibility(View.GONE); convertView.setTag(holder); } else { holder = (MusicHolder)convertView.getTag(); @@ -89,11 +98,16 @@ public class SongAdapter extends ArrayAdapter<Song> implements SectionAdapter.Ba // Set each song name (line one) holder.mLineOne.get().setText(dataHolder.mLineOne); - // Set the song duration (line one, right) - holder.mLineOneRight.get().setText(dataHolder.mLineOneRight); // Set the album name (line two) holder.mLineTwo.get().setText(dataHolder.mLineTwo); + // Asynchronously load the artist image into the adapter + Song item = getItem(position); + if (item.mAlbumId >= 0) { + mImageFetcher.loadAlbumImage(item.mArtistName, item.mAlbumName, item.mAlbumId, + holder.mImage.get()); + } + // padding doesn't apply to included layouts, so we need // to wrap it in a container and show/hide with the container PlayPauseProgressButton playPauseProgressButton = holder.mPlayPauseProgressButton.get(); @@ -155,6 +169,24 @@ public class SongAdapter extends ArrayAdapter<Song> implements SectionAdapter.Ba } /** + * @param pause True to temporarily pause the disk cache, false otherwise. + */ + public void setPauseDiskCache(final boolean pause) { + if (mImageFetcher != null) { + mImageFetcher.setPauseDiskCache(pause); + } + } + + /** + * @param artist The key used to find the cached artist to remove + */ + public void removeFromCache(final Artist artist) { + if (mImageFetcher != null) { + mImageFetcher.removeFromCache(artist.mArtistName); + } + } + + /** * Method that unloads and clears the items in the adapter */ public void unload() { diff --git a/src/com/cyngn/eleven/cache/ImageWorker.java b/src/com/cyngn/eleven/cache/ImageWorker.java index 2e63e4c..66c1fb0 100644 --- a/src/com/cyngn/eleven/cache/ImageWorker.java +++ b/src/com/cyngn/eleven/cache/ImageWorker.java @@ -714,6 +714,15 @@ public abstract class ImageWorker { if (executePotentialWork(key, imageView) && imageView != null && !mImageCache.isDiskCachePaused()) { + // cancel the old task if any + final Drawable previousDrawable = imageView.getDrawable(); + if (previousDrawable != null && previousDrawable instanceof AsyncDrawable) { + BitmapWorkerTask workerTask = ((AsyncDrawable)previousDrawable).getBitmapWorkerTask(); + if (workerTask != null) { + workerTask.cancel(false); + } + } + // Otherwise run the worker task final BitmapWorkerTask bitmapWorkerTask = new BitmapWorkerTask(imageView, imageType); final AsyncDrawable asyncDrawable = new AsyncDrawable(mResources, mDefault, @@ -752,6 +761,15 @@ public abstract class ImageWorker { if (executePotentialWork(blurKey, blurScrimImage) && blurScrimImage != null && !mImageCache.isDiskCachePaused()) { + // cancel the old task if any + final AsyncDrawable previousDrawable = (AsyncDrawable)blurScrimImage.getTag(); + if (previousDrawable != null) { + BitmapWorkerTask workerTask = previousDrawable.getBitmapWorkerTask(); + if (workerTask != null) { + workerTask.cancel(true); + } + } + // Otherwise run the worker task final BlurBitmapWorkerTask blurWorkerTask = new BlurBitmapWorkerTask(blurScrimImage, imageType); final AsyncDrawable asyncDrawable = new AsyncDrawable(mResources, mDefault, diff --git a/src/com/cyngn/eleven/loaders/AlbumSongLoader.java b/src/com/cyngn/eleven/loaders/AlbumSongLoader.java index de7e3b4..d2634d6 100644 --- a/src/com/cyngn/eleven/loaders/AlbumSongLoader.java +++ b/src/com/cyngn/eleven/loaders/AlbumSongLoader.java @@ -90,7 +90,7 @@ public class AlbumSongLoader extends WrappedAsyncTaskLoader<List<Song>> { final int year = mCursor.getInt(5); // Create a new song - final Song song = new Song(id, songName, artist, album, seconds, year); + final Song song = new Song(id, songName, artist, album, mAlbumID, seconds, year); // Add everything up mSongList.add(song); diff --git a/src/com/cyngn/eleven/loaders/ArtistSongLoader.java b/src/com/cyngn/eleven/loaders/ArtistSongLoader.java index 18b7082..a8048c1 100644 --- a/src/com/cyngn/eleven/loaders/ArtistSongLoader.java +++ b/src/com/cyngn/eleven/loaders/ArtistSongLoader.java @@ -77,20 +77,23 @@ public class ArtistSongLoader extends WrappedAsyncTaskLoader<List<Song>> { // Copy the artist name final String artist = mCursor.getString(2); + // Copy the album id + final long albumId = mCursor.getLong(3); + // Copy the album name - final String album = mCursor.getString(3); + final String album = mCursor.getString(4); // Copy the duration - final long duration = mCursor.getLong(4); + final long duration = mCursor.getLong(5); // Convert the duration into seconds final int durationInSecs = (int) duration / 1000; // Grab the Song Year - final int year = mCursor.getInt(5); + final int year = mCursor.getInt(6); // Create a new song - final Song song = new Song(id, songName, artist, album, durationInSecs, year); + final Song song = new Song(id, songName, artist, album, albumId, durationInSecs, year); // Add everything up mSongList.add(song); @@ -124,10 +127,12 @@ public class ArtistSongLoader extends WrappedAsyncTaskLoader<List<Song>> { /* 2 */ AudioColumns.ARTIST, /* 3 */ - AudioColumns.ALBUM, + AudioColumns.ALBUM_ID, /* 4 */ - AudioColumns.DURATION, + AudioColumns.ALBUM, /* 5 */ + AudioColumns.DURATION, + /* 6 */ AudioColumns.YEAR, }, selection.toString(), null, PreferenceUtils.getInstance(context).getArtistSongSortOrder()); diff --git a/src/com/cyngn/eleven/loaders/GenreSongLoader.java b/src/com/cyngn/eleven/loaders/GenreSongLoader.java index 699e8bb..dca0a49 100644 --- a/src/com/cyngn/eleven/loaders/GenreSongLoader.java +++ b/src/com/cyngn/eleven/loaders/GenreSongLoader.java @@ -87,7 +87,7 @@ public class GenreSongLoader extends WrappedAsyncTaskLoader<List<Song>> { final int year = mCursor.getInt(5); // Create a new song - final Song song = new Song(id, songName, artist, album, durationInSecs, year); + final Song song = new Song(id, songName, artist, album, -1, durationInSecs, year); // Add everything up mSongList.add(song); diff --git a/src/com/cyngn/eleven/loaders/LastAddedLoader.java b/src/com/cyngn/eleven/loaders/LastAddedLoader.java index b9e6185..dd46ee4 100644 --- a/src/com/cyngn/eleven/loaders/LastAddedLoader.java +++ b/src/com/cyngn/eleven/loaders/LastAddedLoader.java @@ -55,7 +55,7 @@ public class LastAddedLoader extends WrappedAsyncTaskLoader<List<Song>> { */ @Override public List<Song> loadInBackground() { - // Create the Cursor + // Create the xCursor mCursor = makeLastAddedCursor(getContext()); // Gather the data if (mCursor != null && mCursor.moveToFirst()) { @@ -69,20 +69,23 @@ public class LastAddedLoader extends WrappedAsyncTaskLoader<List<Song>> { // Copy the artist name final String artist = mCursor.getString(2); + // Copy the album id + final long albumId = mCursor.getLong(3); + // Copy the album name - final String album = mCursor.getString(3); + final String album = mCursor.getString(4); // Copy the duration - final long duration = mCursor.getLong(4); + final long duration = mCursor.getLong(5); // Convert the duration into seconds final int durationInSecs = (int) duration / 1000; // Grab the Song Year - final int year = mCursor.getInt(5); + final int year = mCursor.getInt(6); // Create a new song - final Song song = new Song(id, songName, artist, album, durationInSecs, year); + final Song song = new Song(id, songName, artist, album, albumId, durationInSecs, year); // Add everything up mSongList.add(song); @@ -116,10 +119,12 @@ public class LastAddedLoader extends WrappedAsyncTaskLoader<List<Song>> { /* 2 */ AudioColumns.ARTIST, /* 3 */ - AudioColumns.ALBUM, + AudioColumns.ALBUM_ID, /* 4 */ - AudioColumns.DURATION, + AudioColumns.ALBUM, /* 5 */ + AudioColumns.DURATION, + /* 6 */ AudioColumns.YEAR, }, selection.toString(), null, MediaStore.Audio.Media.DATE_ADDED + " DESC"); } diff --git a/src/com/cyngn/eleven/loaders/NowPlayingCursor.java b/src/com/cyngn/eleven/loaders/NowPlayingCursor.java index 00b90e8..9ba333b 100644 --- a/src/com/cyngn/eleven/loaders/NowPlayingCursor.java +++ b/src/com/cyngn/eleven/loaders/NowPlayingCursor.java @@ -32,10 +32,12 @@ public class NowPlayingCursor extends AbstractCursor { /* 2 */ AudioColumns.ARTIST, /* 3 */ - AudioColumns.ALBUM, + AudioColumns.ALBUM_ID, /* 4 */ - AudioColumns.DURATION, + AudioColumns.ALBUM, /* 5 */ + AudioColumns.DURATION, + /* 6 */ AudioColumns.YEAR, }; diff --git a/src/com/cyngn/eleven/loaders/PlaylistSongLoader.java b/src/com/cyngn/eleven/loaders/PlaylistSongLoader.java index 19a0cf0..eba3c8f 100644 --- a/src/com/cyngn/eleven/loaders/PlaylistSongLoader.java +++ b/src/com/cyngn/eleven/loaders/PlaylistSongLoader.java @@ -78,6 +78,10 @@ public class PlaylistSongLoader extends WrappedAsyncTaskLoader<List<Song>> { final String artist = mCursor.getString(mCursor .getColumnIndexOrThrow(AudioColumns.ARTIST)); + // Copy the album id + final long albumId = mCursor.getLong(mCursor + .getColumnIndexOrThrow(AudioColumns.ALBUM_ID)); + // Copy the album name final String album = mCursor.getString(mCursor .getColumnIndexOrThrow(AudioColumns.ALBUM)); @@ -94,7 +98,7 @@ public class PlaylistSongLoader extends WrappedAsyncTaskLoader<List<Song>> { .getColumnIndexOrThrow(AudioColumns.YEAR)); // Create a new song - final Song song = new Song(id, songName, artist, album, durationInSecs, year); + final Song song = new Song(id, songName, artist, album, albumId, durationInSecs, year); // Add everything up mSongList.add(song); @@ -131,10 +135,12 @@ public class PlaylistSongLoader extends WrappedAsyncTaskLoader<List<Song>> { /* 3 */ AudioColumns.ARTIST, /* 4 */ - AudioColumns.ALBUM, + AudioColumns.ALBUM_ID, /* 5 */ - AudioColumns.DURATION, + AudioColumns.ALBUM, /* 6 */ + AudioColumns.DURATION, + /* 7 */ AudioColumns.YEAR, }, mSelection.toString(), null, MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER); diff --git a/src/com/cyngn/eleven/loaders/QueueLoader.java b/src/com/cyngn/eleven/loaders/QueueLoader.java index 7139d05..0ed7095 100644 --- a/src/com/cyngn/eleven/loaders/QueueLoader.java +++ b/src/com/cyngn/eleven/loaders/QueueLoader.java @@ -65,20 +65,23 @@ public class QueueLoader extends WrappedAsyncTaskLoader<List<Song>> { // Copy the artist name final String artist = mCursor.getString(2); + // Copy the album id + final long albumId = mCursor.getLong(3); + // Copy the album name - final String album = mCursor.getString(3); + final String album = mCursor.getString(4); // Copy the duration - final long duration = mCursor.getLong(4); + final long duration = mCursor.getLong(5); // Convert the duration into seconds final int durationInSecs = (int) duration / 1000; // Copy the year - final int year = mCursor.getInt(5); + final int year = mCursor.getInt(6); // Create a new song - final Song song = new Song(id, songName, artist, album, durationInSecs, year); + final Song song = new Song(id, songName, artist, album, albumId, durationInSecs, year); // Add everything up mSongList.add(song); diff --git a/src/com/cyngn/eleven/loaders/SearchLoader.java b/src/com/cyngn/eleven/loaders/SearchLoader.java index a6f957f..4bdd95d 100644 --- a/src/com/cyngn/eleven/loaders/SearchLoader.java +++ b/src/com/cyngn/eleven/loaders/SearchLoader.java @@ -76,6 +76,10 @@ public class SearchLoader extends WrappedAsyncTaskLoader<List<Song>> { final String album = mCursor.getString(mCursor .getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM)); + // Copy the album id + final long albumId = mCursor.getLong(mCursor + .getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM_ID)); + // Check for a album Id if (id < 0 && !TextUtils.isEmpty(album)) { id = mCursor.getLong(mCursor @@ -93,7 +97,7 @@ public class SearchLoader extends WrappedAsyncTaskLoader<List<Song>> { } // Create a new song - final Song song = new Song(id, songName, artist, album, -1, -1); + final Song song = new Song(id, songName, artist, album, albumId, -1, -1); // Add everything up mSongList.add(song); @@ -118,8 +122,8 @@ public class SearchLoader extends WrappedAsyncTaskLoader<List<Song>> { Uri.parse("content://media/external/audio/search/fancy/" + Uri.encode(query)), new String[] { BaseColumns._ID, MediaStore.Audio.Media.MIME_TYPE, - MediaStore.Audio.Artists.ARTIST, MediaStore.Audio.Albums.ALBUM, - MediaStore.Audio.Media.TITLE, "data1", "data2" //$NON-NLS-2$ + MediaStore.Audio.Artists.ARTIST, MediaStore.Audio.Albums.ALBUM_ID, + MediaStore.Audio.Albums.ALBUM, MediaStore.Audio.Media.TITLE, "data1", "data2" //$NON-NLS-2$ }, null, null, null); } diff --git a/src/com/cyngn/eleven/loaders/SongLoader.java b/src/com/cyngn/eleven/loaders/SongLoader.java index 8995ece..c9bca72 100644 --- a/src/com/cyngn/eleven/loaders/SongLoader.java +++ b/src/com/cyngn/eleven/loaders/SongLoader.java @@ -71,20 +71,23 @@ public class SongLoader extends SectionCreator.SimpleListLoader<Song> { // Copy the artist name final String artist = mCursor.getString(2); + // Copy the album id + final long albumId = mCursor.getLong(3); + // Copy the album name - final String album = mCursor.getString(3); + final String album = mCursor.getString(4); // Copy the duration - final long duration = mCursor.getLong(4); + final long duration = mCursor.getLong(5); // Convert the duration into seconds final int durationInSecs = (int) duration / 1000; // Copy the Year - final int year = mCursor.getInt(5); + final int year = mCursor.getInt(6); // Create a new song - final Song song = new Song(id, songName, artist, album, durationInSecs, year); + final Song song = new Song(id, songName, artist, album, albumId, durationInSecs, year); // Add everything up mSongList.add(song); @@ -117,10 +120,12 @@ public class SongLoader extends SectionCreator.SimpleListLoader<Song> { /* 2 */ AudioColumns.ARTIST, /* 3 */ - AudioColumns.ALBUM, + AudioColumns.ALBUM_ID, /* 4 */ - AudioColumns.DURATION, + AudioColumns.ALBUM, /* 5 */ + AudioColumns.DURATION, + /* 6 */ AudioColumns.YEAR, }, mSelection.toString(), null, PreferenceUtils.getInstance(context).getSongSortOrder()); diff --git a/src/com/cyngn/eleven/model/Song.java b/src/com/cyngn/eleven/model/Song.java index e5663bd..53040a1 100644 --- a/src/com/cyngn/eleven/model/Song.java +++ b/src/com/cyngn/eleven/model/Song.java @@ -41,6 +41,11 @@ public class Song { public String mAlbumName; /** + * The album id + */ + public long mAlbumId; + + /** * The song duration in seconds */ public int mDuration; @@ -61,11 +66,12 @@ public class Song { * @param year The year the song was recorded */ public Song(final long songId, final String songName, final String artistName, - final String albumName, final int duration, final int year) { + final String albumName, final long albumId, final int duration, final int year) { mSongId = songId; mSongName = songName; mArtistName = artistName; mAlbumName = albumName; + mAlbumId = albumId; mDuration = duration; mYear = year; } @@ -78,6 +84,7 @@ public class Song { final int prime = 31; int result = 1; result = prime * result + (mAlbumName == null ? 0 : mAlbumName.hashCode()); + result = prime * result + (int) mAlbumId; result = prime * result + (mArtistName == null ? 0 : mArtistName.hashCode()); result = prime * result + mDuration; result = prime * result + (int) mSongId; @@ -107,6 +114,9 @@ public class Song { if (!TextUtils.equals(mAlbumName, other.mAlbumName)) { return false; } + if (mAlbumId != other.mAlbumId) { + return false; + } if (!TextUtils.equals(mArtistName, other.mArtistName)) { return false; } diff --git a/src/com/cyngn/eleven/ui/HeaderBar.java b/src/com/cyngn/eleven/ui/HeaderBar.java index 47ee04c..7ef6391 100644 --- a/src/com/cyngn/eleven/ui/HeaderBar.java +++ b/src/com/cyngn/eleven/ui/HeaderBar.java @@ -38,6 +38,7 @@ public class HeaderBar extends LinearLayout implements View.OnClickListener, private ImageView mMenuButton; private ImageView mCustomButton; + private ImageView mBackButton; private TextView mTitleText; // this tracks the views that want to add to the context menu @@ -63,6 +64,9 @@ public class HeaderBar extends LinearLayout implements View.OnClickListener, mCustomButton.setVisibility(GONE); mCustomButton.setBackground(new HoloSelector(getContext())); + mBackButton = (ImageView)findViewById(R.id.header_bar_up); + mBackButton.setBackground(new HoloSelector(getContext())); + mTitleText = (TextView)findViewById(R.id.header_bar_title); mPopupMenu = new PopupMenu(getContext(), mMenuButton); @@ -191,4 +195,12 @@ public class HeaderBar extends LinearLayout implements View.OnClickListener, mCustomButton.setVisibility(VISIBLE); mCustomButton.setOnClickListener(listener); } + + /** + * Sets the back button listener + * @param listener listener + */ + public void setBackListener(final OnClickListener listener) { + mBackButton.setOnClickListener(listener); + } } diff --git a/src/com/cyngn/eleven/ui/activities/HomeActivity.java b/src/com/cyngn/eleven/ui/activities/HomeActivity.java index 98dc16e..05288c5 100644 --- a/src/com/cyngn/eleven/ui/activities/HomeActivity.java +++ b/src/com/cyngn/eleven/ui/activities/HomeActivity.java @@ -44,12 +44,14 @@ public class HomeActivity extends BaseActivity { Browse, MusicPlayer, Queue, + None, } private SlidingUpPanelLayout mFirstPanel; private HeaderBar mFirstHeaderBar; private SlidingUpPanelLayout mSecondPanel; private HeaderBar mSecondHeaderBar; + private Panel mTargetNavigatePanel; // this is the blurred image that goes behind the now playing and queue fragments private BlurScrimImage mBlurScrimImage; @@ -66,6 +68,8 @@ public class HomeActivity extends BaseActivity { .replace(R.id.activity_base_content, new MusicBrowserPhoneFragment()).commit(); } + mTargetNavigatePanel = Panel.None; + setupFirstPanel(); setupSecondPanel(); @@ -91,6 +95,16 @@ public class HomeActivity extends BaseActivity { getActionBar().show(); } } + + @Override + public void onPanelExpanded(View panel) { + checkTargetNavigation(); + } + + @Override + public void onPanelCollapsed(View panel) { + checkTargetNavigation(); + } }); // setup the header bar @@ -113,8 +127,14 @@ public class HomeActivity extends BaseActivity { } @Override + public void onPanelExpanded(View panel) { + checkTargetNavigation(); + } + + @Override public void onPanelCollapsed(View panel) { mFirstPanel.setSlidingEnabled(true); + checkTargetNavigation(); } }); @@ -195,6 +215,8 @@ public class HomeActivity extends BaseActivity { // TODO: Add ability to do this instantaneously as opposed to animate switch (panel) { case Browse: + // if we are two panels over, we need special logic to jump twice + mTargetNavigatePanel = panel; mSecondPanel.collapsePanel(); mFirstPanel.collapsePanel(); break; @@ -203,12 +225,27 @@ public class HomeActivity extends BaseActivity { mFirstPanel.expandPanel(); break; case Queue: + // if we are two panels over, we need special logic to jump twice + mTargetNavigatePanel = panel; mSecondPanel.expandPanel(); mFirstPanel.expandPanel(); break; } } + /** + * This checks if we are at our target panel, and if not, continues the motion + */ + protected void checkTargetNavigation() { + if (mTargetNavigatePanel != Panel.None) { + if (mTargetNavigatePanel == getCurrentPanel()) { + mTargetNavigatePanel = Panel.None; + } else { + showPanel(mTargetNavigatePanel); + } + } + } + protected Panel getCurrentPanel() { if (mSecondPanel.isPanelExpanded()) { return Panel.Queue; @@ -240,6 +277,12 @@ public class HomeActivity extends BaseActivity { headerBar.setTitleText(textId); headerBar.setupCustomButton(customIconId, listener); headerBar.setBackgroundColor(Color.TRANSPARENT); + headerBar.setBackListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showPanel(Panel.Browse); + } + }); return headerBar; } diff --git a/src/com/cyngn/eleven/ui/fragments/ArtistFragment.java b/src/com/cyngn/eleven/ui/fragments/ArtistFragment.java index b7fd763..13efaac 100644 --- a/src/com/cyngn/eleven/ui/fragments/ArtistFragment.java +++ b/src/com/cyngn/eleven/ui/fragments/ArtistFragment.java @@ -139,7 +139,7 @@ public class ArtistFragment extends Fragment implements LoaderCallbacks<SectionL public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create the adpater - final int layout = R.layout.list_item_simple; + final int layout = R.layout.list_item_normal; ArtistAdapter adapter = new ArtistAdapter(getActivity(), layout); mAdapter = new SectionAdapter<Artist, ArtistAdapter>(getActivity(), adapter); } diff --git a/src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java b/src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java index b3d21d1..3d4a3b3 100644 --- a/src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java +++ b/src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java @@ -376,7 +376,7 @@ public class AudioPlayerFragment extends Fragment implements ServiceConnection { * page adapter */ private void createAndSetAdapter() { - mAlbumArtPagerAdapter = new AlbumArtPagerAdapter(getFragmentManager()); + mAlbumArtPagerAdapter = new AlbumArtPagerAdapter(getChildFragmentManager()); int repeatMode = MusicUtils.getRepeatMode(); int targetSize = 0; diff --git a/src/com/cyngn/eleven/ui/fragments/SongFragment.java b/src/com/cyngn/eleven/ui/fragments/SongFragment.java index cc35a3b..e73e3a7 100644 --- a/src/com/cyngn/eleven/ui/fragments/SongFragment.java +++ b/src/com/cyngn/eleven/ui/fragments/SongFragment.java @@ -27,6 +27,8 @@ import android.view.Menu; import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; +import android.widget.AbsListView; +import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; @@ -59,7 +61,7 @@ import java.util.List; * @author Andrew Neal (andrewdneal@gmail.com) */ public class SongFragment extends Fragment implements LoaderCallbacks<SectionListContainer<Song>>, - OnItemClickListener, MusicStateListener { + OnScrollListener, OnItemClickListener, MusicStateListener { /** * Used to keep context menu items from bleeding into other fragments @@ -134,7 +136,7 @@ public class SongFragment extends Fragment implements LoaderCallbacks<SectionLis public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create the adpater - mAdapter = new SectionAdapter<Song, SongAdapter>(getActivity(), new SongAdapter(getActivity(), R.layout.list_item_simple)); + mAdapter = new SectionAdapter<Song, SongAdapter>(getActivity(), new SongAdapter(getActivity(), R.layout.list_item_normal)); } /** @@ -155,6 +157,8 @@ public class SongFragment extends Fragment implements LoaderCallbacks<SectionLis mListView.setOnCreateContextMenuListener(this); // Play the selected song mListView.setOnItemClickListener(this); + // To help make scrolling smooth + mListView.setOnScrollListener(this); return mRootView; } @@ -270,6 +274,30 @@ public class SongFragment extends Fragment implements LoaderCallbacks<SectionLis * {@inheritDoc} */ @Override + public void onScrollStateChanged(final AbsListView view, final int scrollState) { + // Pause disk cache access to ensure smoother scrolling + if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING + || scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { + mAdapter.getUnderlyingAdapter().setPauseDiskCache(true); + } else { + mAdapter.getUnderlyingAdapter().setPauseDiskCache(false); + mAdapter.notifyDataSetChanged(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void onScroll(final AbsListView view, final int firstVisibleItem, + final int visibleItemCount, final int totalItemCount) { + // Nothing to do + } + + /** + * {@inheritDoc} + */ + @Override public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) { int internalPosition = mAdapter.getInternalPosition(position); diff --git a/src/com/cyngn/eleven/ui/fragments/phone/MusicBrowserPhoneFragment.java b/src/com/cyngn/eleven/ui/fragments/phone/MusicBrowserPhoneFragment.java index 4addbb3..94ccde2 100644 --- a/src/com/cyngn/eleven/ui/fragments/phone/MusicBrowserPhoneFragment.java +++ b/src/com/cyngn/eleven/ui/fragments/phone/MusicBrowserPhoneFragment.java @@ -257,42 +257,38 @@ public class MusicBrowserPhoneFragment extends Fragment implements @Override public void onCenterItemClick(final int position) { // If on the artist fragment, scrolls to the current artist - if (position == 2) { + if (position == MusicFragments.ARTIST.ordinal()) { getArtistFragment().scrollToCurrentArtist(); // If on the album fragment, scrolls to the current album - } else if (position == 3) { + } else if (position == MusicFragments.ALBUM.ordinal()) { getAlbumFragment().scrollToCurrentAlbum(); // If on the song fragment, scrolls to the current song - } else if (position == 4) { + } else if (position == MusicFragments.SONG.ordinal()) { getSongFragment().scrollToCurrentSong(); } } private boolean isArtistPage() { - return mViewPager.getCurrentItem() == 2; + return mViewPager.getCurrentItem() == MusicFragments.ARTIST.ordinal(); } private ArtistFragment getArtistFragment() { - return (ArtistFragment)mPagerAdapter.getFragment(2); + return (ArtistFragment)mPagerAdapter.getFragment(MusicFragments.ARTIST.ordinal()); } private boolean isAlbumPage() { - return mViewPager.getCurrentItem() == 3; + return mViewPager.getCurrentItem() == MusicFragments.ALBUM.ordinal(); } private AlbumFragment getAlbumFragment() { - return (AlbumFragment)mPagerAdapter.getFragment(3); + return (AlbumFragment)mPagerAdapter.getFragment(MusicFragments.ALBUM.ordinal()); } private boolean isSongPage() { - return mViewPager.getCurrentItem() == 4; + return mViewPager.getCurrentItem() == MusicFragments.SONG.ordinal(); } private SongFragment getSongFragment() { - return (SongFragment)mPagerAdapter.getFragment(4); - } - - private boolean isRecentPage() { - return mViewPager.getCurrentItem() == 1; + return (SongFragment)mPagerAdapter.getFragment(MusicFragments.SONG.ordinal()); } } diff --git a/src/com/viewpagerindicator/TitlePageIndicator.java b/src/com/viewpagerindicator/TitlePageIndicator.java index 7b28efd..97e1210 100644 --- a/src/com/viewpagerindicator/TitlePageIndicator.java +++ b/src/com/viewpagerindicator/TitlePageIndicator.java @@ -123,6 +123,7 @@ public class TitlePageIndicator extends View implements PageIndicator { private int mScrollState; private final Paint mPaintText = new Paint(); private boolean mBoldText; + private boolean mBoldAll; private int mColorText; private int mColorSelected; private Path mPath = new Path(); @@ -173,6 +174,7 @@ public class TitlePageIndicator extends View implements PageIndicator { final int defaultLinePosition = res.getInteger(R.integer.default_title_indicator_line_position); final int defaultSelectedColor = res.getColor(R.color.default_title_indicator_selected_color); final boolean defaultSelectedBold = res.getBoolean(R.bool.default_title_indicator_selected_bold); + final boolean defaultBoldAll = res.getBoolean(R.bool.default_title_indicator_bold_all); final int defaultTextColor = res.getColor(R.color.default_title_indicator_text_color); final float defaultTextSize = res.getDimension(R.dimen.default_title_indicator_text_size); final float defaultTitlePadding = res.getDimension(R.dimen.default_title_indicator_title_padding); @@ -195,6 +197,7 @@ public class TitlePageIndicator extends View implements PageIndicator { mColorSelected = a.getColor(R.styleable.TitlePageIndicator_selectedColor, defaultSelectedColor); mColorText = a.getColor(R.styleable.TitlePageIndicator_android_textColor, defaultTextColor); mBoldText = a.getBoolean(R.styleable.TitlePageIndicator_selectedBold, defaultSelectedBold); + mBoldAll = a.getBoolean(R.styleable.TitlePageIndicator_boldAll, defaultBoldAll); final float textSize = a.getDimension(R.styleable.TitlePageIndicator_android_textSize, defaultTextSize); final int footerColor = a.getColor(R.styleable.TitlePageIndicator_footerColor, defaultFooterColor); @@ -292,6 +295,15 @@ public class TitlePageIndicator extends View implements PageIndicator { invalidate(); } + public boolean isBoldAll() { + return mBoldAll; + } + + public void setBoldAll(boolean boldAll) { + mBoldAll = boldAll; + invalidate(); + } + public int getTextColor() { return mColorText; } @@ -462,11 +474,11 @@ public class TitlePageIndicator extends View implements PageIndicator { final CharSequence pageTitle = getTitle(i); //Only set bold if we are within bounds - mPaintText.setFakeBoldText(currentPage && currentBold && mBoldText); + mPaintText.setFakeBoldText(mBoldAll || (currentPage && currentBold && mBoldText)); //Draw text as unselected mPaintText.setColor(mColorText); - if(currentPage && currentSelected) { + if(currentPage && currentSelected && !mBoldAll) { //Fade out/in unselected text as the selected text fades in/out mPaintText.setAlpha(colorTextAlpha - (int)(colorTextAlpha * selectedPercent)); } |