Updated from sdk 22 to 23. Also the sliding panel should open and close much smoother now.

This commit is contained in:
Karim Abou Zeid 2015-08-18 17:43:53 +02:00
commit 7d4b34e7b8
8 changed files with 116 additions and 42 deletions

View file

@ -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'

View file

@ -25,6 +25,13 @@
<p>You can view the changelog dialog again at any time from the <i>about</i> section.</p>
<h3>Version 0.9.43 beta5</h3>
<ol>
<li><b>IMPROVEMENT:</b> The sliding panel should open and close a bit smoother now.</a>.
</li>
</ol>
<h3>Version 0.9.43 beta4</h3>
<ol>

View file

@ -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<FloatingActionButton, Integer> FAB_COLOR = new Property<FloatingActionButton, Integer>(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;
}
};
}
}

View file

@ -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));

View file

@ -16,16 +16,11 @@
<!--This FrameLayout IS necessary in order tp prevent fucking TouchWiz to interpret the "background="#00000000" as making the whole notification transparent-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:internal="http://schemas.android.com/apk/prv/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="64dp"
internal:layout_maxHeight="64dp"
internal:layout_minHeight="64dp">
android:layout_height="64dp">
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:internal="http://schemas.android.com/apk/prv/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
@ -35,9 +30,7 @@
android:orientation="horizontal"
tools:ignore="UselessParent">
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:internal="http://schemas.android.com/apk/prv/res/android"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/icon_group"
android:layout_width="@dimen/notification_large_icon_width"
android:layout_height="@dimen/notification_large_icon_height"

View file

@ -119,6 +119,7 @@
<string name="pref_title_larger_title_box_now_playing">Caja de título grande</string>
<string name="pref_title_alternative_progress_slider_now_playing">Barra de progreso alternativa</string>
<string name="pref_title_playback_controller_card_now_playing">Mostrar tarjeta bajo los controles del reproductor</string>
<string name="pref_title_colored_playback_controls_now_playing">Controles de reproducción coloreados</string>
<string name="pref_title_hide_bottom_bar">Ocultar barra inferior</string>
<string name="no_equalizer">No se encontró ningún ecualizador</string>
<string name="no_audio_ID">"No se encontró el ID de audio. Intenta otra vez."</string>
@ -157,6 +158,7 @@
<string name="pref_summary_playback_controller_card_now_playing">Mostrar tarjeta detrás de los botones de control de reproducción (reproducir/pausar, etc.)</string>
<string name="pref_summary_ignore_media_store_artwork">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.</string>
<string name="pref_summary_hide_bottom_bar">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.</string>
<string name="pref_summary_colored_playback_controls_now_playing">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.</string>
<string name="could_not_download_album_cover">"No se puede descargar una tapa de álbum coincidente."</string>
<string name="search_hint">Buscar en la biblioteca...</string>
<string name="rescanning_media">Escaneando contenido...</string>

View file

@ -119,6 +119,7 @@
<string name="pref_title_larger_title_box_now_playing">Riquadro titolo più grande</string>
<string name="pref_title_alternative_progress_slider_now_playing">Cursore di scorrimento alternativo</string>
<string name="pref_title_playback_controller_card_now_playing">Sfondo card per i controlli di riproduzione</string>
<string name="pref_title_colored_playback_controls_now_playing">Controlli di riproduzione colorati</string>
<string name="pref_title_hide_bottom_bar">Nascondi barra inferiore</string>
<string name="no_equalizer">Nessun equalizzatore trovato</string>
<string name="no_audio_ID">"Nessun ID audio, riproduci qualcosa e prova di nuovo."</string>
@ -157,6 +158,7 @@
<string name="pref_summary_playback_controller_card_now_playing">Visualizza un contorno in stile card dietro ai controlli di riproduzione (play, pausa ecc.).</string>
<string name="pref_summary_ignore_media_store_artwork">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.</string>
<string name="pref_summary_hide_bottom_bar">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.</string>
<string name="pref_summary_colored_playback_controls_now_playing">I pulsanti play/pausa, casuale e ripeti così come la barra d\'avanzamento sono colorati secondo la gamma di colori della copertina.</string>
<string name="could_not_download_album_cover">"Impossibile scaricare una copertina adatta."</string>
<string name="search_hint">Cerca nella tua libreria...</string>
<string name="rescanning_media">Nuova scannerizzazione media in corso...</string>

View file

@ -118,7 +118,7 @@
<string name="pref_title_opaque_statusbar_now_playing">Nieprzeźroczystość paska stanu</string>
<string name="pref_title_larger_title_box_now_playing">Większe pole tytułu</string>
<string name="pref_title_alternative_progress_slider_now_playing">Alternatywny pasek postępu</string>
<string name="pref_title_playback_controller_card_now_playing">Wyświetlanie karty pod przyciskami odtwarzania</string>
<string name="pref_title_playback_controller_card_now_playing">Karta pod przyciskami odtwarzania</string>
<string name="pref_title_colored_playback_controls_now_playing">"Kolorowe przyciski odtwarzania
"</string>
<string name="pref_title_hide_bottom_bar">Ukryj dolną belkę</string>
@ -156,9 +156,10 @@
<string name="pref_summary_opaque_statusbar_now_playing">Zaznacz, a pasek stanu będzie nieprzeźroczysty i nie zasłoni już okładki albumu</string>
<string name="pref_summary_larger_title_box_now_playing">Zaznacz, a pole nazwy utworu i wykonawcy pod okładką albumu będzie większe</string>
<string name="pref_summary_alternative_progress_slider_now_playing">Zaznacz, a w odróżnieniu od domyślnego suwaka, pasek postępu nie zasłoni okładki albumu</string>
<string name="pref_summary_playback_controller_card_now_playing">Zaznacz, a pod przyciskami sterującymi odtwarzaczem (odtwarzanie/pauza, itp.) zostanie wyświetlona karta</string>
<string name="pref_summary_playback_controller_card_now_playing">Zaznacz, a pod przyciskami sterującymi odtwarzaczem (Graj/Pauzuj, itp.) zostanie wyświetlona karta</string>
<string name="pref_summary_ignore_media_store_artwork">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</string>
<string name="pref_summary_hide_bottom_bar">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</string>
<string name="pref_summary_colored_playback_controls_now_playing">Zaznacz, a przyciski \'\'Graj/Pauzuj\'\', \'\'Odtwarzaj Losowo\'\', \'\'Powtórz\'\' oraz pasek postępu, będą w kolorach z okładek albumów</string>
<string name="could_not_download_album_cover">"Nie udało się pobrać okładki pasującej do albumu"</string>
<string name="search_hint">Szukaj w bibliotece...</string>
<string name="rescanning_media">Ponowny skan nośnika...</string>