From 409376369ce1e66c1e408c8e6f3f7aa051daed62 Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Sun, 29 Dec 2013 13:28:15 -0800 Subject: #173 Rename url for non-subsonic.org, add ability to create/publish shares --- .../dsub/fragments/SelectDirectoryFragment.java | 16 +++++++ .../dsub/fragments/SelectShareFragment.java | 3 ++ .../dsub/fragments/SubsonicFragment.java | 54 +++++++++++++++++++++- .../dsub/service/parser/ShareParser.java | 14 +++++- src/github/daneren2005/dsub/util/Constants.java | 1 + 5 files changed, 86 insertions(+), 2 deletions(-) (limited to 'src/github/daneren2005') diff --git a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java index f16c197d..23857f91 100644 --- a/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectDirectoryFragment.java @@ -940,6 +940,8 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter titleView.setPadding(0, 6, 4, 8); } else if(name != null) { titleView.setText(name); + } else if(share != null) { + titleView.setVisibility(View.GONE); } int songCount = 0; @@ -982,6 +984,20 @@ public class SelectDirectoryFragment extends SubsonicFragment implements Adapter songLengthView.setVisibility(View.GONE); } + if(add) { + ImageView shareButton = (ImageView) header.findViewById(R.id.select_album_share); + if(share != null || podcastId != null || !Util.getPreferences(context).getBoolean(Constants.PREFERENCES_KEY_MENU_SHARED, true)) { + shareButton.setVisibility(View.GONE); + } else { + shareButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + createShare(SelectDirectoryFragment.this.entries); + } + }); + } + } + if(add) { return header; } else { diff --git a/src/github/daneren2005/dsub/fragments/SelectShareFragment.java b/src/github/daneren2005/dsub/fragments/SelectShareFragment.java index 556fc8da..92d2d4b6 100644 --- a/src/github/daneren2005/dsub/fragments/SelectShareFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectShareFragment.java @@ -55,6 +55,9 @@ public class SelectShareFragment extends SelectListFragment { Share share = (Share) listView.getItemAtPosition(info.position); switch (menuItem.getItemId()) { + case R.id.share_menu_share: + shareExternal(share); + break; case R.id.share_menu_info: displayShareInfo(share); break; diff --git a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java index 626d4259..e57f032f 100644 --- a/src/github/daneren2005/dsub/fragments/SubsonicFragment.java +++ b/src/github/daneren2005/dsub/fragments/SubsonicFragment.java @@ -214,6 +214,9 @@ public class SubsonicFragment extends Fragment { if(!prefs.getBoolean(Constants.PREFERENCES_KEY_MENU_STAR, true)) { menu.setGroupVisible(R.id.hide_star, false); } + if(!prefs.getBoolean(Constants.PREFERENCES_KEY_MENU_SHARED, true)) { + menu.setGroupVisible(R.id.hide_share, false); + } } protected void recreateContextMenu(ContextMenu menu) { @@ -234,7 +237,7 @@ public class SubsonicFragment extends Fragment { public boolean onContextItemSelected(MenuItem menuItem, Object selectedItem) { Artist artist = selectedItem instanceof Artist ? (Artist) selectedItem : null; MusicDirectory.Entry entry = selectedItem instanceof MusicDirectory.Entry ? (MusicDirectory.Entry) selectedItem : null; - List songs = new ArrayList(10); + List songs = new ArrayList(1); songs.add(entry); switch (menuItem.getItemId()) { @@ -292,6 +295,9 @@ public class SubsonicFragment extends Fragment { case R.id.album_menu_show_artist: showArtist((MusicDirectory.Entry) selectedItem); break; + case R.id.album_menu_share: + createShare(songs); + break; case R.id.song_menu_play_now: getDownloadService().clear(); getDownloadService().download(songs, false, true, true, false); @@ -327,6 +333,9 @@ public class SubsonicFragment extends Fragment { case R.id.song_menu_stream_external: streamExternalPlayer(entry); break; + case R.id.song_menu_share: + createShare(songs); + break; default: return false; } @@ -1076,6 +1085,49 @@ public class SubsonicFragment extends Fragment { replaceFragment(fragment, getRootId(), true); } + + public void createShare(final List entries) { + new LoadingTask>(context, true) { + @Override + protected List doInBackground() throws Throwable { + List ids = new ArrayList(entries.size()); + for(MusicDirectory.Entry entry: entries) { + ids.add(entry.getId()); + } + + MusicService musicService = MusicServiceFactory.getMusicService(context); + return musicService.createShare(ids, null, 0L, context, this); + } + + @Override + protected void done(final List shares) { + if(shares.size() > 0) { + Share share = shares.get(0); + shareExternal(share); + } else { + Util.toast(context, context.getResources().getString(R.string.playlist_error), false); + } + } + + @Override + protected void error(Throwable error) { + String msg; + if (error instanceof OfflineException || error instanceof ServerTooOldException) { + msg = getErrorMessage(error); + } else { + msg = context.getResources().getString(R.string.playlist_error) + " " + getErrorMessage(error); + } + + Util.toast(context, msg, false); + } + }.execute(); + } + public void shareExternal(Share share) { + Intent intent = new Intent(Intent.ACTION_SEND); + intent.setType("text/plain"); + intent.putExtra(Intent.EXTRA_TEXT, share.getUrl()); + context.startActivity(Intent.createChooser(intent, context.getResources().getString(R.string.share_via))); + } public GestureDetector getGestureDetector() { return gestureScanner; diff --git a/src/github/daneren2005/dsub/service/parser/ShareParser.java b/src/github/daneren2005/dsub/service/parser/ShareParser.java index 4688faf8..27a53d66 100644 --- a/src/github/daneren2005/dsub/service/parser/ShareParser.java +++ b/src/github/daneren2005/dsub/service/parser/ShareParser.java @@ -19,11 +19,15 @@ package github.daneren2005.dsub.service.parser; import android.content.Context; +import android.content.SharedPreferences; import android.util.Log; import github.daneren2005.dsub.R; import github.daneren2005.dsub.domain.Share; +import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.ProgressListener; +import github.daneren2005.dsub.util.Util; + import org.xmlpull.v1.XmlPullParser; import java.io.Reader; import java.util.ArrayList; @@ -47,6 +51,14 @@ public class ShareParser extends MusicDirectoryEntryParser { List dir = new ArrayList(); Share share = null; int eventType; + + SharedPreferences prefs = Util.getPreferences(context); + int instance = prefs.getInt(Constants.PREFERENCES_KEY_SERVER_INSTANCE, 1); + String serverUrl = prefs.getString(Constants.PREFERENCES_KEY_SERVER_URL + instance, null); + if(serverUrl.charAt(serverUrl.length() - 1) != '/') { + serverUrl += '/'; + } + serverUrl += "share/"; do { eventType = nextParseEvent(); @@ -57,7 +69,7 @@ public class ShareParser extends MusicDirectoryEntryParser { if ("share".equals(name)) { share = new Share(); share.setCreated(get("created")); - share.setUrl(get("url")); + share.setUrl(get("url").replaceFirst(".*/([^/?]+).*", serverUrl + "$1")); share.setDescription(get("description")); share.setExpires(get("expires")); share.setId(get("id")); diff --git a/src/github/daneren2005/dsub/util/Constants.java b/src/github/daneren2005/dsub/util/Constants.java index c51e1ee1..6eb859a8 100644 --- a/src/github/daneren2005/dsub/util/Constants.java +++ b/src/github/daneren2005/dsub/util/Constants.java @@ -135,6 +135,7 @@ public final class Constants { public static final String PREFERENCES_KEY_MENU_PLAY_NEXT = "showPlayNext"; public static final String PREFERENCES_KEY_MENU_PLAY_LAST = "showPlayLast"; public static final String PREFERENCES_KEY_MENU_STAR = "showStar"; + public static final String PREFERENCES_KEY_MENU_SHARED = "showShared"; public static final String PREFERENCES_KEY_SHARED_ENABLED = "sharedEnabled"; public static final String OFFLINE_SCROBBLE_COUNT = "scrobbleCount"; -- cgit v1.2.3