Loading res/layout/activity_player_fragment.xml +15 −0 Original line number Diff line number Diff line Loading @@ -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 Loading res/values/colors.xml +3 −0 Original line number Diff line number Diff line Loading @@ -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> res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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> Loading res/xml/settings.xml +7 −0 Original line number Diff line number Diff line Loading @@ -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" > Loading src/com/cyngn/eleven/MusicPlaybackService.java +82 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */ Loading Loading @@ -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) */ Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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(); } }; } /** Loading @@ -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 Loading @@ -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 Loading @@ -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) { Loading @@ -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) { Loading Loading @@ -2890,6 +2964,7 @@ public class MusicPlaybackService extends Service { */ public void start() { mCurrentMediaPlayer.start(); mSrtManager.play(); } /** Loading @@ -2897,6 +2972,7 @@ public class MusicPlaybackService extends Service { */ public void stop() { mCurrentMediaPlayer.reset(); mSrtManager.reset(); mIsInitialized = false; } Loading @@ -2906,6 +2982,8 @@ public class MusicPlaybackService extends Service { public void release() { stop(); mCurrentMediaPlayer.release(); mSrtManager.release(); mSrtManager = null; } /** Loading @@ -2913,6 +2991,7 @@ public class MusicPlaybackService extends Service { */ public void pause() { mCurrentMediaPlayer.pause(); mSrtManager.pause(); } /** Loading Loading @@ -2941,6 +3020,7 @@ public class MusicPlaybackService extends Service { */ public long seek(final long whereto) { mCurrentMediaPlayer.seekTo((int)whereto); mSrtManager.seekTo(whereto); return whereto; } Loading Loading @@ -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 Loading
res/layout/activity_player_fragment.xml +15 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
res/values/colors.xml +3 −0 Original line number Diff line number Diff line Loading @@ -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>
res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -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> Loading
res/xml/settings.xml +7 −0 Original line number Diff line number Diff line Loading @@ -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" > Loading
src/com/cyngn/eleven/MusicPlaybackService.java +82 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 */ Loading Loading @@ -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) */ Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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(); } }; } /** Loading @@ -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 Loading @@ -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 Loading @@ -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) { Loading @@ -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) { Loading Loading @@ -2890,6 +2964,7 @@ public class MusicPlaybackService extends Service { */ public void start() { mCurrentMediaPlayer.start(); mSrtManager.play(); } /** Loading @@ -2897,6 +2972,7 @@ public class MusicPlaybackService extends Service { */ public void stop() { mCurrentMediaPlayer.reset(); mSrtManager.reset(); mIsInitialized = false; } Loading @@ -2906,6 +2982,8 @@ public class MusicPlaybackService extends Service { public void release() { stop(); mCurrentMediaPlayer.release(); mSrtManager.release(); mSrtManager = null; } /** Loading @@ -2913,6 +2991,7 @@ public class MusicPlaybackService extends Service { */ public void pause() { mCurrentMediaPlayer.pause(); mSrtManager.pause(); } /** Loading Loading @@ -2941,6 +3020,7 @@ public class MusicPlaybackService extends Service { */ public long seek(final long whereto) { mCurrentMediaPlayer.seekTo((int)whereto); mSrtManager.seekTo(whereto); return whereto; } Loading Loading @@ -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