From 93e2dc0346875cfd99ff082b427951d9b0c4f3d5 Mon Sep 17 00:00:00 2001 From: tkashkin Date: Mon, 12 Jun 2017 03:30:56 +0300 Subject: [PATCH] Add synchronized lyrics preference Fix animations --- .../helper/MusicProgressViewUpdateHelper.java | 14 +++++++++-- ...Lyrics.java => AbsSynchronizedLyrics.java} | 4 ++-- .../model/lyrics/SynchronizedLyricsLRC.java | 2 +- .../player/PlayerAlbumCoverFragment.java | 24 ++++++++++++------- .../player/card/CardPlayerFragment.java | 4 ++-- .../player/flat/FlatPlayerFragment.java | 4 ++-- .../gramophone/util/PreferenceUtil.java | 6 +++++ app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ .../main/res/xml/pref_now_playing_screen.xml | 6 +++++ 10 files changed, 50 insertions(+), 18 deletions(-) rename app/src/main/java/com/kabouzeid/gramophone/model/lyrics/{SynchronizedLyrics.java => AbsSynchronizedLyrics.java} (87%) diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicProgressViewUpdateHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicProgressViewUpdateHelper.java index dfa801f9..4f912e89 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicProgressViewUpdateHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicProgressViewUpdateHelper.java @@ -15,6 +15,8 @@ public class MusicProgressViewUpdateHelper extends Handler { private static final int UPDATE_INTERVAL_PAUSED = 500; private Callback callback; + private int intervalPlaying; + private int intervalPaused; public void start() { queueNextRefresh(1); @@ -26,6 +28,14 @@ public class MusicProgressViewUpdateHelper extends Handler { public MusicProgressViewUpdateHelper(Callback callback) { this.callback = callback; + this.intervalPlaying = UPDATE_INTERVAL_PLAYING; + this.intervalPaused = UPDATE_INTERVAL_PAUSED; + } + + public MusicProgressViewUpdateHelper(Callback callback, int intervalPlaying, int intervalPaused) { + this.callback = callback; + this.intervalPlaying = intervalPlaying; + this.intervalPaused = intervalPaused; } @Override @@ -43,10 +53,10 @@ public class MusicProgressViewUpdateHelper extends Handler { callback.onUpdateProgressViews(progressMillis, totalMillis); if (!MusicPlayerRemote.isPlaying()) { - return UPDATE_INTERVAL_PAUSED; + return intervalPaused; } - final int remainingMillis = UPDATE_INTERVAL_PLAYING - progressMillis % UPDATE_INTERVAL_PLAYING; + final int remainingMillis = intervalPlaying - progressMillis % intervalPlaying; return Math.max(MIN_INTERVAL, remainingMillis); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/lyrics/SynchronizedLyrics.java b/app/src/main/java/com/kabouzeid/gramophone/model/lyrics/AbsSynchronizedLyrics.java similarity index 87% rename from app/src/main/java/com/kabouzeid/gramophone/model/lyrics/SynchronizedLyrics.java rename to app/src/main/java/com/kabouzeid/gramophone/model/lyrics/AbsSynchronizedLyrics.java index d0a6d748..d3052045 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/lyrics/SynchronizedLyrics.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/lyrics/AbsSynchronizedLyrics.java @@ -2,10 +2,10 @@ package com.kabouzeid.gramophone.model.lyrics; import android.util.SparseArray; -public abstract class SynchronizedLyrics { +public abstract class AbsSynchronizedLyrics { public final SparseArray lines = new SparseArray<>(); - public static SynchronizedLyrics parse(String data) + public static AbsSynchronizedLyrics parse(String data) { return new SynchronizedLyricsLRC(data); // no another formats at the moment } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/lyrics/SynchronizedLyricsLRC.java b/app/src/main/java/com/kabouzeid/gramophone/model/lyrics/SynchronizedLyricsLRC.java index b59ebb9b..e0b43eda 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/lyrics/SynchronizedLyricsLRC.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/lyrics/SynchronizedLyricsLRC.java @@ -3,7 +3,7 @@ package com.kabouzeid.gramophone.model.lyrics; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class SynchronizedLyricsLRC extends SynchronizedLyrics { +public class SynchronizedLyricsLRC extends AbsSynchronizedLyrics { private static Pattern LRC_LINE_PATTERN = Pattern.compile("((?:\\[.*?\\])+)(.*)"); private static Pattern LRC_TIME_PATTERN = Pattern.compile("\\[(\\d\\d):(\\d\\d)(?:\\.(\\d\\d))\\]"); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerAlbumCoverFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerAlbumCoverFragment.java index 388b5a83..8e5c957d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerAlbumCoverFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerAlbumCoverFragment.java @@ -19,8 +19,9 @@ import com.kabouzeid.gramophone.adapter.AlbumCoverPagerAdapter; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.MusicProgressViewUpdateHelper; import com.kabouzeid.gramophone.misc.SimpleAnimatorListener; -import com.kabouzeid.gramophone.model.lyrics.SynchronizedLyrics; +import com.kabouzeid.gramophone.model.lyrics.AbsSynchronizedLyrics; import com.kabouzeid.gramophone.ui.fragments.AbsMusicServiceFragment; +import com.kabouzeid.gramophone.util.PreferenceUtil; import com.kabouzeid.gramophone.util.ViewUtil; import butterknife.BindView; @@ -50,7 +51,7 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements private Callbacks callbacks; private int currentPosition; - private SynchronizedLyrics synchronizedLyrics; + private AbsSynchronizedLyrics synchronizedLyrics; private MusicProgressViewUpdateHelper progressViewUpdateHelper; @Override @@ -82,7 +83,7 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements return gestureDetector.onTouchEvent(event); } }); - progressViewUpdateHelper = new MusicProgressViewUpdateHelper(this); + progressViewUpdateHelper = new MusicProgressViewUpdateHelper(this, 500, 1000); progressViewUpdateHelper.start(); } @@ -180,7 +181,7 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements .start(); } - public void setSynchronizedLyrics(SynchronizedLyrics sLyrics) + public void setSynchronizedLyrics(AbsSynchronizedLyrics sLyrics) { if(sLyrics == null || sLyrics.lines.size() == 0) { @@ -206,12 +207,15 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements @Override public void onUpdateProgressViews(int progress, int total) { - if(synchronizedLyrics == null || synchronizedLyrics.lines.size() == 0) { + if(synchronizedLyrics == null || synchronizedLyrics.lines.size() == 0 || !PreferenceUtil.getInstance(getActivity()).synchronizedLyricsShow()) { + lyrics.setVisibility(View.GONE); lyricsLine1.setText(null); lyricsLine2.setText(null); return; } + lyrics.setVisibility(View.VISIBLE); + String oldLine = lyricsLine2.getText().toString(); String line = synchronizedLyrics.getLine(progress); @@ -219,17 +223,19 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements { lyricsLine1.setText(oldLine); lyricsLine2.setText(line); + lyricsLine1.setVisibility(View.VISIBLE); lyricsLine2.setVisibility(View.VISIBLE); - int l1h = lyricsLine1.getMeasuredHeight(); - int l2h = lyricsLine2.getMeasuredHeight(); + + lyricsLine2.measure(View.MeasureSpec.makeMeasureSpec(lyricsLine2.getMeasuredWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.UNSPECIFIED); + int h = lyricsLine2.getMeasuredHeight(); this.lyricsLine1.setAlpha(1f); this.lyricsLine1.setTranslationY(0f); - this.lyricsLine1.animate().alpha(0f).translationY(-l1h).setDuration(300); + this.lyricsLine1.animate().alpha(0f).translationY(-h).setDuration(300); this.lyricsLine2.setAlpha(0f); - this.lyricsLine2.setTranslationY(l2h); + this.lyricsLine2.setTranslationY(h); this.lyricsLine2.animate().alpha(1f).translationY(0f).setDuration(300); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java index ee1aa02f..bb7c9b4e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java @@ -42,7 +42,7 @@ import com.kabouzeid.gramophone.dialogs.SongShareDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.menu.SongMenuHelper; import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.model.lyrics.SynchronizedLyrics; +import com.kabouzeid.gramophone.model.lyrics.AbsSynchronizedLyrics; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.fragments.player.AbsPlayerFragment; import com.kabouzeid.gramophone.ui.fragments.player.PlayerAlbumCoverFragment; @@ -335,7 +335,7 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum } } else { lyricsInfo = new LyricsDialog.LyricInfo(song.title, lyrics); - playerAlbumCoverFragment.setSynchronizedLyrics(SynchronizedLyrics.parse(lyrics)); + playerAlbumCoverFragment.setSynchronizedLyrics(AbsSynchronizedLyrics.parse(lyrics)); Activity activity = getActivity(); if (toolbar != null && activity != null) if (toolbar.getMenu().findItem(R.id.action_show_lyrics) == null) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java index c52c2dfd..af4a65b2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/flat/FlatPlayerFragment.java @@ -40,7 +40,7 @@ import com.kabouzeid.gramophone.dialogs.SongShareDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.menu.SongMenuHelper; import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.model.lyrics.SynchronizedLyrics; +import com.kabouzeid.gramophone.model.lyrics.AbsSynchronizedLyrics; import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.fragments.player.AbsPlayerFragment; import com.kabouzeid.gramophone.ui.fragments.player.PlayerAlbumCoverFragment; @@ -331,7 +331,7 @@ public class FlatPlayerFragment extends AbsPlayerFragment implements PlayerAlbum } } else { lyricsInfo = new LyricsDialog.LyricInfo(song.title, lyrics); - playerAlbumCoverFragment.setSynchronizedLyrics(SynchronizedLyrics.parse(lyrics)); + playerAlbumCoverFragment.setSynchronizedLyrics(AbsSynchronizedLyrics.parse(lyrics)); Activity activity = getActivity(); if (toolbar != null && activity != null) if (toolbar.getMenu().findItem(R.id.action_show_lyrics) == null) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java index a893218c..565df23e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java @@ -69,6 +69,8 @@ public final class PreferenceUtil { public static final String START_DIRECTORY = "start_directory"; + public static final String SYNCHRONIZED_LYRICS_SHOW = "synchronized_lyrics_show"; + private static PreferenceUtil sInstance; private final SharedPreferences mPreferences; @@ -400,4 +402,8 @@ public final class PreferenceUtil { editor.putString(START_DIRECTORY, file.getPath()); editor.apply(); } + + public final boolean synchronizedLyricsShow() { + return mPreferences.getBoolean(SYNCHRONIZED_LYRICS_SHOW, true); + } } diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2dee984d..cd4b66b1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -135,6 +135,7 @@ Показывать подложку под кнопками Окрашенные кнопки управления воспроизведением Уменьшить громкость при уведомлених + Показывать синхронизированные тексты Эквалайзер не найден. "Сначала воспроизведите песню, а затем попробуйте снова." Удалить @@ -173,6 +174,7 @@ Окрашивает панель навигации в основной цвет. Окрашивает шорткаты в основной цвет. Уведомления, навигация, т.д. + Показывать синхронизированные тексты песен при их наличии "\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u043e\u0431\u043b\u043e\u0436\u043a\u0443 \u0430\u043b\u044c\u0431\u043e\u043c\u0430." Поиск библиотеки... Повторное сканирование медиа... diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f50e1172..e03e2380 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -146,6 +146,7 @@ Colored playback controls Reduce volume on focus loss Last added playlist interval + Show synchronized lyrics No equalizer found. "Play a song first, then try again." Delete @@ -185,6 +186,7 @@ Colors the navigation bar in the primary color. Colors the app shortcuts in the primary color. Notifications, navigation etc. + Show synchronized lyrics for song if available "Couldn\u2019t download a matching album cover." Search your library… Rescanning media… diff --git a/app/src/main/res/xml/pref_now_playing_screen.xml b/app/src/main/res/xml/pref_now_playing_screen.xml index 33a1f66c..83f548a1 100644 --- a/app/src/main/res/xml/pref_now_playing_screen.xml +++ b/app/src/main/res/xml/pref_now_playing_screen.xml @@ -7,6 +7,12 @@ android:key="now_playing_screen_id" android:title="@string/pref_title_now_playing_screen_appearance" /> + + \ No newline at end of file