Added sharing for songs. Added set as ringtone for songs.

This commit is contained in:
Karim Abou Zeid 2015-06-01 00:48:01 +02:00
commit 8869f4aeb2
11 changed files with 161 additions and 12 deletions

View file

@ -0,0 +1,60 @@
package com.kabouzeid.gramophone.dialogs;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.view.View;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.MusicUtil;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class SongShareDialog extends DialogFragment {
public static SongShareDialog create(final int songId) {
final SongShareDialog dialog = new SongShareDialog();
final Bundle args = new Bundle();
args.putInt("song_id", songId);
dialog.setArguments(args);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final int songId = getArguments().getInt("song_id");
final Song song = SongLoader.getSong(getActivity(), songId);
final String currentlyListening = getString(R.string.currently_listening_to_x_by_x, song.title, song.artistName);
return new MaterialDialog.Builder(getActivity())
.title(R.string.what_do_you_want_to_share)
.items(new CharSequence[]{getString(R.string.the_audio_file), currentlyListening})
.itemsCallback(new MaterialDialog.ListCallback() {
@Override
public void onSelection(MaterialDialog materialDialog, View view, int i, CharSequence charSequence) {
switch (i) {
case 0:
startActivity(Intent.createChooser(MusicUtil.createShareSongFileIntent(getActivity(), songId), null));
break;
case 1:
getActivity().startActivity(
Intent.createChooser(
new Intent()
.setAction(Intent.ACTION_SEND)
.putExtra(Intent.EXTRA_TEXT, currentlyListening)
.setType("text/plain"),
null
)
);
break;
}
}
})
.build();
}
}

View file

@ -18,6 +18,7 @@ import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import java.io.File;
@ -29,6 +30,12 @@ public class MenuItemClickHelper {
public static boolean handleSongMenuClick(AppCompatActivity activity, Song song, MenuItem item) {
switch (item.getItemId()) {
case R.id.action_set_as_ringtone:
MusicUtil.setRingtone(activity, song.id);
return true;
case R.id.action_share:
activity.startActivity(Intent.createChooser(MusicUtil.createShareSongFileIntent(activity, song.id), null));
return true;
case R.id.action_delete_from_disk:
DeleteSongsDialog.create(song).show(activity.getSupportFragmentManager(), "DELETE_SONGS");
return true;
@ -42,11 +49,11 @@ public class MenuItemClickHelper {
MusicPlayerRemote.enqueue(song);
return true;
case R.id.action_tag_editor:
Intent intent = new Intent(activity, SongTagEditorActivity.class);
intent.putExtra(AppKeys.E_ID, song.id);
Intent tagEditorIntent = new Intent(activity, SongTagEditorActivity.class);
tagEditorIntent.putExtra(AppKeys.E_ID, song.id);
if (activity instanceof PaletteColorHolder)
intent.putExtra(AppKeys.E_PALETTE, ((PaletteColorHolder) activity).getPaletteColor());
activity.startActivity(intent);
tagEditorIntent.putExtra(AppKeys.E_PALETTE, ((PaletteColorHolder) activity).getPaletteColor());
activity.startActivity(tagEditorIntent);
return true;
case R.id.action_details:
String songFilePath = SongFilePathLoader.getSongFilePath(activity, song.id);

View file

@ -28,6 +28,7 @@ import com.afollestad.materialdialogs.util.DialogUtils;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
import com.kabouzeid.gramophone.dialogs.SongShareDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
@ -458,6 +459,9 @@ public class MusicControllerActivity extends AbsFabActivity {
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.action_share:
SongShareDialog.create(song.id).show(getSupportFragmentManager(), "SHARE_SONG");
return true;
case R.id.action_equalizer:
NavigationUtil.openEqualizer(this);
return true;

View file

@ -4,17 +4,20 @@ import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.BaseColumns;
import android.provider.MediaStore;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
@ -30,11 +33,54 @@ import java.util.List;
public class MusicUtil {
public static final String TAG = MusicUtil.class.getSimpleName();
public static Uri getAlbumArtUri(int album_id) {
public static Uri getAlbumArtUri(int albumId) {
final Uri sArtworkUri = Uri
.parse("content://media/external/audio/albumart");
return ContentUris.withAppendedId(sArtworkUri, album_id);
return ContentUris.withAppendedId(sArtworkUri, albumId);
}
public static Uri getSongUri(int songId) {
return ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, songId);
}
public static Intent createShareSongFileIntent(final Context context, int songId) {
return new Intent()
.setAction(Intent.ACTION_SEND)
.putExtra(Intent.EXTRA_STREAM, Uri.parse(SongFilePathLoader.getSongFilePath(context, songId)))
.setType("audio/*");
}
public static void setRingtone(final Context context, final int id) {
final ContentResolver resolver = context.getContentResolver();
final Uri uri = getSongUri(id);
try {
final ContentValues values = new ContentValues(2);
values.put(MediaStore.Audio.AudioColumns.IS_RINGTONE, "1");
values.put(MediaStore.Audio.AudioColumns.IS_ALARM, "1");
resolver.update(uri, values, null, null);
} catch (final UnsupportedOperationException ignored) {
return;
}
Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.MediaColumns.TITLE},
BaseColumns._ID + "=?",
new String[]{String.valueOf(id)},
null);
try {
if (cursor != null && cursor.getCount() == 1) {
cursor.moveToFirst();
Settings.System.putString(resolver, Settings.System.RINGTONE, uri.toString());
final String message = context.getString(R.string.x_has_been_set_as_ringtone, cursor.getString(0));
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
} finally {
if (cursor != null) {
cursor.close();
cursor = null;
}
}
}
public static String getArtistInfoString(Context context, Artist artist) {
@ -47,7 +93,6 @@ public class MusicUtil {
return String.format("%02d:%02d", minutes, seconds);
}
//iTunes uses for example 1002 for track 2 CD1 or 3011 for track 11 CD3.
//this method converts those values to normal tracknumbers
public static int getFixedTrackNumber(int trackNumberToFix) {