From 563a6645470a5d9d1a28e7ae49df1801e2bbc294 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sat, 9 Mar 2013 10:51:31 -0800 Subject: Got a working album view --- .../dsub/activity/SubsonicActivity.java | 2 +- .../dsub/fragments/SelectArtistFragment.java | 1 + .../dsub/fragments/SelectDirectoryFragment.java | 195 ++++++++++++++++++++- .../dsub/fragments/SubsonicTabFragment.java | 9 +- .../github/daneren2005/dsub/view/EntryAdapter.java | 8 +- 5 files changed, 207 insertions(+), 8 deletions(-) (limited to 'subsonic-android') diff --git a/subsonic-android/src/github/daneren2005/dsub/activity/SubsonicActivity.java b/subsonic-android/src/github/daneren2005/dsub/activity/SubsonicActivity.java index 55ac514f..bada0da0 100644 --- a/subsonic-android/src/github/daneren2005/dsub/activity/SubsonicActivity.java +++ b/subsonic-android/src/github/daneren2005/dsub/activity/SubsonicActivity.java @@ -106,7 +106,7 @@ public class SubsonicActivity extends SherlockFragmentActivity { return destroyed; } - protected synchronized ImageLoader getImageLoader() { + public synchronized ImageLoader getImageLoader() { if (IMAGE_LOADER == null) { IMAGE_LOADER = new ImageLoader(this); } diff --git a/subsonic-android/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java b/subsonic-android/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java index 17e944dd..12a58678 100644 --- a/subsonic-android/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java +++ b/subsonic-android/src/github/daneren2005/dsub/fragments/SelectArtistFragment.java @@ -144,6 +144,7 @@ public class SelectArtistFragment extends SubsonicTabFragment implements Adapter Bundle args = new Bundle(); args.putString(Constants.INTENT_EXTRA_NAME_ID, artist.getId()); args.putString(Constants.INTENT_EXTRA_NAME_NAME, artist.getName()); + fragment.setArguments(args); final FragmentTransaction trans = getFragmentManager().beginTransaction(); trans.replace(R.id.select_artist_layout, fragment); diff --git a/subsonic-android/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/subsonic-android/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index e5a721c5..b393521b 100644 --- a/subsonic-android/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/subsonic-android/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -2,17 +2,26 @@ package github.daneren2005.dsub.fragments; import android.content.Intent; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListView; +import android.widget.TextView; import github.daneren2005.dsub.R; import github.daneren2005.dsub.domain.MusicDirectory; import github.daneren2005.dsub.view.EntryAdapter; import java.util.List; import com.mobeta.android.dslv.*; +import github.daneren2005.dsub.service.MusicService; +import github.daneren2005.dsub.service.MusicServiceFactory; +import github.daneren2005.dsub.util.Constants; +import github.daneren2005.dsub.util.Pair; +import github.daneren2005.dsub.util.TabBackgroundTask; +import java.util.HashSet; +import java.util.Set; public class SelectDirectoryFragment extends SubsonicTabFragment implements AdapterView.OnItemClickListener { private static final String TAG = SelectDirectoryFragment.class.getSimpleName(); @@ -59,6 +68,7 @@ public class SelectDirectoryFragment extends SubsonicTabFragment implements Adap emptyView = rootView.findViewById(R.id.select_album_empty); registerForContextMenu(entryList); + load(false); return rootView; } @@ -84,6 +94,189 @@ public class SelectDirectoryFragment extends SubsonicTabFragment implements Adap @Override protected void refresh() { - // load(true); + load(true); + } + + private void load(boolean refresh) { + Bundle args = getArguments(); + if(args != null) { + String id = args.getString(Constants.INTENT_EXTRA_NAME_ID); + String name = args.getString(Constants.INTENT_EXTRA_NAME_NAME); + String playlistId = args.getString(Constants.INTENT_EXTRA_NAME_PLAYLIST_ID); + String playlistName = args.getString(Constants.INTENT_EXTRA_NAME_PLAYLIST_NAME); + String albumListType = args.getString(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE); + int albumListSize = args.getInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, 0); + int albumListOffset = args.getInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0); + + if (playlistId != null) { + getPlaylist(playlistId, playlistName); + } else if (albumListType != null) { + getAlbumList(albumListType, albumListSize, albumListOffset); + } else { + getMusicDirectory(id, name, refresh); + } + } + } + + private void getMusicDirectory(final String id, final String name, final boolean refresh) { + // setTitle(name); + + new LoadTask() { + @Override + protected MusicDirectory load(MusicService service) throws Exception { + return service.getMusicDirectory(id, name, refresh, context, this); + } + }.execute(); + } + + private void getPlaylist(final String playlistId, final String playlistName) { + // setTitle(playlistName); + + new LoadTask() { + @Override + protected MusicDirectory load(MusicService service) throws Exception { + return service.getPlaylist(playlistId, playlistName, context, this); + } + }.execute(); + } + + private void getAlbumList(final String albumListType, final int size, final int offset) { + showHeader = false; + + /*if ("newest".equals(albumListType)) { + setTitle(R.string.main_albums_newest); + } else if ("random".equals(albumListType)) { + setTitle(R.string.main_albums_random); + } else if ("highest".equals(albumListType)) { + setTitle(R.string.main_albums_highest); + } else if ("recent".equals(albumListType)) { + setTitle(R.string.main_albums_recent); + } else if ("frequent".equals(albumListType)) { + setTitle(R.string.main_albums_frequent); + } else if ("starred".equals(albumListType)) { + setTitle(R.string.main_albums_starred); + }*/ + + new LoadTask() { + @Override + protected MusicDirectory load(MusicService service) throws Exception { + MusicDirectory result; + if ("starred".equals(albumListType)) { + result = service.getStarredList(context, this); + } else { + result = service.getAlbumList(albumListType, size, offset, context, this); + } + return result; + } + + @Override + protected void done(Pair result) { + if (!result.getFirst().getChildren().isEmpty()) { + if (!("starred".equals(albumListType))) { + moreButton.setVisibility(View.VISIBLE); + entryList.addFooterView(footer); + } + + moreButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + /*Intent intent = new Intent(SelectAlbumActivity.this, SelectAlbumActivity.class); + String type = getIntent().getStringExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE); + int size = getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, 0); + int offset = getIntent().getIntExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0) + size; + + intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE, type); + intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, size); + intent.putExtra(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, offset); + Util.startActivityWithoutTransition(SelectAlbumActivity.this, intent);*/ + } + }); + } + super.done(result); + } + }.execute(); + } + + private abstract class LoadTask extends TabBackgroundTask> { + + public LoadTask() { + super(SelectDirectoryFragment.this); + } + + protected abstract MusicDirectory load(MusicService service) throws Exception; + + @Override + protected Pair doInBackground() throws Throwable { + MusicService musicService = MusicServiceFactory.getMusicService(context); + MusicDirectory dir = load(musicService); + boolean valid = musicService.isLicenseValid(context, this); + return new Pair(dir, valid); + } + + @Override + protected void done(Pair result) { + entries = result.getFirst().getChildren(); + + int songCount = 0; + for (MusicDirectory.Entry entry : entries) { + if (!entry.isDirectory()) { + songCount++; + } + } + + if (songCount > 0) { + if(showHeader) { + entryList.addHeaderView(createHeader(entries), null, false); + } + } else { + hideButtons = true; + } + + emptyView.setVisibility(entries.isEmpty() ? View.VISIBLE : View.GONE); + entryList.setAdapter(entryAdapter = new EntryAdapter(context, getImageLoader(), entries, true)); + licenseValid = result.getSecond(); + // invalidateOptionsMenu(); + + /*boolean playAll = getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_AUTOPLAY, false); + if (playAll && songCount > 0) { + playAll(getIntent().getBooleanExtra(Constants.INTENT_EXTRA_NAME_SHUFFLE, false), false); + }*/ + } + } + + private View createHeader(List entries) { + View header = LayoutInflater.from(context).inflate(R.layout.select_album_header, entryList, false); + + View coverArtView = header.findViewById(R.id.select_album_art); + getImageLoader().loadImage(coverArtView, entries.get(0), true, true); + + TextView titleView = (TextView) header.findViewById(R.id.select_album_title); + // titleView.setText(getTitle()); + + int songCount = 0; + + Set artists = new HashSet(); + for (MusicDirectory.Entry entry : entries) { + if (!entry.isDirectory()) { + songCount++; + if (entry.getArtist() != null) { + artists.add(entry.getArtist()); + } + } + } + + TextView artistView = (TextView) header.findViewById(R.id.select_album_artist); + if (artists.size() == 1) { + artistView.setText(artists.iterator().next()); + artistView.setVisibility(View.VISIBLE); + } else { + artistView.setVisibility(View.GONE); + } + + TextView songCountView = (TextView) header.findViewById(R.id.select_album_song_count); + String s = context.getResources().getQuantityString(R.plurals.select_album_n_songs, songCount, songCount); + songCountView.setText(s.toUpperCase()); + + return header; } } \ No newline at end of file diff --git a/subsonic-android/src/github/daneren2005/dsub/fragments/SubsonicTabFragment.java b/subsonic-android/src/github/daneren2005/dsub/fragments/SubsonicTabFragment.java index 6d115bb9..9b79fd19 100644 --- a/subsonic-android/src/github/daneren2005/dsub/fragments/SubsonicTabFragment.java +++ b/subsonic-android/src/github/daneren2005/dsub/fragments/SubsonicTabFragment.java @@ -19,6 +19,7 @@ package github.daneren2005.dsub.fragments; import android.app.Activity; +import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -32,7 +33,6 @@ import github.daneren2005.dsub.util.ImageLoader; public class SubsonicTabFragment extends SherlockFragment { private static final String TAG = SubsonicTabActivity.class.getSimpleName(); - private static ImageLoader IMAGE_LOADER; protected SubsonicActivity context; protected View rootView; @@ -78,4 +78,11 @@ public class SubsonicTabFragment extends SherlockFragment { view.setText(message); } } + + protected synchronized ImageLoader getImageLoader() { + return context.getImageLoader(); + } + public synchronized static ImageLoader getStaticImageLoader(Context context) { + return SubsonicActivity.getStaticImageLoader(context); + } } diff --git a/subsonic-android/src/github/daneren2005/dsub/view/EntryAdapter.java b/subsonic-android/src/github/daneren2005/dsub/view/EntryAdapter.java index 476d3478..0d67c4c4 100644 --- a/subsonic-android/src/github/daneren2005/dsub/view/EntryAdapter.java +++ b/subsonic-android/src/github/daneren2005/dsub/view/EntryAdapter.java @@ -18,14 +18,12 @@ */ package github.daneren2005.dsub.view; -import github.daneren2005.dsub.view.AlbumView; -import github.daneren2005.dsub.view.SongView; +import android.content.Context; import java.util.List; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; -import github.daneren2005.dsub.activity.SubsonicTabActivity; import github.daneren2005.dsub.domain.MusicDirectory; import github.daneren2005.dsub.util.ImageLoader; @@ -34,12 +32,12 @@ import github.daneren2005.dsub.util.ImageLoader; */ public class EntryAdapter extends ArrayAdapter { - private final SubsonicTabActivity activity; + private final Context activity; private final ImageLoader imageLoader; private final boolean checkable; private List entries; - public EntryAdapter(SubsonicTabActivity activity, ImageLoader imageLoader, List entries, boolean checkable) { + public EntryAdapter(Context activity, ImageLoader imageLoader, List entries, boolean checkable) { super(activity, android.R.layout.simple_list_item_1, entries); this.entries = entries; this.activity = activity; -- cgit v1.2.3