Add synchronized lyrics preference
Fix animations
This commit is contained in:
parent
dbb6250c06
commit
93e2dc0346
10 changed files with 50 additions and 18 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<String> 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
|
||||
}
|
||||
|
|
@ -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))\\]");
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -135,6 +135,7 @@
|
|||
<string name="pref_title_playback_controller_card_now_playing">Показывать подложку под кнопками</string>
|
||||
<string name="pref_title_colored_playback_controls_now_playing">Окрашенные кнопки управления воспроизведением</string>
|
||||
<string name="pref_title_audio_ducking">Уменьшить громкость при уведомлених</string>
|
||||
<string name="pref_title_synchronized_lyrics_show">Показывать синхронизированные тексты</string>
|
||||
<string name="no_equalizer">Эквалайзер не найден.</string>
|
||||
<string name="no_audio_ID">"Сначала воспроизведите песню, а затем попробуйте снова."</string>
|
||||
<string name="delete_action">Удалить</string>
|
||||
|
|
@ -173,6 +174,7 @@
|
|||
<string name="pref_summary_colored_navigation_bar">Окрашивает панель навигации в основной цвет.</string>
|
||||
<string name="pref_summary_colored_app_shortcuts">Окрашивает шорткаты в основной цвет.</string>
|
||||
<string name="pref_summary_audio_ducking">Уведомления, навигация, т.д.</string>
|
||||
<string name="pref_summary_synchronized_lyrics_show">Показывать синхронизированные тексты песен при их наличии</string>
|
||||
<string name="could_not_download_album_cover">"\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."</string>
|
||||
<string name="search_hint">Поиск библиотеки...</string>
|
||||
<string name="rescanning_media">Повторное сканирование медиа...</string>
|
||||
|
|
|
|||
|
|
@ -146,6 +146,7 @@
|
|||
<string name="pref_title_colored_playback_controls_now_playing">Colored playback controls</string>
|
||||
<string name="pref_title_audio_ducking">Reduce volume on focus loss</string>
|
||||
<string name="pref_title_last_added_interval">Last added playlist interval</string>
|
||||
<string name="pref_title_synchronized_lyrics_show">Show synchronized lyrics</string>
|
||||
<string name="no_equalizer">No equalizer found.</string>
|
||||
<string name="no_audio_ID">"Play a song first, then try again."</string>
|
||||
<string name="delete_action">Delete</string>
|
||||
|
|
@ -185,6 +186,7 @@
|
|||
<string name="pref_summary_colored_navigation_bar">Colors the navigation bar in the primary color.</string>
|
||||
<string name="pref_summary_colored_app_shortcuts">Colors the app shortcuts in the primary color.</string>
|
||||
<string name="pref_summary_audio_ducking">Notifications, navigation etc.</string>
|
||||
<string name="pref_summary_synchronized_lyrics_show">Show synchronized lyrics for song if available</string>
|
||||
<string name="could_not_download_album_cover">"Couldn\u2019t download a matching album cover."</string>
|
||||
<string name="search_hint">Search your library…</string>
|
||||
<string name="rescanning_media">Rescanning media…</string>
|
||||
|
|
|
|||
|
|
@ -7,6 +7,12 @@
|
|||
android:key="now_playing_screen_id"
|
||||
android:title="@string/pref_title_now_playing_screen_appearance" />
|
||||
|
||||
<com.kabouzeid.appthemehelper.common.prefs.supportv7.ATESwitchPreference
|
||||
android:defaultValue="true"
|
||||
android:key="synchronized_lyrics_show"
|
||||
android:summary="@string/pref_summary_synchronized_lyrics_show"
|
||||
android:title="@string/pref_title_synchronized_lyrics_show" />
|
||||
|
||||
</com.kabouzeid.appthemehelper.common.prefs.supportv7.ATEPreferenceCategory>
|
||||
|
||||
</android.support.v7.preference.PreferenceScreen>
|
||||
Loading…
Add table
Add a link
Reference in a new issue