Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad606c2e authored by linus_lee's avatar linus_lee
Browse files

Eleven: Add Lyric (srt) support

https://cyanogen.atlassian.net/browse/MUSIC-186

Change-Id: I8fec1c61d69dca06be30ccebf9c996d7fac2ae75
parent 1f86c572
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -49,6 +49,21 @@
            android:clipChildren="false"
            android:clipToPadding="false"
            android:visibility="visible" />

        <TextView
            android:id="@+id/audio_player_lyrics"
            android:layout_gravity="center"
            android:gravity="center"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:minHeight="66dp"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:paddingTop="6dp"
            android:paddingBottom="6dp"
            android:background="@color/lyrics_background_color"
            android:textColor="@color/white"
            android:textSize="@dimen/text_size_small"/>
    </com.cyngn.eleven.widgets.SquareFrame>

    <RelativeLayout
+3 −0
Original line number Diff line number Diff line
@@ -112,4 +112,7 @@
    <color name="widget_divider">#373737</color>
    <!-- 80% opacity white -->
    <color name="widget_text">#ccffffff</color>

    <!-- Background Lyrics Color -->
    <color name="lyrics_background_color">#b2000000</color>
</resources>
+2 −0
Original line number Diff line number Diff line
@@ -138,6 +138,8 @@
    <string name="settings_download_artist_images_title">Download missing artist images</string>
    <string name="settings_general_category">General</string>
    <string name="settings_show_music_visualization_title">Show music visualization</string>
    <string name="settings_show_lyrics_title">Show song lyrics</string>
    <string name="settings_show_lyrics_summary">For songs that have an srt file</string>

    <!-- App widget -->
    <string name="app_widget_small">Music: 4 \u00d7 1</string>
+7 −0
Original line number Diff line number Diff line
@@ -43,6 +43,13 @@
            android:defaultValue="true"
            android:key="music_visualization"
            android:title="@string/settings_show_music_visualization_title" />

        <!-- Show Lyrics -->
        <CheckBoxPreference
            android:defaultValue="true"
            android:key="show_lyrics"
            android:title="@string/settings_show_lyrics_title"
            android:summary="@string/settings_show_lyrics_summary"/>
    </PreferenceCategory>
    <!-- Storage catetory -->
    <PreferenceCategory android:title="@string/settings_storage_category" >
+82 −0
Original line number Diff line number Diff line
@@ -61,7 +61,9 @@ import com.cyngn.eleven.provider.SongPlayCount;
import com.cyngn.eleven.service.MusicPlaybackTrack;
import com.cyngn.eleven.utils.ApolloUtils;
import com.cyngn.eleven.utils.Lists;
import com.cyngn.eleven.utils.SrtManager;

