summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml2
-rw-r--r--res/drawable-hdpi/cardcontainer.9.pngbin0 -> 227 bytes
-rw-r--r--res/drawable-mdpi/cardcontainer.9.pngbin0 -> 172 bytes
-rw-r--r--res/drawable-xhdpi/cardcontainer.9.pngbin0 -> 293 bytes
-rw-r--r--res/drawable-xxhdpi/cardcontainer.9.pngbin0 -> 345 bytes
-rw-r--r--res/layout/edit_queue_list_item.xml4
-rw-r--r--res/layout/fragment_music_browser_phone.xml1
-rw-r--r--res/layout/fragment_themes_base.xml47
-rw-r--r--res/layout/grid_base.xml4
-rw-r--r--res/layout/grid_items_normal.xml22
-rw-r--r--res/layout/header_bar.xml1
-rw-r--r--res/layout/list_header.xml3
-rw-r--r--res/layout/list_item_normal.xml2
-rw-r--r--res/layout/list_item_queue.xml31
-rw-r--r--res/values/arrays.xml4
-rw-r--r--res/values/colors.xml3
-rw-r--r--res/values/dimens.xml8
-rw-r--r--res/values/strings.xml2
-rw-r--r--res/values/styles.xml23
-rw-r--r--res/values/vpi__attrs.xml2
-rw-r--r--res/values/vpi__defaults.xml1
-rw-r--r--src/com/cyngn/eleven/adapters/AlbumArtPagerAdapter.java6
-rw-r--r--src/com/cyngn/eleven/adapters/ArtistAdapter.java15
-rw-r--r--src/com/cyngn/eleven/adapters/PagerAdapter.java12
-rw-r--r--src/com/cyngn/eleven/adapters/SongAdapter.java42
-rw-r--r--src/com/cyngn/eleven/cache/ImageWorker.java18
-rw-r--r--src/com/cyngn/eleven/loaders/AlbumSongLoader.java2
-rw-r--r--src/com/cyngn/eleven/loaders/ArtistSongLoader.java17
-rw-r--r--src/com/cyngn/eleven/loaders/GenreSongLoader.java2
-rw-r--r--src/com/cyngn/eleven/loaders/LastAddedLoader.java19
-rw-r--r--src/com/cyngn/eleven/loaders/NowPlayingCursor.java6
-rw-r--r--src/com/cyngn/eleven/loaders/PlaylistSongLoader.java12
-rw-r--r--src/com/cyngn/eleven/loaders/QueueLoader.java11
-rw-r--r--src/com/cyngn/eleven/loaders/SearchLoader.java10
-rw-r--r--src/com/cyngn/eleven/loaders/SongLoader.java17
-rw-r--r--src/com/cyngn/eleven/model/Song.java12
-rw-r--r--src/com/cyngn/eleven/ui/HeaderBar.java12
-rw-r--r--src/com/cyngn/eleven/ui/activities/HomeActivity.java43
-rw-r--r--src/com/cyngn/eleven/ui/fragments/ArtistFragment.java2
-rw-r--r--src/com/cyngn/eleven/ui/fragments/AudioPlayerFragment.java2
-rw-r--r--src/com/cyngn/eleven/ui/fragments/SongFragment.java32
-rw-r--r--src/com/cyngn/eleven/ui/fragments/phone/MusicBrowserPhoneFragment.java22
-rw-r--r--src/com/viewpagerindicator/TitlePageIndicator.java16
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
new file mode 100644
index 0000000..246064e
--- /dev/null
+++ b/res/drawable-hdpi/cardcontainer.9.png
Binary files differ
diff --git a/res/drawable-mdpi/cardcontainer.9.png b/res/drawable-mdpi/cardcontainer.9.png
new file mode 100644
index 0000000..2e6032b
--- /dev/null
+++ b/res/drawable-mdpi/cardcontainer.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/cardcontainer.9.png b/res/drawable-xhdpi/cardcontainer.9.png
new file mode 100644
index 0000000..e019df0
--- /dev/null
+++ b/res/drawable-xhdpi/cardcontainer.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/cardcontainer.9.png b/res/drawable-xxhdpi/cardcontainer.9.png
new file mode 100644
index 0000000..1048fc8
--- /dev/null
+++ b/res/drawable-xxhdpi/cardcontainer.9.png
Binary files differ
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));
}