Implement share action. Part of #240

This commit is contained in:
Адонай Элохим 2016-07-18 01:19:34 +03:00
parent ab0b0b7db9
commit 7bf9d691cb
5 changed files with 59 additions and 8 deletions

View File

@ -253,6 +253,9 @@
<string name="autoplaylist_playcounts_name" formatted="false">%d лучших </string>
<string name="permission_request_summary">Vanilla Music необходимо разрешение на чтение, чтобы отобразить Вашу музыку в фонотеке</string>
<string name="reverse_sort">в обратном порядке</string>
<string name="share">Поделиться…</string>
<string name="sendto">Отправить…</string>
<string name="no_receiving_apps">Нет подходящих приложений для отправки!</string>
<!--SD Scanner-->
<string name="sdscan_help">Запуск сканирования в Vanilla Music приведёт к перестройке всей базы медиаданных.</string>
<string name="button_start">Начать сканирование</string>

View File

@ -171,7 +171,7 @@ THE SOFTWARE.
<string name="replaygain_untagged_debump_title">Songs without ReplayGain tag</string>
<string name="replaygain_untagged_debump_summary">Decrease volume by</string>
<string name="replaygain_preamp_note_title">Note</string>
<string name="replaygain_preamp_note_content">Android does not allow Vanilla Music to raise the volume to >100%. Setting the Pre-amp to a high value may cause issues if you are listening to \'quiet\' music. \n\nRecommended values are:\n-> -3dB for silent/classical music\n-> +3dB for post-2000 recordings</string>
<string name="replaygain_preamp_note_content">Android does not allow Vanilla Music to raise the volume to >100%. Setting the Pre-amp to a high value may cause issues if you are listening to \'quiet\' music. \n\nRecommended values are:\n-> -3dB for silent/classical music\n-> +3dB for post-2000 recordings</string>
<string name="readahead">Enable readahead</string>
<string name="readahead_summary">Readahead the currently playing song. This option may solve \'audio dropout\' issues. (caused by a slow SD card)</string>
@ -295,6 +295,10 @@ THE SOFTWARE.
<string name="permission_request_summary">Vanilla Music needs read permission to display your music library</string>
<string name="reverse_sort">Reverse sort</string>
<string name="share">Share…</string>
<string name="sendto">Send to…</string>
<string name="no_receiving_apps">No receiving apps found for this media type!</string>
<!-- SD Scanner -->
<string name="sdscan_help">Starting a rescan causes Vanilla Music to trigger a full rebuild of the media database.</string>
<string name="button_start">Start Rescan</string>

View File

@ -307,6 +307,7 @@ public class FullPlaybackActivity extends SlidingPlaybackActivity
menu.add(0, MENU_ENQUEUE_ARTIST, 30, R.string.enqueue_current_artist);
menu.add(0, MENU_ENQUEUE_GENRE, 30, R.string.enqueue_current_genre);
menu.add(0, MENU_ADD_TO_PLAYLIST, 30, R.string.add_to_playlist);
menu.add(0, MENU_SHARE, 30, R.string.share);
mFavorites = menu.add(0, MENU_SONG_FAVORITE, 0, R.string.add_to_favorites).setIcon(R.drawable.btn_rating_star_off_mtrl_alpha).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM);
// ensure that mFavorites is updated
@ -352,6 +353,9 @@ public class FullPlaybackActivity extends SlidingPlaybackActivity
dialog.show(getFragmentManager(), "PlaylistDialog");
}
break;
case MENU_SHARE:
MediaUtils.shareMedia(FullPlaybackActivity.this, MediaUtils.TYPE_SONG, song.id);
break;
case MENU_DELETE:
final PlaybackService playbackService = PlaybackService.get(this);
final PlaybackActivity activity = this;

View File

@ -33,7 +33,11 @@ import java.util.Vector;
import java.util.zip.CRC32;
import junit.framework.Assert;
import android.content.ActivityNotFoundException;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
@ -42,6 +46,7 @@ import android.text.TextUtils;
import android.database.MatrixCursor;
import android.media.MediaMetadataRetriever;
import android.util.Log;
import android.widget.Toast;
/**
@ -341,7 +346,7 @@ public class MediaUtils {
String[] projection = { "_id" };
Uri uri = MediaStore.Audio.Genres.getContentUriForAudioId("external", (int)id);
Cursor cursor = queryResolver(resolver, uri, projection, null, null, null);
if (cursor != null) {
if (cursor.moveToNext())
return cursor.getLong(0);
@ -381,7 +386,7 @@ public class MediaUtils {
if (albumShuffle) {
List<Song> tempList = new ArrayList<Song>(list);
Collections.sort(tempList);
// Build map of albumId to start index in sorted list
Map<Long, Integer> albumStartIndices = new HashMap<Long, Integer>();
int index = 0;
@ -391,11 +396,11 @@ public class MediaUtils {
}
index++;
}
//Extract album list and shuffle
List<Long> shuffledAlbums = new ArrayList<Long>(albumStartIndices.keySet());
Collections.shuffle(shuffledAlbums, random);
//Build Song list from album list
list.clear();
for (Long albumId : shuffledAlbums) {
@ -504,6 +509,40 @@ public class MediaUtils {
sAllSongs = null;
}
/**
* Creates and sends share intent across the system. Includes all eligible songs found
* within this type and id (e.g. all songs in album, all songs for this artist etc.)
* @param ctx context to execute resolving on
* @param type media type to look for e.g. {@link MediaUtils#TYPE_SONG}
* @param id id of item to send
*/
public static void shareMedia(Context ctx, int type, long id) {
if (type == TYPE_INVALID || id <= 0) { // invalid
return;
}
ContentResolver resolver = ctx.getContentResolver();
String[] projection = new String [] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA };
Cursor cursor = buildQuery(type, id, projection, null).runQuery(resolver);
if(cursor == null) {
return;
}
try {
while (cursor.moveToNext()) { // for all songs resolved...
File songFile = new File(cursor.getString(1));
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("audio/*");
share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(songFile));
ctx.startActivity(Intent.createChooser(share, ctx.getResources().getString(R.string.sendto)));
}
} catch (ActivityNotFoundException ex) {
Toast.makeText(ctx, R.string.no_receiving_apps, Toast.LENGTH_SHORT).show();
} finally {
cursor.close();
}
}
/**
* Returns the first matching song (or NULL) of given type + id combination
*
@ -588,16 +627,16 @@ public class MediaUtils {
break;
}
}
pfx = (new File(pfx)).getParent();
if(pfx == null)
break; /* hit root */
}
}
return path;
}
/**
* Adds a final slash if the path points to an existing directory
*/

View File

@ -375,6 +375,7 @@ public abstract class PlaybackActivity extends Activity
static final int MENU_DELETE = 16;
static final int MENU_EMPTY_QUEUE = 17;
static final int MENU_ADD_TO_PLAYLIST = 18;
static final int MENU_SHARE = 19;
@Override
public boolean onCreateOptionsMenu(Menu menu)