package com.simplecity.amp_library.lyrics; import android.content.IntentFilter; import android.database.Cursor; import android.net.Uri; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.text.TextUtils; import com.f2prateek.rx.receivers.RxBroadcastReceiver; import com.simplecity.amp_library.ShuttleApplication; import com.simplecity.amp_library.model.Query; import com.simplecity.amp_library.model.Song; import com.simplecity.amp_library.playback.MusicService; import com.simplecity.amp_library.sql.SqlUtils; import com.simplecity.amp_library.ui.presenters.Presenter; import com.simplecity.amp_library.utils.MusicUtils; import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.AudioFileIO; import org.jaudiotagger.audio.exceptions.CannotReadException; import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException; import org.jaudiotagger.audio.exceptions.ReadOnlyFileException; import org.jaudiotagger.tag.FieldKey; import org.jaudiotagger.tag.Tag; import org.jaudiotagger.tag.TagException; import java.io.File; import java.io.IOException; import rx.Observable; class LyricsPresenter extends Presenter<LyricsView> { @Override public void bindView(@NonNull LyricsView view) { super.bindView(view); updateLyrics(); addSubcscription(RxBroadcastReceiver.create(ShuttleApplication.getInstance(), new IntentFilter(MusicService.InternalIntents.META_CHANGED)) .subscribe(intent -> updateLyrics())); } void downloadOrLaunchQuickLyric() { LyricsView lyricsView = getView(); if (lyricsView != null) { if (QuickLyricUtils.isQLInstalled()) { Song song = MusicUtils.getSong(); if (song != null) { lyricsView.launchQuickLyric(song); } } else { lyricsView.downloadQuickLyric(); } } } void showQuickLyricInfoDialog() { LyricsView lyricsView = getView(); if (lyricsView != null) { lyricsView.showQuickLyricInfoDialog(); } } private void updateLyrics() { addSubcscription(Observable.fromCallable(() -> { String lyrics = null; String path = MusicUtils.getFilePath(); if (TextUtils.isEmpty(path)) { return null; } if (path.startsWith("content://")) { Query query = new Query.Builder() .uri(Uri.parse(path)) .projection(new String[]{MediaStore.Audio.Media.DATA}) .build(); Cursor cursor = SqlUtils.createQuery(ShuttleApplication.getInstance(), query); if (cursor != null) { try { int colIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA); if (cursor.moveToFirst()) { path = cursor.getString(colIndex); } } finally { cursor.close(); } } } File file = new File(path); if (file.exists()) { try { AudioFile audioFile = AudioFileIO.read(file); if (audioFile != null) { Tag tag = audioFile.getTag(); if (tag != null) { String tagLyrics = tag.getFirst(FieldKey.LYRICS); if (tagLyrics != null && tagLyrics.length() != 0) { lyrics = tagLyrics.replace("\r", "\n"); } } } } catch (CannotReadException | IOException | TagException | ReadOnlyFileException | InvalidAudioFrameException | UnsupportedOperationException ignored) { } } return lyrics; }).subscribe(lyrics -> { LyricsView lyricsView = getView(); if (lyricsView != null) { lyricsView.updateLyrics(lyrics); lyricsView.showNoLyricsView(lyrics == null); lyricsView.showQuickLyricInfoButton(!QuickLyricUtils.isQLInstalled()); } })); } }