diff --git a/app/build.gradle b/app/build.gradle index 6ccc6967..9f059cfa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,13 +16,13 @@ repositories { android { - compileSdkVersion 21 + compileSdkVersion 22 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.kabouzeid.gramophone" minSdkVersion 16 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } @@ -42,12 +42,13 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:21.0.0' - compile 'com.android.support:gridlayout-v7:21.0.0' - compile 'com.android.support:recyclerview-v7:21.0.0' - compile 'com.android.support:palette-v7:21.0.0' - compile 'com.android.support:support-v13:21.0.0' - compile 'com.android.support:cardview-v7:21.0.0' + compile 'com.afollestad:material-dialogs:0.6.4.1' + compile 'com.android.support:appcompat-v7:22.0.0' + compile 'com.android.support:recyclerview-v7:22.0.0' + compile 'com.android.support:gridlayout-v7:22.0.0' + compile 'com.android.support:palette-v7:22.0.0' + compile 'com.android.support:support-v13:22.0.0' + compile 'com.android.support:cardview-v7:22.0.0' compile 'com.nhaarman.listviewanimations:lib-core:3.1.0@aar' compile 'com.nhaarman.listviewanimations:lib-manipulation:3.1.0@aar' compile 'com.nhaarman.listviewanimations:lib-core-slh:3.1.0@aar' @@ -57,7 +58,6 @@ dependencies { compile 'com.mcxiaoke.volley:library:1.0.+' compile 'com.squareup.picasso:picasso:2.5.0' compile 'com.squareup:otto:1.3.6' - compile 'com.afollestad:material-dialogs:0.6.3.4' compile('com.crashlytics.sdk.android:crashlytics:2.2.1@aar') { transitive = true; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/ArtistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/ArtistSongAdapter.java index dd90e84e..2665eeb6 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/ArtistSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/ArtistSongAdapter.java @@ -77,7 +77,9 @@ public class ArtistSongAdapter extends ArrayAdapter { SongDetailDialogHelper.getDialog(activity, songFile).show(); return true; case R.id.action_go_to_album: - Pair[] albumPairs = null; + Pair[] albumPairs = new Pair[]{ + Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_cover)) + }; if (activity instanceof AbsFabActivity) albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); NavigationUtil.goToAlbum(activity, song.albumId, albumPairs); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java index 4593a0e2..35239814 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java @@ -104,7 +104,9 @@ public class SongAdapter extends RecyclerView.Adapter { SongDetailDialogHelper.getDialog(activity, songFile).show(); return true; case R.id.action_go_to_album: - Pair[] albumPairs = null; + Pair[] albumPairs = new Pair[]{ + Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_cover)) + }; if (activity instanceof AbsFabActivity) albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); NavigationUtil.goToAlbum(activity, dataSet.get(getPosition()).albumId, albumPairs); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index 282047e6..c0f3bdb1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -10,6 +10,8 @@ import android.support.v7.graphics.Palette; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; +import android.text.Html; +import android.text.Spanned; import android.transition.Transition; import android.view.LayoutInflater; import android.view.Menu; @@ -20,12 +22,13 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import com.afollestad.materialdialogs.MaterialDialog; import com.github.ksoichiro.android.observablescrollview.ObservableListView; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.adapter.AlbumAdapter; import com.kabouzeid.gramophone.adapter.ArtistAlbumAdapter; import com.kabouzeid.gramophone.adapter.songadapter.ArtistSongAdapter; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistBiographyLoader; import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistImageUrlLoader; import com.kabouzeid.gramophone.loader.ArtistAlbumLoader; import com.kabouzeid.gramophone.loader.ArtistLoader; @@ -76,6 +79,8 @@ public class ArtistDetailActivity extends AbsFabActivity { private View songListHeader; private RecyclerView albumRecyclerView; + private Spanned biography; + private SmallObservableScrollViewCallbacks observableScrollViewCallbacks = new SmallObservableScrollViewCallbacks() { @Override public void onScrollChanged(int scrollY, boolean b, boolean b2) { @@ -134,7 +139,9 @@ public class ArtistDetailActivity extends AbsFabActivity { artistNameTv = (TextView) findViewById(R.id.artist_name); songsBackgroundView = findViewById(R.id.list_background); statusBar = findViewById(R.id.statusBar); + songListHeader = LayoutInflater.from(this).inflate(R.layout.artist_detail_header, songListView, false); + albumRecyclerView = (RecyclerView) songListHeader.findViewById(R.id.recycler_view); } private void setUpObservableListViewParams() { @@ -162,6 +169,7 @@ public class ArtistDetailActivity extends AbsFabActivity { }); setUpSongListView(); setUpAlbumRecyclerView(); + loadBiography(); } private void setUpSongListView() { @@ -196,14 +204,33 @@ public class ArtistDetailActivity extends AbsFabActivity { }); } - private void setUpAlbumRecyclerView(){ - albumRecyclerView = (RecyclerView) songListHeader.findViewById(R.id.recycler_view); + private void setUpAlbumRecyclerView() { albumRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); List albums = ArtistAlbumLoader.getArtistAlbumList(this, artist.id); ArtistAlbumAdapter albumAdapter = new ArtistAlbumAdapter(this, albums); albumRecyclerView.setAdapter(albumAdapter); } + private void loadBiography() { + LastFMArtistBiographyLoader.loadArtistBio(this, artist.name, new LastFMArtistBiographyLoader.ArtistBioLoaderCallback() { + @Override + public void onArtistBioLoaded(String bio) { + if (bio != null && !bio.trim().equals("")) { + biography = Html.fromHtml(bio); + } else { + biography = null; + } + } + }); + } + + private MaterialDialog getBiographyDialog(){ + return new MaterialDialog.Builder(ArtistDetailActivity.this) + .title(artist.name) + .content(biography) + .build(); + } + private void setListViewPadding() { if (Util.isInPortraitMode(this) || Util.isTablet(this)) { songListView.setPadding(0, artistImageViewHeight + titleViewHeight, 0, Util.getNavigationBarHeight(this)); @@ -285,6 +312,13 @@ public class ArtistDetailActivity extends AbsFabActivity { case android.R.id.home: super.onBackPressed(); return true; + case R.id.action_biography: + if(biography != null){ + getBiographyDialog().show(); + } else { + Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.biography_unavailable), Toast.LENGTH_SHORT).show(); + } + return true; case R.id.action_re_download_artist_image: Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updating), Toast.LENGTH_SHORT).show(); setUpArtistImageAndApplyPalette(true); @@ -312,7 +346,7 @@ public class ArtistDetailActivity extends AbsFabActivity { } @TargetApi(Build.VERSION_CODES.LOLLIPOP) - private void fixLollipopTransitionImageWrongSize(){ + private void fixLollipopTransitionImageWrongSize() { getWindow().getSharedElementEnterTransition().addListener(new Transition.TransitionListener() { @Override public void onTransitionStart(Transition transition) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java index efb1c865..9aea523b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java @@ -5,7 +5,6 @@ import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.os.Bundle; -import android.support.v4.util.Pair; import android.support.v7.graphics.Palette; import android.support.v7.widget.Toolbar; import android.view.Menu; @@ -37,7 +36,6 @@ import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.ViewUtil; import com.nineoldandroids.view.ViewPropertyAnimator; -import com.squareup.otto.Subscribe; import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; @@ -231,7 +229,6 @@ public class MusicControllerActivity extends AbsFabActivity { } private void setUpAlbumArtAndApplyPalette() { - setStandardColors(); Picasso.with(this) .load(MusicUtil.getAlbumArtUri(song.albumId)) .placeholder(R.drawable.default_album_art) @@ -242,6 +239,12 @@ public class MusicControllerActivity extends AbsFabActivity { final Bitmap bitmap = ((BitmapDrawable) albumArt.getDrawable()).getBitmap(); if (bitmap != null) applyPalette(bitmap); } + + @Override + public void onError() { + super.onError(); + setStandardColors(); + } }); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java index 550c973d..1385b306 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java @@ -6,9 +6,11 @@ import android.os.Build; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import android.view.animation.AccelerateInterpolator; import android.view.animation.PathInterpolator; import android.widget.ListAdapter; import android.widget.ListView; +import android.widget.TextView; /** * Created by karim on 06.12.14. @@ -95,4 +97,16 @@ public class ViewUtil { } }); } + + public static void animateTextViewMaxLines(TextView text, int maxLines) { + try { + ObjectAnimator animation = ObjectAnimator.ofInt(text, "maxLines", maxLines); + animation.setInterpolator(new AccelerateInterpolator()); + animation.setDuration(200); + animation.start(); + } catch (Exception e) { + // Some devices crash at runtime when using the ObjectAnimator + text.setMaxLines(maxLines); + } + } } diff --git a/app/src/main/res/drawable/image_background.xml b/app/src/main/res/drawable/image_background.xml deleted file mode 100644 index f30c6f66..00000000 --- a/app/src/main/res/drawable/image_background.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout-v21/notification_playing.xml b/app/src/main/res/layout-v21/notification_playing.xml index 41219157..d2e06f2f 100644 --- a/app/src/main/res/layout-v21/notification_playing.xml +++ b/app/src/main/res/layout-v21/notification_playing.xml @@ -16,12 +16,9 @@ --> + android:orientation="horizontal"> + - + - + + + + + + + android:layout_height="@dimen/title_view_height" + android:height="@dimen/title_view_height" + android:background="@color/materialmusic_default_bar_color" + android:elevation="@dimen/toolbar_elevation" + android:fontFamily="sans-serif-medium" + android:gravity="center_vertical" + android:paddingLeft="72dp" + android:paddingRight="72dp" + android:singleLine="true" + android:textAppearance="@style/TextAppearance.AppCompat.Title" + android:textColor="?attr/title_text_color"/> - - + android:background="@android:color/transparent"/> - + + + + + android:layout_height="@dimen/statusMargin" + android:background="@android:color/transparent"/> - - - - - - - + android:layout_height="?attr/actionBarSize" + android:background="@android:color/transparent"/> + - - - - - - - - + + diff --git a/app/src/main/res/layout/activity_artist_detail.xml b/app/src/main/res/layout/activity_artist_detail.xml index afc96b37..5f8c9e8d 100644 --- a/app/src/main/res/layout/activity_artist_detail.xml +++ b/app/src/main/res/layout/activity_artist_detail.xml @@ -1,87 +1,81 @@ - + - + - + + + + + + + android:layout_height="@dimen/title_view_height" + android:height="@dimen/title_view_height" + android:background="@color/materialmusic_default_bar_color" + android:elevation="@dimen/toolbar_elevation" + android:fontFamily="sans-serif-medium" + android:gravity="center_vertical" + android:paddingLeft="72dp" + android:paddingRight="72dp" + android:singleLine="true" + android:textAppearance="@style/TextAppearance.AppCompat.Title" + android:textColor="?attr/title_text_color"/> - - + android:background="@android:color/transparent"/> - + + + + + android:layout_height="@dimen/statusMargin" + android:background="@android:color/transparent"/> - - - - - - - + android:layout_height="?attr/actionBarSize" + android:background="@android:color/transparent"/> + - - - - - - - - + + diff --git a/app/src/main/res/layout/artist_detail_header.xml b/app/src/main/res/layout/artist_detail_header.xml index 9f16819a..45a6ecb4 100644 --- a/app/src/main/res/layout/artist_detail_header.xml +++ b/app/src/main/res/layout/artist_detail_header.xml @@ -10,8 +10,10 @@ android:fontFamily="sans-serif" android:gravity="center_vertical" android:paddingLeft="16dp" + android:paddingRight="16dp" android:text="@string/albums" - android:textAppearance="@style/TextAppearance.AppCompat.Subhead"/> + android:textAppearance="@style/TextAppearance.AppCompat.Subhead" + android:textColor="?title_text_color"/> + android:textAppearance="@style/TextAppearance.AppCompat.Subhead" + android:textColor="?title_text_color"/> \ No newline at end of file diff --git a/app/src/main/res/layout/item_list_artist_song.xml b/app/src/main/res/layout/item_list_artist_song.xml index dcedb1b8..ed33e003 100644 --- a/app/src/main/res/layout/item_list_artist_song.xml +++ b/app/src/main/res/layout/item_list_artist_song.xml @@ -12,7 +12,6 @@ android:layout_width="60dp" android:layout_height="60dp" android:layout_gravity="center" - android:background="@drawable/image_background" android:gravity="center" android:scaleType="centerCrop" /> diff --git a/app/src/main/res/layout/item_list_search.xml b/app/src/main/res/layout/item_list_search.xml index abdb6bdc..05a374cb 100644 --- a/app/src/main/res/layout/item_list_search.xml +++ b/app/src/main/res/layout/item_list_search.xml @@ -12,7 +12,6 @@ android:layout_width="60dp" android:layout_height="60dp" android:layout_gravity="center" - android:background="@drawable/image_background" android:gravity="center" android:scaleType="centerCrop" /> diff --git a/app/src/main/res/layout/notification_playing.xml b/app/src/main/res/layout/notification_playing.xml index cecb91a2..7028e52d 100644 --- a/app/src/main/res/layout/notification_playing.xml +++ b/app/src/main/res/layout/notification_playing.xml @@ -16,12 +16,9 @@ --> + android:orientation="horizontal"> + + Sorry - an error occurred while attempting to play this song Hello blank fragment Sorry, we were not able to find a matching biography for this artist. - biography - songs - albums + Biography We were not able to gain audio focus. TagEditorActivity Hello world! @@ -72,5 +70,6 @@ Update artist image Updated artist image for Updating… + Loading…