diff --git a/app/build.gradle b/app/build.gradle
index bec62b59..2be6b1b7 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -119,7 +119,7 @@ dependencies {
compile 'com.github.ksoichiro:android-observablescrollview:1.6.0'
compile 'asia.ivity.android:drag-sort-listview:1.0'
compile 'com.github.semoncat.seekarc:library:0.1'
- compile 'com.github.kabouzeid:AndroidSlidingUpPanel:b08e8a2290'
+ compile 'com.github.kabouzeid:AndroidSlidingUpPanel:484389e6ae'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.okhttp:okhttp:2.5.0'
diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java
index e62da28b..20cdcd15 100644
--- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java
+++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java
@@ -69,12 +69,22 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
});
}
+ public void setAntiDragView(View antiDragView) {
+ slidingUpPanelLayout.setAntiDragView(antiDragView);
+ }
+
protected abstract View createContentView();
@Override
- public void onServiceConnected(ComponentName name, IBinder service) {
+ public void onPlayingMetaChanged() {
+ super.onPlayingMetaChanged();
hideBottomBar(MusicPlayerRemote.getPlayingQueue().isEmpty());
+ }
+
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
super.onServiceConnected(name, service);
+ hideBottomBar(MusicPlayerRemote.getPlayingQueue().isEmpty());
}
@Override
@@ -133,6 +143,7 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
public void hideBottomBar(boolean hide) {
if (hide) {
+ slidingUpPanelLayout.setPanelHeight(0);
slidingUpPanelLayout.post(new Runnable() {
@Override
public void run() {
@@ -140,6 +151,7 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
}
});
} else {
+ slidingUpPanelLayout.setPanelHeight(getResources().getDimensionPixelSize(R.dimen.mini_player_height));
slidingUpPanelLayout.post(new Runnable() {
@Override
public void run() {
@@ -159,6 +171,7 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
@Override
public void onBackPressed() {
+ if (playerFragment.onBackPressed()) return;
if (!isPanelCollapsed()) {
slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
return;
diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerFragment.java
index 38a607da..51e10624 100644
--- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerFragment.java
+++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerFragment.java
@@ -3,6 +3,7 @@ package com.kabouzeid.gramophone.ui.fragments.player;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
+import android.os.Build;
import android.os.Bundle;
import android.support.annotation.ColorInt;
import android.support.v4.app.Fragment;
@@ -13,6 +14,7 @@ import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
+import android.view.ViewAnimationUtils;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.RelativeLayout;
@@ -31,22 +33,22 @@ import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
+import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
-import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
-import com.kabouzeid.gramophone.views.SlidingUpPanelLayout;
import com.kabouzeid.gramophone.views.SquareLayout;
+import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import org.solovyev.android.views.llm.LinearLayoutManager;
import butterknife.Bind;
import butterknife.ButterKnife;
-public class PlayerFragment extends Fragment implements MusicServiceEventListener, Toolbar.OnMenuItemClickListener, PaletteColorHolder, PlayerAlbumCoverFragment.OnColorChangedListener {
+public class PlayerFragment extends Fragment implements MusicServiceEventListener, Toolbar.OnMenuItemClickListener, PaletteColorHolder, PlayerAlbumCoverFragment.OnColorChangedListener, SlidingUpPanelLayout.PanelSlideListener {
public static final String TAG = PlayerFragment.class.getSimpleName();
@Bind(R.id.player_toolbar)
@@ -61,6 +63,8 @@ public class PlayerFragment extends Fragment implements MusicServiceEventListene
SquareLayout albumCoverContainer;
@Bind(R.id.player_content)
RelativeLayout playerContent;
+ @Bind(R.id.color_background)
+ View colorBackground;
private int lastColor;
@@ -70,6 +74,8 @@ public class PlayerFragment extends Fragment implements MusicServiceEventListene
private PlaybackControlsFragment playbackControlsFragment;
private PlayerAlbumCoverFragment playerAlbumCoverFragment;
+ private LinearLayoutManager layoutManager;
+
@Override
public void onAttach(Context context) {
super.onAttach(context);
@@ -115,7 +121,11 @@ public class PlayerFragment extends Fragment implements MusicServiceEventListene
((CabHolder) getActivity())));
// TODO set child size
- recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
+ layoutManager = new LinearLayoutManager(getActivity());
+ recyclerView.setLayoutManager(layoutManager);
+
+ //slidingUpPanelLayout.setParallaxOffset(Util.resolveDimensionPixelSize(activity, R.attr.actionBarSize) + getResources().getDimensionPixelSize(R.dimen.status_bar_padding));
+ slidingUpPanelLayout.setPanelSlideListener(this);
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
@@ -125,8 +135,6 @@ public class PlayerFragment extends Fragment implements MusicServiceEventListene
}
});
-
-
activity.addMusicServiceEventListener(this);
}
@@ -163,13 +171,16 @@ public class PlayerFragment extends Fragment implements MusicServiceEventListene
}
private void setUpPanelAndAlbumCoverHeight() {
- final int availablePanelHeight = slidingUpPanelLayout.getHeight() - playerContent.getHeight();
- final int minPanelHeight = (int) getResources().getDisplayMetrics().density * (72 + 32);
+ int topMargin = getResources().getDimensionPixelSize(R.dimen.status_bar_padding);
+
+ final int availablePanelHeight = slidingUpPanelLayout.getHeight() - playerContent.getHeight() + topMargin;
+ final int minPanelHeight = (int) getResources().getDisplayMetrics().density * (72 + 32) + topMargin;
if (availablePanelHeight < minPanelHeight) {
albumCoverContainer.getLayoutParams().height = albumCoverContainer.getHeight() - (minPanelHeight - availablePanelHeight);
albumCoverContainer.forceSquare(false);
}
slidingUpPanelLayout.setPanelHeight(Math.max(minPanelHeight, availablePanelHeight));
+ ((AbsSlidingMusicPanelActivity) activity).setAntiDragView(slidingUpPanelLayout.findViewById(R.id.player_panel));
}
private void setUpSubFragments() {
@@ -193,7 +204,7 @@ public class PlayerFragment extends Fragment implements MusicServiceEventListene
private void updatePlayerMenu() {
boolean isFavorite = MusicUtil.isFavorite(activity, MusicPlayerRemote.getCurrentSong());
- Drawable favoriteIcon = Util.getTintedDrawable(activity, isFavorite ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_outline_white_24dp, ViewUtil.getToolbarIconColor(activity, ColorUtil.useDarkTextColorOnBackground(lastColor)));
+ Drawable favoriteIcon = Util.getTintedDrawable(activity, isFavorite ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_outline_white_24dp, ViewUtil.getToolbarIconColor(activity, false));
toolbar.getMenu().findItem(R.id.action_toggle_favorite)
.setIcon(favoriteIcon)
.setTitle(isFavorite ? getString(R.string.action_remove_from_favorites) : getString(R.string.action_add_to_favorites));
@@ -205,8 +216,17 @@ public class PlayerFragment extends Fragment implements MusicServiceEventListene
return lastColor;
}
+ @SuppressWarnings("ConstantConditions")
private void animateColorChange(final int newColor) {
- getView().setBackgroundColor(newColor);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ int x = (int) (playbackControlsFragment.playPauseFab.getX() + playbackControlsFragment.playPauseFab.getWidth() / 2 + playbackControlsFragment.getView().getX());
+ int y = (int) (playbackControlsFragment.playPauseFab.getY() + playbackControlsFragment.playPauseFab.getHeight() / 2 + playbackControlsFragment.getView().getY());
+ float startRadius = 0;
+ float endRadius = Math.max(colorBackground.getWidth(), colorBackground.getHeight());
+ slidingUpPanelLayout.setBackgroundColor(lastColor);
+ colorBackground.setBackgroundColor(newColor);
+ ViewAnimationUtils.createCircularReveal(colorBackground, x, y, startRadius, endRadius).setDuration(1000).start();
+ }
lastColor = newColor;
}
@@ -265,6 +285,14 @@ public class PlayerFragment extends Fragment implements MusicServiceEventListene
playbackControlsFragment.resetShowControlsAnimation();
}
+ public boolean onBackPressed() {
+ if (slidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) {
+ slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED);
+ return true;
+ }
+ return false;
+ }
+
@Override
public void onColorChanged(int color) {
animateColorChange(color);
@@ -272,9 +300,39 @@ public class PlayerFragment extends Fragment implements MusicServiceEventListene
callbacks.onPaletteColorChanged();
}
+ @Override
+ public void onPanelSlide(View view, float slide) {
+ float density = getResources().getDisplayMetrics().density;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ playingQueueCard.setCardElevation(density * 6 * slide + 2 * density);
+ }
+ }
+
+ @Override
+ public void onPanelCollapsed(View view) {
+ if (layoutManager.findLastVisibleItemPosition() < 50) {
+ recyclerView.smoothScrollToPosition(0);
+ } else {
+ recyclerView.scrollToPosition(0);
+ }
+ }
+
+ @Override
+ public void onPanelExpanded(View view) {
+
+ }
+
+ @Override
+ public void onPanelAnchored(View view) {
+
+ }
+
+ @Override
+ public void onPanelHidden(View view) {
+
+ }
+
public interface Callbacks {
void onPaletteColorChanged();
}
-
-
}
diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/Util.java b/app/src/main/java/com/kabouzeid/gramophone/util/Util.java
index be01e092..8f28b9d6 100644
--- a/app/src/main/java/com/kabouzeid/gramophone/util/Util.java
+++ b/app/src/main/java/com/kabouzeid/gramophone/util/Util.java
@@ -89,6 +89,13 @@ public class Util {
return drawable;
}
+ public static int resolveDimensionPixelSize(@NonNull Context context, @AttrRes int dimenAttr) {
+ TypedArray a = context.obtainStyledAttributes(new int[]{dimenAttr});
+ int dimensionPixelSize = a.getDimensionPixelSize(0, 0);
+ a.recycle();
+ return dimensionPixelSize;
+ }
+
public static Drawable getTintedDrawable(@NonNull Context context, @DrawableRes int drawableResId, int color) {
Drawable drawable = ContextCompat.getDrawable(context, drawableResId);
if (drawable != null) {
diff --git a/app/src/main/res/layout/fragment_player.xml b/app/src/main/res/layout/fragment_player.xml
index 27a8467a..d56e13c7 100644
--- a/app/src/main/res/layout/fragment_player.xml
+++ b/app/src/main/res/layout/fragment_player.xml
@@ -6,43 +6,52 @@
xmlns:sothree="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:focusable="true"
android:clickable="false"
+ android:focusable="true"
android:gravity="bottom"
- sothree:umanoDragView="@+id/player_panel"
sothree:umanoFadeColor="#00000000"
sothree:umanoOverlay="true"
sothree:umanoPanelHeight="0dp"
sothree:umanoScrollableView="@+id/player_recycler_view"
- sothree:umanoParallaxOffset="32dp"
sothree:umanoShadowHeight="0dp">
-
+ android:layout_height="match_parent">
-
+
+
+ android:orientation="vertical">
+
+
+
+
+
+
+ android:layout_height="wrap_content"
+ android:layout_below="@id/album_cover_container" />
-
-
-
+
@@ -51,7 +60,8 @@
style="@style/Toolbar"
android:layout_marginTop="@dimen/status_bar_padding"
android:background="@android:color/transparent" />
-
+
+
+ app:cardUseCompatPadding="false">
diff --git a/app/src/main/res/values-v23/dimens.xml b/app/src/main/res/values-v23/dimens.xml
new file mode 100644
index 00000000..14c63dcf
--- /dev/null
+++ b/app/src/main/res/values-v23/dimens.xml
@@ -0,0 +1,4 @@
+
+
+ 24dp
+
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 60fcaf49..d869abcd 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -32,7 +32,7 @@