import java.io.File;
import java.io.IOException;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
@@ -188,6 +190,11 @@ public class MusicPlaybackService extends Service {
     */
    private static final String SHUTDOWN = "com.cyngn.eleven.shutdown";

    /**
     * Called to notify of a timed text
     */
    public static final String NEW_LYRICS = "com.cyngn.eleven.lyrics";

    /**
     * Called to update the remote control client
     */
@@ -286,6 +293,11 @@ public class MusicPlaybackService extends Service {
     */
    private static final int FADEUP = 7;

    /**
     * Notifies that there is a new timed text string
     */
    private static final int LYRICS = 8;

    /**
     * Idle time before stopping the foreground notfication (5 minutes)
     */
@@ -450,6 +462,8 @@ public class MusicPlaybackService extends Service {

    private int mServiceStartId = -1;

    private String mLyrics;

    private ArrayList<MusicPlaybackTrack> mPlaylist = new ArrayList<MusicPlaybackTrack>(100);

    private long[] mAutoShuffleList = null;
@@ -1373,6 +1387,11 @@ public class MusicPlaybackService extends Service {
        intent.putExtra("album", getAlbumName());
        intent.putExtra("track", getTrackName());
        intent.putExtra("playing", isPlaying());

        if (NEW_LYRICS.equals(what)) {
            intent.putExtra("lyrics", mLyrics);
        }

        sendStickyBroadcast(intent);

        final Intent musicIntent = new Intent(intent);
@@ -2682,6 +2701,10 @@ public class MusicPlaybackService extends Service {
                        service.gotoNext(false);
                    }
                    break;
                case LYRICS:
                    service.mLyrics = (String) msg.obj;
                    service.notifyChange(NEW_LYRICS);
                    break;
                case RELEASE_WAKELOCK:
                    service.mWakeLock.release();
                    break;
@@ -2781,12 +2804,22 @@ public class MusicPlaybackService extends Service {

        private boolean mIsInitialized = false;

        private SrtManager mSrtManager;

        private String mNextMediaPath;

        /**
         * Constructor of <code>MultiPlayer</code>
         */
        public MultiPlayer(final MusicPlaybackService service) {
            mService = new WeakReference<MusicPlaybackService>(service);
            mCurrentMediaPlayer.setWakeMode(mService.get(), PowerManager.PARTIAL_WAKE_LOCK);
            mSrtManager = new SrtManager() {
                @Override
                public void onTimedText(String text) {
                    mHandler.obtainMessage(LYRICS, text).sendToTarget();
                }
            };
        }

        /**
@@ -2796,10 +2829,48 @@ public class MusicPlaybackService extends Service {
        public void setDataSource(final String path) {
            mIsInitialized = setDataSourceImpl(mCurrentMediaPlayer, path);
            if (mIsInitialized) {
                loadSrt(path);
                setNextDataSource(null);
            }
        }

        private void loadSrt(final String path) {
            mSrtManager.reset();

            Uri uri = Uri.parse(path);
            String filePath = null;

            if (path.startsWith("content://")) {
                // resolve the content resolver path to a file path
                Cursor cursor = null;
                try {
                    final String[] proj = {MediaStore.Audio.Media.DATA};
                    cursor = mService.get().getContentResolver().query(uri, proj,
                            null, null, null);
                    if (cursor != null && cursor.moveToFirst()) {
                        filePath = cursor.getString(0);
                    }
                } finally {
                    if (cursor != null) {
                        cursor.close();
                        cursor = null;
                    }
                }
            } else {
                filePath = uri.getPath();
            }

            if (!TextUtils.isEmpty(filePath)) {
                final int lastIndex = filePath.lastIndexOf('.');
                if (lastIndex != -1) {
                    String newPath = filePath.substring(0, lastIndex) + ".srt";
                    final File f = new File(newPath);

                    mSrtManager.initialize(mCurrentMediaPlayer, f);
                }
            }
        }

        /**
         * @param player The {@link MediaPlayer} to use
         * @param path The path of the file, or the http/rtsp URL of the stream
@@ -2817,6 +2888,7 @@ public class MusicPlaybackService extends Service {
                    player.setDataSource(path);
                }
                player.setAudioStreamType(AudioManager.STREAM_MUSIC);

                player.prepare();
            } catch (final IOException todo) {
                // TODO: notify the user why the file couldn't be opened
@@ -2841,6 +2913,7 @@ public class MusicPlaybackService extends Service {
         *            you want to play
         */
        public void setNextDataSource(final String path) {
            mNextMediaPath = null;
            try {
                mCurrentMediaPlayer.setNextMediaPlayer(null);
            } catch (IllegalArgumentException e) {
@@ -2860,6 +2933,7 @@ public class MusicPlaybackService extends Service {
            mNextMediaPlayer.setWakeMode(mService.get(), PowerManager.PARTIAL_WAKE_LOCK);
            mNextMediaPlayer.setAudioSessionId(getAudioSessionId());
            if (setDataSourceImpl(mNextMediaPlayer, path)) {
                mNextMediaPath = path;
                mCurrentMediaPlayer.setNextMediaPlayer(mNextMediaPlayer);
            } else {
                if (mNextMediaPlayer != null) {
@@ -2890,6 +2964,7 @@ public class MusicPlaybackService extends Service {
         */
        public void start() {
            mCurrentMediaPlayer.start();
            mSrtManager.play();
        }

        /**
@@ -2897,6 +2972,7 @@ public class MusicPlaybackService extends Service {
         */
        public void stop() {
            mCurrentMediaPlayer.reset();
            mSrtManager.reset();
            mIsInitialized = false;
        }

@@ -2906,6 +2982,8 @@ public class MusicPlaybackService extends Service {
        public void release() {
            stop();
            mCurrentMediaPlayer.release();
            mSrtManager.release();
            mSrtManager = null;
        }

        /**
@@ -2913,6 +2991,7 @@ public class MusicPlaybackService extends Service {
         */
        public void pause() {
            mCurrentMediaPlayer.pause();
            mSrtManager.pause();
        }

        /**
@@ -2941,6 +3020,7 @@ public class MusicPlaybackService extends Service {
         */
        public long seek(final long whereto) {
            mCurrentMediaPlayer.seekTo((int)whereto);
            mSrtManager.seekTo(whereto);
            return whereto;
        }

@@ -2998,6 +3078,8 @@ public class MusicPlaybackService extends Service {
            if (mp == mCurrentMediaPlayer && mNextMediaPlayer != null) {
                mCurrentMediaPlayer.release();
                mCurrentMediaPlayer = mNextMediaPlayer;
                loadSrt(mNextMediaPath);
                mNextMediaPath = null;
                mNextMediaPlayer = null;
                mHandler.sendEmptyMessage(TRACK_WENT_TO_NEXT);
            } else {
Loading