From db6be0ef0c9141eb6eebeb9b5ccdc00c13868c54 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Wed, 1 May 2013 22:01:30 -0700 Subject: Turn Lyrics into fragment, get rid of extra baggage --- subsonic-android/res/layout-land/download.xml | 1 + subsonic-android/res/layout-port/download.xml | 7 +- .../dsub/activity/DownloadActivity.java | 7 + .../daneren2005/dsub/activity/LyricsActivity.java | 72 --- .../dsub/activity/SubsonicTabActivity.java | 630 --------------------- .../dsub/fragments/DownloadFragment.java | 18 +- .../daneren2005/dsub/fragments/LyricsFragment.java | 80 +++ .../dsub/util/TabActivityBackgroundTask.java | 67 --- 8 files changed, 103 insertions(+), 779 deletions(-) delete mode 100644 subsonic-android/src/github/daneren2005/dsub/activity/LyricsActivity.java delete mode 100644 subsonic-android/src/github/daneren2005/dsub/activity/SubsonicTabActivity.java create mode 100644 subsonic-android/src/github/daneren2005/dsub/fragments/LyricsFragment.java delete mode 100644 subsonic-android/src/github/daneren2005/dsub/util/TabActivityBackgroundTask.java (limited to 'subsonic-android') diff --git a/subsonic-android/res/layout-land/download.xml b/subsonic-android/res/layout-land/download.xml index f7ea3162..21096235 100644 --- a/subsonic-android/res/layout-land/download.xml +++ b/subsonic-android/res/layout-land/download.xml @@ -1,5 +1,6 @@ diff --git a/subsonic-android/res/layout-port/download.xml b/subsonic-android/res/layout-port/download.xml index 33c94e1f..c7912266 100644 --- a/subsonic-android/res/layout-port/download.xml +++ b/subsonic-android/res/layout-port/download.xml @@ -1,8 +1,9 @@ + android:id="@+id/download_layout" + android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="fill_parent"> . - - Copyright 2009 (C) Sindre Mehus - */ - -package github.daneren2005.dsub.activity; - -import android.os.Bundle; -import android.widget.TextView; -import github.daneren2005.dsub.R; -import github.daneren2005.dsub.domain.Lyrics; -import github.daneren2005.dsub.service.MusicService; -import github.daneren2005.dsub.service.MusicServiceFactory; -import github.daneren2005.dsub.util.BackgroundTask; -import github.daneren2005.dsub.util.Constants; -import github.daneren2005.dsub.util.TabActivityBackgroundTask; - -/** - * Displays song lyrics. - * - * @author Sindre Mehus - */ -public final class LyricsActivity extends SubsonicTabActivity { - - @Override - protected void onCreate(Bundle bundle) { - super.onCreate(bundle); - setContentView(R.layout.lyrics); - load(); - } - - private void load() { - BackgroundTask task = new TabActivityBackgroundTask(this) { - @Override - protected Lyrics doInBackground() throws Throwable { - String artist = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_ARTIST); - String title = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_TITLE); - MusicService musicService = MusicServiceFactory.getMusicService(LyricsActivity.this); - return musicService.getLyrics(artist, title, LyricsActivity.this, this); - } - - @Override - protected void done(Lyrics result) { - TextView artistView = (TextView) findViewById(R.id.lyrics_artist); - TextView titleView = (TextView) findViewById(R.id.lyrics_title); - TextView textView = (TextView) findViewById(R.id.lyrics_text); - if (result != null && result.getArtist() != null) { - artistView.setText(result.getArtist()); - titleView.setText(result.getTitle()); - textView.setText(result.getText()); - } else { - artistView.setText(R.string.lyrics_nomatch); - } - } - }; - task.execute(); - } -} \ No newline at end of file diff --git a/subsonic-android/src/github/daneren2005/dsub/activity/SubsonicTabActivity.java b/subsonic-android/src/github/daneren2005/dsub/activity/SubsonicTabActivity.java deleted file mode 100644 index 6bb7da6f..00000000 --- a/subsonic-android/src/github/daneren2005/dsub/activity/SubsonicTabActivity.java +++ /dev/null @@ -1,630 +0,0 @@ -/* - This file is part of Subsonic. - - Subsonic is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Subsonic is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Subsonic. If not, see . - - Copyright 2009 (C) Sindre Mehus - */ -package github.daneren2005.dsub.activity; - -import java.io.File; -import java.io.PrintWriter; -import java.util.LinkedList; -import java.util.List; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.media.AudioManager; -import android.media.MediaMetadataRetriever; -import android.os.Build; -import android.os.Bundle; -import android.os.Environment; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; -import android.view.Window; -import android.widget.EditText; -import android.widget.ImageButton; -import android.widget.TextView; -import github.daneren2005.dsub.R; -import com.actionbarsherlock.app.SherlockActivity; -import github.daneren2005.dsub.domain.Artist; -import github.daneren2005.dsub.domain.MusicDirectory; -import github.daneren2005.dsub.domain.Playlist; -import github.daneren2005.dsub.service.*; -import github.daneren2005.dsub.updates.Updater; -import github.daneren2005.dsub.util.*; -import java.util.ArrayList; -import java.util.Arrays; - -/** - * @author Sindre Mehus - */ -public class SubsonicTabActivity extends SherlockActivity { - - private static final String TAG = SubsonicTabActivity.class.getSimpleName(); - private static ImageLoader IMAGE_LOADER; - protected static String theme; - - private boolean destroyed; - private View homeButton; - private View musicButton; - private View playlistButton; - private View nowPlayingButton; - - private static final int SHUFFLE_EVERYTHING = 0; - private static final int SHUFFLE_YEAR = 1; - private static final int SHUFFLE_YEAR_RANGE = 2; - private static final int SHUFFLE_GENRE = 3; - - @Override - protected void onCreate(Bundle bundle) { - setUncaughtExceptionHandler(); - applyTheme(); - super.onCreate(bundle); - startService(new Intent(this, DownloadServiceImpl.class)); - setVolumeControlStream(AudioManager.STREAM_MUSIC); - } - - @Override - protected void onPostCreate(Bundle bundle) { - super.onPostCreate(bundle); - - /*homeButton = findViewById(R.id.button_bar_home); - homeButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Intent intent = new Intent(SubsonicTabActivity.this, MainActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - Util.startActivityWithoutTransition(SubsonicTabActivity.this, intent); - } - }); - - musicButton = findViewById(R.id.button_bar_music); - musicButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Intent intent = new Intent(SubsonicTabActivity.this, SelectArtistActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - Util.startActivityWithoutTransition(SubsonicTabActivity.this, intent); - } - }); - - playlistButton = findViewById(R.id.button_bar_playlists); - playlistButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Intent intent = new Intent(SubsonicTabActivity.this, SelectPlaylistActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - Util.startActivityWithoutTransition(SubsonicTabActivity.this, intent); - } - }); - - nowPlayingButton = findViewById(R.id.button_bar_now_playing); - nowPlayingButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Util.startActivityWithoutTransition(SubsonicTabActivity.this, DownloadActivity.class); - } - }); - - /*if (this instanceof MainActivity) { - homeButton.setEnabled(false); - } else if (this instanceof SelectAlbumActivity || this instanceof SelectArtistActivity) { - musicButton.setEnabled(false); - } else if (this instanceof SelectPlaylistActivity) { - playlistButton.setEnabled(false); - } else if (this instanceof DownloadActivity || this instanceof LyricsActivity) { - nowPlayingButton.setEnabled(false); - }*/ - } - - @Override - protected void onResume() { - super.onResume(); - Util.registerMediaButtonEventReceiver(this); - - // Make sure to update theme - if (theme != null && !theme.equals(Util.getTheme(this))) { - restart(); - } - } - - @Override - protected void onDestroy() { - super.onDestroy(); - destroyed = true; - getImageLoader().clear(); - } - - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - boolean isVolumeDown = keyCode == KeyEvent.KEYCODE_VOLUME_DOWN; - boolean isVolumeUp = keyCode == KeyEvent.KEYCODE_VOLUME_UP; - boolean isVolumeAdjust = isVolumeDown || isVolumeUp; - boolean isJukebox = getDownloadService() != null && getDownloadService().isJukeboxEnabled(); - - if (isVolumeAdjust && isJukebox) { - getDownloadService().adjustJukeboxVolume(isVolumeUp); - return true; - } - return super.onKeyDown(keyCode, event); - } - - protected void restart() { - Intent intent = new Intent(this, this.getClass()); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - intent.putExtras(getIntent()); - Util.startActivityWithoutTransition(this, intent); - } - - @Override - public void finish() { - super.finish(); - Util.disablePendingTransition(this); - } - - private void applyTheme() { - theme = Util.getTheme(this); - if ("dark".equals(theme)) { - setTheme(R.style.Theme_DSub_Dark); - } else if ("light".equals(theme)) { - setTheme(R.style.Theme_DSub_Light); - } else if ("dark_fullscreen".equals(theme)) { - setTheme(R.style.Theme_DSub_Dark_Fullscreen); - } else if ("light_fullscreen".equals(theme)) { - setTheme(R.style.Theme_DSub_Light_Fullscreen); - } else if("holo".equals(theme)) { - setTheme(R.style.Theme_DSub_Holo); - } else if("holo_fullscreen".equals(theme)) { - setTheme(R.style.Theme_DSub_Holo_Fullscreen); - }else { - setTheme(R.style.Theme_DSub_Holo); - } - } - - public boolean isDestroyed() { - return destroyed; - } - - public void toggleStarred(final MusicDirectory.Entry entry) { - final boolean starred = !entry.isStarred(); - entry.setStarred(starred); - - new SilentBackgroundTask(this) { - @Override - protected Void doInBackground() throws Throwable { - MusicService musicService = MusicServiceFactory.getMusicService(SubsonicTabActivity.this); - musicService.setStarred(entry.getId(), starred, SubsonicTabActivity.this, null); - return null; - } - - @Override - protected void done(Void result) { - // UpdateView - Util.toast(SubsonicTabActivity.this, getResources().getString(starred ? R.string.starring_content_starred : R.string.starring_content_unstarred, entry.getTitle())); - } - - @Override - protected void error(Throwable error) { - entry.setStarred(!starred); - - String msg; - if (error instanceof OfflineException || error instanceof ServerTooOldException) { - msg = getErrorMessage(error); - } else { - msg = getResources().getString(R.string.starring_content_error, entry.getTitle()) + " " + getErrorMessage(error); - } - - Util.toast(SubsonicTabActivity.this, msg, false); - } - }.execute(); - } - public void toggleStarred(final Artist entry) { - final boolean starred = !entry.isStarred(); - entry.setStarred(starred); - - new SilentBackgroundTask(this) { - @Override - protected Void doInBackground() throws Throwable { - MusicService musicService = MusicServiceFactory.getMusicService(SubsonicTabActivity.this); - musicService.setStarred(entry.getId(), starred, SubsonicTabActivity.this, null); - return null; - } - - @Override - protected void done(Void result) { - // UpdateView - Util.toast(SubsonicTabActivity.this, getResources().getString(starred ? R.string.starring_content_starred : R.string.starring_content_unstarred, entry.getName())); - } - - @Override - protected void error(Throwable error) { - entry.setStarred(!starred); - - String msg; - if (error instanceof OfflineException || error instanceof ServerTooOldException) { - msg = getErrorMessage(error); - } else { - msg = getResources().getString(R.string.starring_content_error, entry.getName()) + " " + getErrorMessage(error); - } - - Util.toast(SubsonicTabActivity.this, msg, false); - } - }.execute(); - } - - public void setProgressVisible(boolean visible) { - View view = findViewById(R.id.tab_progress); - if (view != null) { - view.setVisibility(visible ? View.VISIBLE : View.GONE); - } - } - - public void updateProgress(String message) { - TextView view = (TextView) findViewById(R.id.tab_progress_message); - if (view != null) { - view.setText(message); - } - } - - public DownloadService getDownloadService() { - // If service is not available, request it to start and wait for it. - for (int i = 0; i < 5; i++) { - DownloadService downloadService = DownloadServiceImpl.getInstance(); - if (downloadService != null) { - return downloadService; - } - Log.w(TAG, "DownloadService not running. Attempting to start it."); - startService(new Intent(this, DownloadServiceImpl.class)); - Util.sleepQuietly(50L); - } - return DownloadServiceImpl.getInstance(); - } - - protected void warnIfNetworkOrStorageUnavailable() { - if (!Util.isExternalStoragePresent()) { - Util.toast(this, R.string.select_album_no_sdcard); - } else if (!Util.isOffline(this) && !Util.isNetworkConnected(this)) { - Util.toast(this, R.string.select_album_no_network); - } - } - - protected synchronized ImageLoader getImageLoader() { - if (IMAGE_LOADER == null) { - IMAGE_LOADER = new ImageLoader(this); - } - return IMAGE_LOADER; - } - public synchronized static ImageLoader getStaticImageLoader(Context context) { - if (IMAGE_LOADER == null) { - IMAGE_LOADER = new ImageLoader(context); - } - return IMAGE_LOADER; - } - - protected void downloadRecursively(final String id, final boolean save, final boolean append, final boolean autoplay, final boolean shuffle, final boolean background) { - downloadRecursively(id, "", true, save, append, autoplay, shuffle, background); - } - protected void downloadPlaylist(final String id, final String name, final boolean save, final boolean append, final boolean autoplay, final boolean shuffle, final boolean background) { - downloadRecursively(id, name, false, save, append, autoplay, shuffle, background); - } - protected void downloadRecursively(final String id, final String name, final boolean isDirectory, final boolean save, final boolean append, final boolean autoplay, final boolean shuffle, final boolean background) { - ModalBackgroundTask> task = new ModalBackgroundTask>(this, false) { - private static final int MAX_SONGS = 500; - - @Override - protected List doInBackground() throws Throwable { - MusicService musicService = MusicServiceFactory.getMusicService(SubsonicTabActivity.this); - MusicDirectory root; - if(isDirectory) - root = musicService.getMusicDirectory(id, name, false, SubsonicTabActivity.this, this); - else - root = musicService.getPlaylist(id, name, SubsonicTabActivity.this, this); - List songs = new LinkedList(); - getSongsRecursively(root, songs); - return songs; - } - - private void getSongsRecursively(MusicDirectory parent, List songs) throws Exception { - if (songs.size() > MAX_SONGS) { - return; - } - - for (MusicDirectory.Entry song : parent.getChildren(false, true)) { - if (!song.isVideo()) { - songs.add(song); - } - } - for (MusicDirectory.Entry dir : parent.getChildren(true, false)) { - MusicService musicService = MusicServiceFactory.getMusicService(SubsonicTabActivity.this); - getSongsRecursively(musicService.getMusicDirectory(dir.getId(), dir.getTitle(), false, SubsonicTabActivity.this, this), songs); - } - } - - @Override - protected void done(List songs) { - DownloadService downloadService = getDownloadService(); - if (!songs.isEmpty() && downloadService != null) { - if (!append) { - downloadService.clear(); - } - warnIfNetworkOrStorageUnavailable(); - if(!background) { - downloadService.download(songs, save, autoplay, false, shuffle); - if(!append) { - Util.startActivityWithoutTransition(SubsonicTabActivity.this, DownloadActivity.class); - } - } - else { - downloadService.downloadBackground(songs, save); - } - } - } - }; - - task.execute(); - } - - protected void addToPlaylist(final List songs) { - if(songs.isEmpty()) { - Util.toast(this, "No songs selected"); - return; - } - - /*new LoadingTask>(this, true) { - @Override - protected List doInBackground() throws Throwable { - MusicService musicService = MusicServiceFactory.getMusicService(SubsonicTabActivity.this); - return musicService.getPlaylists(false, SubsonicTabActivity.this, this); - } - - @Override - protected void done(final List playlists) { - List names = new ArrayList(); - for(Playlist playlist: playlists) { - names.add(playlist.getName()); - } - - AlertDialog.Builder builder = new AlertDialog.Builder(SubsonicTabActivity.this); - builder.setTitle("Add to Playlist") - .setItems(names.toArray(new CharSequence[names.size()]), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - addToPlaylist(playlists.get(which), songs); - } - }); - AlertDialog dialog = builder.create(); - dialog.show(); - } - - @Override - protected void error(Throwable error) { - String msg; - if (error instanceof OfflineException || error instanceof ServerTooOldException) { - msg = getErrorMessage(error); - } else { - msg = getResources().getString(R.string.playlist_error) + " " + getErrorMessage(error); - } - - Util.toast(SubsonicTabActivity.this, msg, false); - } - }.execute();*/ - } - - private void addToPlaylist(final Playlist playlist, final List songs) { - new SilentBackgroundTask(this) { - @Override - protected Void doInBackground() throws Throwable { - MusicService musicService = MusicServiceFactory.getMusicService(SubsonicTabActivity.this); - musicService.addToPlaylist(playlist.getId(), songs, SubsonicTabActivity.this, null); - return null; - } - - @Override - protected void done(Void result) { - Util.toast(SubsonicTabActivity.this, getResources().getString(R.string.updated_playlist, songs.size(), playlist.getName())); - } - - @Override - protected void error(Throwable error) { - String msg; - if (error instanceof OfflineException || error instanceof ServerTooOldException) { - msg = getErrorMessage(error); - } else { - msg = getResources().getString(R.string.updated_playlist_error, playlist.getName()) + " " + getErrorMessage(error); - } - - Util.toast(SubsonicTabActivity.this, msg, false); - } - }.execute(); - } - - protected void onShuffleRequested() { - if(Util.isOffline(this)) { - Intent intent = new Intent(SubsonicTabActivity.this, DownloadActivity.class); - intent.putExtra(Constants.INTENT_EXTRA_NAME_SHUFFLE, true); - Util.startActivityWithoutTransition(SubsonicTabActivity.this, intent); - return; - } - - View dialogView = getLayoutInflater().inflate(R.layout.shuffle_dialog, null); - final EditText startYearBox = (EditText)dialogView.findViewById(R.id.start_year); - final EditText endYearBox = (EditText)dialogView.findViewById(R.id.end_year); - final EditText genreBox = (EditText)dialogView.findViewById(R.id.genre); - - final SharedPreferences prefs = Util.getPreferences(SubsonicTabActivity.this); - final String oldStartYear = prefs.getString(Constants.PREFERENCES_KEY_SHUFFLE_START_YEAR, ""); - final String oldEndYear = prefs.getString(Constants.PREFERENCES_KEY_SHUFFLE_END_YEAR, ""); - final String oldGenre = prefs.getString(Constants.PREFERENCES_KEY_SHUFFLE_GENRE, ""); - - startYearBox.setText(oldStartYear); - endYearBox.setText(oldEndYear); - genreBox.setText(oldGenre); - - AlertDialog.Builder builder = new AlertDialog.Builder(SubsonicTabActivity.this); - builder.setTitle("Shuffle By") - .setView(dialogView) - .setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - Intent intent = new Intent(SubsonicTabActivity.this, DownloadActivity.class); - intent.putExtra(Constants.INTENT_EXTRA_NAME_SHUFFLE, true); - String genre = genreBox.getText().toString(); - String startYear = startYearBox.getText().toString(); - String endYear = endYearBox.getText().toString(); - - SharedPreferences.Editor editor = prefs.edit(); - editor.putString(Constants.PREFERENCES_KEY_SHUFFLE_START_YEAR, startYear); - editor.putString(Constants.PREFERENCES_KEY_SHUFFLE_END_YEAR, endYear); - editor.putString(Constants.PREFERENCES_KEY_SHUFFLE_GENRE, genre); - editor.commit(); - - Util.startActivityWithoutTransition(SubsonicTabActivity.this, intent); - } - }) - .setNegativeButton(R.string.common_cancel, null); - AlertDialog dialog = builder.create(); - dialog.show(); - } - - public void displaySongInfo(final MusicDirectory.Entry song) { - Integer bitrate = null; - String format = null; - long size = 0; - try { - DownloadFile downloadFile = new DownloadFile(SubsonicTabActivity.this, song, false); - File file = downloadFile.getCompleteFile(); - if(file.exists()) { - MediaMetadataRetriever metadata = new MediaMetadataRetriever(); - metadata.setDataSource(file.getAbsolutePath()); - String tmp = metadata.extractMetadata(MediaMetadataRetriever.METADATA_KEY_BITRATE); - bitrate = Integer.parseInt((tmp != null) ? tmp : "0") / 1000; - format = FileUtil.getExtension(file.getName()); - size = file.length(); - - if(Util.isOffline(SubsonicTabActivity.this)) { - song.setGenre(metadata.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE)); - String year = metadata.extractMetadata(MediaMetadataRetriever.METADATA_KEY_YEAR); - song.setYear(Integer.parseInt((year != null) ? year : "0")); - } - } - } catch(Exception e) { - Log.i(TAG, "Device doesn't properly support MediaMetadataRetreiver"); - } - - String msg = ""; - if(!song.isVideo()) { - msg += "Artist: " + song.getArtist() + "\nAlbum: " + song.getAlbum(); - } - if(song.getTrack() != null && song.getTrack() != 0) { - msg += "\nTrack: " + song.getTrack(); - } - if(song.getGenre() != null && !"".equals(song.getGenre())) { - msg += "\nGenre: " + song.getGenre(); - } - if(song.getYear() != null && song.getYear() != 0) { - msg += "\nYear: " + song.getYear(); - } - if(!Util.isOffline(SubsonicTabActivity.this)) { - msg += "\nServer Format: " + song.getSuffix(); - if(song.getBitRate() != null && song.getBitRate() != 0) { - msg += "\nServer Bitrate: " + song.getBitRate() + " kpbs"; - } - } - if(format != null && !"".equals(format)) { - msg += "\nCached Format: " + format; - } - if(bitrate != null && bitrate != 0) { - msg += "\nCached Bitrate: " + bitrate + " kpbs"; - } - if(size != 0) { - msg += "\nSize: " + Util.formatBytes(size); - } - if(song.getDuration() != null && song.getDuration() != 0) { - msg += "\nLength: " + Util.formatDuration(song.getDuration()); - } - - new AlertDialog.Builder(this) - .setIcon(android.R.drawable.ic_dialog_alert) - .setTitle(song.getTitle()) - .setMessage(msg) - .show(); - } - - public void checkUpdates() { - try { - String version = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; - int ver = Integer.parseInt(version.replace(".", "")); - Updater updater = new Updater(ver); - updater.checkUpdates(SubsonicTabActivity.this); - } - catch(Exception e) { - - } - } - - private void setUncaughtExceptionHandler() { - Thread.UncaughtExceptionHandler handler = Thread.getDefaultUncaughtExceptionHandler(); - if (!(handler instanceof SubsonicUncaughtExceptionHandler)) { - Thread.setDefaultUncaughtExceptionHandler(new SubsonicUncaughtExceptionHandler(this)); - } - } - - /** - * Logs the stack trace of uncaught exceptions to a file on the SD card. - */ - private static class SubsonicUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { - - private final Thread.UncaughtExceptionHandler defaultHandler; - private final Context context; - - private SubsonicUncaughtExceptionHandler(Context context) { - this.context = context; - defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); - } - - @Override - public void uncaughtException(Thread thread, Throwable throwable) { - File file = null; - PrintWriter printWriter = null; - try { - - PackageInfo packageInfo = context.getPackageManager().getPackageInfo("github.daneren2005.dsub", 0); - file = new File(Environment.getExternalStorageDirectory(), "subsonic-stacktrace.txt"); - printWriter = new PrintWriter(file); - printWriter.println("Android API level: " + Build.VERSION.SDK); - printWriter.println("Subsonic version name: " + packageInfo.versionName); - printWriter.println("Subsonic version code: " + packageInfo.versionCode); - printWriter.println(); - throwable.printStackTrace(printWriter); - Log.i(TAG, "Stack trace written to " + file); - } catch (Throwable x) { - Log.e(TAG, "Failed to write stack trace to " + file, x); - } finally { - Util.close(printWriter); - if (defaultHandler != null) { - defaultHandler.uncaughtException(thread, throwable); - } - - } - } - } -} - diff --git a/subsonic-android/src/github/daneren2005/dsub/fragments/DownloadFragment.java b/subsonic-android/src/github/daneren2005/dsub/fragments/DownloadFragment.java index 7ec4d5c7..c507aa1c 100644 --- a/subsonic-android/src/github/daneren2005/dsub/fragments/DownloadFragment.java +++ b/subsonic-android/src/github/daneren2005/dsub/fragments/DownloadFragment.java @@ -60,9 +60,7 @@ import java.util.ArrayList; import java.util.concurrent.ScheduledFuture; import com.mobeta.android.dslv.*; import github.daneren2005.dsub.activity.EqualizerActivity; -import github.daneren2005.dsub.activity.LyricsActivity; import github.daneren2005.dsub.activity.SubsonicActivity; -import github.daneren2005.dsub.service.DownloadServiceImpl; public class DownloadFragment extends SubsonicFragment implements OnGestureListener { private static final String TAG = DownloadFragment.class.getSimpleName(); @@ -504,13 +502,16 @@ public class DownloadFragment extends SubsonicFragment implements OnGestureListe @Override public boolean onContextItemSelected(android.view.MenuItem menuItem) { + if(!primaryFragment) { + return false; + } + AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuItem.getMenuInfo(); DownloadFile downloadFile = (DownloadFile) playlistView.getItemAtPosition(info.position); return menuItemSelected(menuItem.getItemId(), downloadFile) || super.onContextItemSelected(menuItem); } private boolean menuItemSelected(int menuItemId, final DownloadFile song) { - Intent intent; switch (menuItemId) { case R.id.menu_show_album: /*Intent intent = new Intent(context, SelectAlbumActivity.class); @@ -519,10 +520,13 @@ public class DownloadFragment extends SubsonicFragment implements OnGestureListe Util.startActivityWithoutTransition(context, intent);*/ return true; case R.id.menu_lyrics: - intent = new Intent(context, LyricsActivity.class); - intent.putExtra(Constants.INTENT_EXTRA_NAME_ARTIST, song.getSong().getArtist()); - intent.putExtra(Constants.INTENT_EXTRA_NAME_TITLE, song.getSong().getTitle()); - Util.startActivityWithoutTransition(context, intent); + SubsonicFragment fragment = new LyricsFragment(); + Bundle args = new Bundle(); + args.putString(Constants.INTENT_EXTRA_NAME_ARTIST, song.getSong().getArtist()); + args.putString(Constants.INTENT_EXTRA_NAME_TITLE, song.getSong().getTitle()); + fragment.setArguments(args); + + replaceFragment(fragment, R.id.download_layout); return true; case R.id.menu_remove: new SilentBackgroundTask(context) { diff --git a/subsonic-android/src/github/daneren2005/dsub/fragments/LyricsFragment.java b/subsonic-android/src/github/daneren2005/dsub/fragments/LyricsFragment.java new file mode 100644 index 00000000..3f6a4146 --- /dev/null +++ b/subsonic-android/src/github/daneren2005/dsub/fragments/LyricsFragment.java @@ -0,0 +1,80 @@ +/* + This file is part of Subsonic. + + Subsonic is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Subsonic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Subsonic. If not, see . + + Copyright 2009 (C) Sindre Mehus + */ + +package github.daneren2005.dsub.fragments; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import github.daneren2005.dsub.R; +import github.daneren2005.dsub.domain.Lyrics; +import github.daneren2005.dsub.service.MusicService; +import github.daneren2005.dsub.service.MusicServiceFactory; +import github.daneren2005.dsub.util.BackgroundTask; +import github.daneren2005.dsub.util.Constants; +import github.daneren2005.dsub.util.TabBackgroundTask; + +/** + * Displays song lyrics. + * + * @author Sindre Mehus + */ +public final class LyricsFragment extends SubsonicFragment { + @Override + public void onCreate(Bundle bundle) { + super.onCreate(bundle); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) { + rootView = inflater.inflate(R.layout.lyrics, container, false); + load(); + + return rootView; + } + + private void load() { + BackgroundTask task = new TabBackgroundTask(this) { + @Override + protected Lyrics doInBackground() throws Throwable { + String artist = getArguments().getString(Constants.INTENT_EXTRA_NAME_ARTIST); + String title = getArguments().getString(Constants.INTENT_EXTRA_NAME_TITLE); + MusicService musicService = MusicServiceFactory.getMusicService(context); + return musicService.getLyrics(artist, title, context, this); + } + + @Override + protected void done(Lyrics result) { + TextView artistView = (TextView) rootView.findViewById(R.id.lyrics_artist); + TextView titleView = (TextView) rootView.findViewById(R.id.lyrics_title); + TextView textView = (TextView) rootView.findViewById(R.id.lyrics_text); + if (result != null && result.getArtist() != null) { + artistView.setText(result.getArtist()); + titleView.setText(result.getTitle()); + textView.setText(result.getText()); + } else { + artistView.setText(R.string.lyrics_nomatch); + } + } + }; + task.execute(); + } +} \ No newline at end of file diff --git a/subsonic-android/src/github/daneren2005/dsub/util/TabActivityBackgroundTask.java b/subsonic-android/src/github/daneren2005/dsub/util/TabActivityBackgroundTask.java deleted file mode 100644 index f5cf94b9..00000000 --- a/subsonic-android/src/github/daneren2005/dsub/util/TabActivityBackgroundTask.java +++ /dev/null @@ -1,67 +0,0 @@ -package github.daneren2005.dsub.util; - -import github.daneren2005.dsub.activity.SubsonicTabActivity; - -/** - * @author Sindre Mehus - * @version $Id$ - */ -public abstract class TabActivityBackgroundTask extends BackgroundTask { - - private final SubsonicTabActivity tabActivity; - - public TabActivityBackgroundTask(SubsonicTabActivity activity) { - super(activity); - tabActivity = activity; - } - - @Override - public void execute() { - tabActivity.setProgressVisible(true); - - new Thread() { - @Override - public void run() { - try { - final T result = doInBackground(); - if (isCancelled()) { - return; - } - - getHandler().post(new Runnable() { - @Override - public void run() { - tabActivity.setProgressVisible(false); - done(result); - } - }); - } catch (final Throwable t) { - if (isCancelled()) { - return; - } - getHandler().post(new Runnable() { - @Override - public void run() { - tabActivity.setProgressVisible(false); - error(t); - } - }); - } - } - }.start(); - } - - private boolean isCancelled() { - return tabActivity.isDestroyed(); - } - - @Override - public void updateProgress(final String message) { - getHandler().post(new Runnable() { - @Override - public void run() { - tabActivity.updateProgress(message); - } - }); - } -} -- cgit v1.2.3