diff --git a/app/build.gradle b/app/build.gradle index 8388683a..799e1dd1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,12 +44,12 @@ android { } } } - compileSdkVersion 22 - buildToolsVersion '22.0.1' + compileSdkVersion 23 + buildToolsVersion '23.0.0' defaultConfig { applicationId "com.kabouzeid.gramophone" minSdkVersion 16 - targetSdkVersion 22 + targetSdkVersion 23 versionCode 64 versionName "0.9.43 beta5" } @@ -75,14 +75,14 @@ dependencies { compile('com.crashlytics.sdk.android:crashlytics:2.5.1@aar') { transitive = true; } - compile 'com.android.support:support-v4:22.2.1' - compile 'com.android.support:support-v13:22.2.1' - compile 'com.android.support:appcompat-v7:22.2.1' - compile 'com.android.support:recyclerview-v7:22.2.1' - compile 'com.android.support:cardview-v7:22.2.1' - compile 'com.android.support:palette-v7:22.2.1' - compile 'com.android.support:design:22.2.1' - compile 'com.android.support:support-annotations:22.2.1' + compile 'com.android.support:support-v4:23.0.0' + compile 'com.android.support:support-v13:23.0.0' + compile 'com.android.support:appcompat-v7:23.0.0' + compile 'com.android.support:recyclerview-v7:23.0.0' + compile 'com.android.support:cardview-v7:23.0.0' + compile 'com.android.support:palette-v7:23.0.0' + compile 'com.android.support:design:23.0.0' + compile 'com.android.support:support-annotations:23.0.0' compile 'com.github.ksoichiro:android-observablescrollview:1.5.2' compile 'asia.ivity.android:drag-sort-listview:1.0' diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html index 247dd329..19218355 100644 --- a/app/src/main/assets/changelog.html +++ b/app/src/main/assets/changelog.html @@ -25,6 +25,13 @@

You can view the changelog dialog again at any time from the about section.

+

Version 0.9.43 beta5

+ +
    +
  1. IMPROVEMENT: The sliding panel should open and close a bit smoother now.. +
  2. +
+

Version 0.9.43 beta4

    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 dc405015..a410aaae 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 @@ -3,6 +3,7 @@ package com.kabouzeid.gramophone.ui.activities.base; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ArgbEvaluator; +import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.content.ComponentName; import android.content.Intent; @@ -25,6 +26,7 @@ import android.support.v4.util.Pair; import android.support.v7.graphics.Palette; import android.support.v7.widget.CardView; import android.support.v7.widget.Toolbar; +import android.util.Property; import android.util.TypedValue; import android.view.GestureDetector; import android.view.MenuItem; @@ -88,6 +90,7 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi private static final int FAB_CIRCULAR_REVEAL_ANIMATION_TIME = 1000; private static final long DEFAULT_PROGRESS_VIEW_REFRESH_INTERVAL = 500; private static final int CMD_REFRESH_PROGRESS_VIEWS = 1; + private static final int SLIDING_PANEL_ANIMATION_STEPS = 1000; @Bind(R.id.play_pause_fab) FloatingActionButton playPauseButton; @@ -165,7 +168,12 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi private AnimatorSet colorTransitionAnimator; - private ArgbEvaluator argbEvaluator = new ArgbEvaluator(); + private ObjectAnimator fabXAnimator; + private ObjectAnimator fabYAnimator; + private ObjectAnimator fabColorAnimator; + private int lastFabStartColor; + private int lastFabEndColor; + private ObjectAnimator miniPlayerAlphaAnimator; @Override protected void onCreate(Bundle savedInstanceState) { @@ -333,13 +341,7 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi private void setUpPlayPauseButtonTint() { int fabColor = colorPlaybackControls && slidingUpPanelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED ? lastPlaybackControlsColor : getThemeColorAccent(); - setPlayPauseButtonTint(fabColor); - } - - private void setPlayPauseButtonTint(int color) { - int fabDrawableColor = ColorUtil.getDrawableColorForBackground(this, color); - playPauseButton.setBackgroundTintList(ColorStateList.valueOf(color)); - playPauseButton.getDrawable().setColorFilter(fabDrawableColor, PorterDuff.Mode.SRC_IN); + FloatingActionButtonProperty.FAB_COLOR.set(playPauseButton, fabColor); } private void setUpMiniPlayer() { @@ -394,16 +396,16 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi @Override public void onPanelSlide(View view, float slideOffset) { - float xTranslation = (dummyFab.getX() + mediaControllerContainer.getX() + footerFrame.getX() - playPauseButton.getLeft()) * slideOffset; - float yTranslation = (dummyFab.getY() + mediaControllerContainer.getY() + footerFrame.getY() - playPauseButton.getTop()) * slideOffset; + initFabXAnimatorIfNecessary(); + initFabYAnimatorIfNecessary(); + initFabColorAnimatorIfNecessary(); + initMiniPlayerAlphaAnimatorIfNecessary(); - playPauseButton.setTranslationX(xTranslation); - playPauseButton.setTranslationY(yTranslation); - - miniPlayer.setAlpha(1 - slideOffset); - - int newColor = colorPlaybackControls ? (int) argbEvaluator.evaluate(slideOffset, getThemeColorAccent(), lastPlaybackControlsColor) : getThemeColorAccent(); - setPlayPauseButtonTint(newColor); + int durationProgress = (int) (SLIDING_PANEL_ANIMATION_STEPS * slideOffset); + fabXAnimator.setCurrentPlayTime(durationProgress); + fabYAnimator.setCurrentPlayTime(durationProgress); + fabColorAnimator.setCurrentPlayTime(durationProgress); + miniPlayerAlphaAnimator.setCurrentPlayTime(durationProgress); } @Override @@ -449,6 +451,52 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi } + private void initFabXAnimatorIfNecessary() { + if (fabXAnimator == null) { + float xTranslation = dummyFab.getX() + mediaControllerContainer.getX() + footerFrame.getX() - playPauseButton.getLeft(); + fabXAnimator = ObjectAnimator.ofFloat(playPauseButton, View.TRANSLATION_X, 0, xTranslation); + fabXAnimator.setDuration(SLIDING_PANEL_ANIMATION_STEPS); + } + } + + private void initFabYAnimatorIfNecessary() { + if (fabYAnimator == null) { + float yTranslation = dummyFab.getY() + mediaControllerContainer.getY() + footerFrame.getY() - playPauseButton.getTop(); + fabYAnimator = ObjectAnimator.ofFloat(playPauseButton, View.TRANSLATION_Y, 0, yTranslation); + fabYAnimator.setDuration(SLIDING_PANEL_ANIMATION_STEPS); + } + } + + private void initFabColorAnimatorIfNecessary() { + int startColor = getThemeColorAccent(); + int endColor; + if (colorPlaybackControls) { + endColor = lastPlaybackControlsColor; + } else { + endColor = startColor; + } + if (fabColorAnimator == null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + fabColorAnimator = ObjectAnimator.ofArgb(playPauseButton, FloatingActionButtonProperty.FAB_COLOR, startColor, endColor); + } else { + fabColorAnimator = ObjectAnimator.ofInt(playPauseButton, FloatingActionButtonProperty.FAB_COLOR, startColor, endColor); + fabColorAnimator.setEvaluator(new ArgbEvaluator()); + } + fabColorAnimator.setDuration(SLIDING_PANEL_ANIMATION_STEPS); + } else if (startColor != lastFabStartColor || endColor != lastFabEndColor) { + fabColorAnimator.setIntValues(startColor, endColor); + } + lastFabStartColor = startColor; + lastFabEndColor = endColor; + } + + private void initMiniPlayerAlphaAnimatorIfNecessary() { + if (miniPlayerAlphaAnimator == null) { + miniPlayerAlphaAnimator = ObjectAnimator.ofFloat(miniPlayer, View.ALPHA, 1, 0); + miniPlayerAlphaAnimator.setDuration(SLIDING_PANEL_ANIMATION_STEPS); + } + } + private void toggleSlidingPanel() { if (slidingUpPanelLayout.getPanelState() != SlidingUpPanelLayout.PanelState.EXPANDED) { slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); @@ -1102,4 +1150,20 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi super.notifyTaskColorChange(color); } } + + private static class FloatingActionButtonProperty { + public static final Property FAB_COLOR = new Property(Integer.class, "fabColor") { + @Override + public void set(FloatingActionButton object, Integer value) { + object.setBackgroundTintList(ColorStateList.valueOf(value)); + object.setRippleColor(shiftColorDown(value)); + object.getDrawable().setColorFilter(ColorUtil.getDrawableColorForBackground(object.getContext(), value), PorterDuff.Mode.SRC_IN); + } + + @Override + public Integer get(FloatingActionButton object) { + return object.getBackgroundTintList() != null ? object.getBackgroundTintList().getDefaultColor() : 0; + } + }; + } } 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 3262f95b..edc514ca 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java @@ -42,8 +42,13 @@ public class ViewUtil { public final static int DEFAULT_COLOR_ANIMATION_DURATION = 500; private static Animator createColorAnimator(Object target, String propertyName, int startColor, int endColor) { - ObjectAnimator animator = ObjectAnimator.ofObject(target, propertyName, - new ArgbEvaluator(), startColor, endColor); + ObjectAnimator animator; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + animator = ObjectAnimator.ofArgb(target, propertyName, startColor, endColor); + } else { + animator = ObjectAnimator.ofInt(target, propertyName, startColor, endColor); + animator.setEvaluator(new ArgbEvaluator()); + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { animator.setInterpolator(new PathInterpolator(0.4f, 0f, 1f, 1f)); diff --git a/app/src/main/res/layout/notification.xml b/app/src/main/res/layout/notification.xml index d9728dae..c5f8ef24 100644 --- a/app/src/main/res/layout/notification.xml +++ b/app/src/main/res/layout/notification.xml @@ -16,16 +16,11 @@ + android:layout_height="64dp"> - - Caja de título grande Barra de progreso alternativa Mostrar tarjeta bajo los controles del reproductor + Controles de reproducción coloreados Ocultar barra inferior No se encontró ningún ecualizador "No se encontró el ID de audio. Intenta otra vez." @@ -157,6 +158,7 @@ Mostrar tarjeta detrás de los botones de control de reproducción (reproducir/pausar, etc.) Si bien la calidad del arte de tapa del almacenamiento tiene mejor calidad, puede tardar más en cargar. Sólo activar si no se quieren artes de tapa de baja resolución. Oculta la barra con la información de reproducción actual en la parte inferior. Aún puedes deslizar el botón de reproducir/pausar en cualquier dirección para abrir la vista de reproducción actual. + El botón de reproducir/pausar, aleatorio y repetir así como la barra de progreso son coloreados con el color vibrante de la carátula del álbum. "No se puede descargar una tapa de álbum coincidente." Buscar en la biblioteca... Escaneando contenido... diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 9d5cd3fd..2dacbd6b 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -119,6 +119,7 @@ Riquadro titolo più grande Cursore di scorrimento alternativo Sfondo card per i controlli di riproduzione + Controlli di riproduzione colorati Nascondi barra inferiore Nessun equalizzatore trovato "Nessun ID audio, riproduci qualcosa e prova di nuovo." @@ -157,6 +158,7 @@ Visualizza un contorno in stile card dietro ai controlli di riproduzione (play, pausa ecc.). Aggira il Media Store; l\'opzione può incrementare la qualità delle copertine, ma a volte causa rallentamenti nel caricamento delle immagini. Abilita soltanto se hai problemi con copertine a bassa risoluzione. Nasconde la barra con le informazioni di riproduzione in basso. È ancora possibile trascinare il pulsante play/pausa in qualsiasi direzione per aprire la schermata In riproduzione. + I pulsanti play/pausa, casuale e ripeti così come la barra d\'avanzamento sono colorati secondo la gamma di colori della copertina. "Impossibile scaricare una copertina adatta." Cerca nella tua libreria... Nuova scannerizzazione media in corso... diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 42b6f95a..19a803e4 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -118,7 +118,7 @@ Nieprzeźroczystość paska stanu Większe pole tytułu Alternatywny pasek postępu - Wyświetlanie karty pod przyciskami odtwarzania + Karta pod przyciskami odtwarzania "Kolorowe przyciski odtwarzania " Ukryj dolną belkę @@ -156,9 +156,10 @@ Zaznacz, a pasek stanu będzie nieprzeźroczysty i nie zasłoni już okładki albumu Zaznacz, a pole nazwy utworu i wykonawcy pod okładką albumu będzie większe Zaznacz, a w odróżnieniu od domyślnego suwaka, pasek postępu nie zasłoni okładki albumu - Zaznacz, a pod przyciskami sterującymi odtwarzaczem (odtwarzanie/pauza, itp.) zostanie wyświetlona karta + Zaznacz, a pod przyciskami sterującymi odtwarzaczem (Graj/Pauzuj, itp.) zostanie wyświetlona karta Pomijaj korzystanie z Media Store, polepszy to jakość okładek, ale może spowodować ich wolniejsze ładowanie. Zaznacz tylko wtedy, gdy masz kłopoty z niską jakością grafik Ukrywa dolną belkę z informacjami o obecnie granym utworze. Nadal można przesuwać przycisk Graj/Pauza w dowolnym kierunku, aby otworzyć widok obecnie granego utworu + Zaznacz, a przyciski \'\'Graj/Pauzuj\'\', \'\'Odtwarzaj Losowo\'\', \'\'Powtórz\'\' oraz pasek postępu, będą w kolorach z okładek albumów "Nie udało się pobrać okładki pasującej do albumu" Szukaj w bibliotece... Ponowny skan nośnika...