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 --- res/layout/select_album_header.xml | 13 +++++- res/menu/select_album_context.xml | 6 +++ res/menu/select_share_context.xml | 4 ++ res/menu/select_song_context.xml | 6 +++ res/values/attrs.xml | 1 + res/values/strings.xml | 6 +-- res/values/themes.xml | 3 ++ res/xml/settings.xml | 12 +++-- .../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 + 13 files changed, 130 insertions(+), 9 deletions(-) diff --git a/res/layout/select_album_header.xml b/res/layout/select_album_header.xml index 33cbf93e..14bdf365 100644 --- a/res/layout/select_album_header.xml +++ b/res/layout/select_album_header.xml @@ -60,7 +60,18 @@ android:singleLine="true" android:ellipsize="none"/> - + + + diff --git a/res/menu/select_album_context.xml b/res/menu/select_album_context.xml index 6da0150b..b1e0e42c 100644 --- a/res/menu/select_album_context.xml +++ b/res/menu/select_album_context.xml @@ -52,4 +52,10 @@ android:id="@+id/album_menu_star" android:title="@string/common.star"/> + + + + diff --git a/res/menu/select_share_context.xml b/res/menu/select_share_context.xml index 3ef2826f..3db445f6 100644 --- a/res/menu/select_share_context.xml +++ b/res/menu/select_share_context.xml @@ -6,6 +6,10 @@ android:id="@+id/share_menu_info" android:title="@string/common.info"/> + + + + + + diff --git a/res/values/attrs.xml b/res/values/attrs.xml index ae0939f1..b557035c 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -19,5 +19,6 @@ + diff --git a/res/values/strings.xml b/res/values/strings.xml index 2c0d2ff3..faa2922a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -82,6 +82,7 @@ Stop syncing Show all media Show Artist + Share Playlists Update Information @@ -377,12 +378,10 @@ Show Sync Notification Show a notification after new media has been synced Optional Menu Options - Play Next Show Play next in menus - Play Last Show Play last in menus - Star Show Star in menus + Show Share in menus Shuffle By Start Year: @@ -407,6 +406,7 @@ Expires: Updated share information for %s Failed to update share information for %s + Share via A network error occurred. Retrying %1$d of %2$d. diff --git a/res/values/themes.xml b/res/values/themes.xml index ef7cd90e..9aa83d2a 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -22,6 +22,7 @@ @drawable/main_select_server_light @drawable/downloading_light @drawable/ic_menu_bookmark_light + @drawable/ic_menu_share_light @array/drawerItemIconsLight @style/DSub.TextViewStyle @style/DSub.ButtonStyle @@ -49,6 +50,7 @@ @drawable/main_select_server_dark @drawable/downloading_dark @drawable/ic_menu_bookmark_dark + @drawable/ic_menu_share_dark @array/drawerItemIconsDark @style/DSub.TextViewStyle @style/DSub.ButtonStyle @@ -79,6 +81,7 @@ @drawable/main_select_server_dark @drawable/downloading_dark @drawable/ic_menu_bookmark_dark + @drawable/ic_menu_share_dark @array/drawerItemIconsDark @style/DSub.TextViewStyle @style/DSub.ButtonStyle diff --git a/res/xml/settings.xml b/res/xml/settings.xml index 58549367..d9430282 100644 --- a/res/xml/settings.xml +++ b/res/xml/settings.xml @@ -61,23 +61,29 @@ android:title="@string/settings.menu_options.title"> + + { 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