Added sharing for songs. Added set as ringtone for songs.
This commit is contained in:
parent
f921738783
commit
8869f4aeb2
11 changed files with 161 additions and 12 deletions
|
|
@ -28,7 +28,7 @@ android {
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 22
|
targetSdkVersion 22
|
||||||
versionCode 29
|
versionCode 29
|
||||||
versionName "0.9.13b DEV-2"
|
versionName "0.9.13b DEV-3"
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
compileOptions {
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
|
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
|
||||||
|
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".App"
|
android:name=".App"
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -18,6 +18,7 @@ import com.kabouzeid.gramophone.model.Playlist;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
|
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
|
||||||
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
@ -29,6 +30,12 @@ public class MenuItemClickHelper {
|
||||||
|
|
||||||
public static boolean handleSongMenuClick(AppCompatActivity activity, Song song, MenuItem item) {
|
public static boolean handleSongMenuClick(AppCompatActivity activity, Song song, MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
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:
|
case R.id.action_delete_from_disk:
|
||||||
DeleteSongsDialog.create(song).show(activity.getSupportFragmentManager(), "DELETE_SONGS");
|
DeleteSongsDialog.create(song).show(activity.getSupportFragmentManager(), "DELETE_SONGS");
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -42,11 +49,11 @@ public class MenuItemClickHelper {
|
||||||
MusicPlayerRemote.enqueue(song);
|
MusicPlayerRemote.enqueue(song);
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_tag_editor:
|
case R.id.action_tag_editor:
|
||||||
Intent intent = new Intent(activity, SongTagEditorActivity.class);
|
Intent tagEditorIntent = new Intent(activity, SongTagEditorActivity.class);
|
||||||
intent.putExtra(AppKeys.E_ID, song.id);
|
tagEditorIntent.putExtra(AppKeys.E_ID, song.id);
|
||||||
if (activity instanceof PaletteColorHolder)
|
if (activity instanceof PaletteColorHolder)
|
||||||
intent.putExtra(AppKeys.E_PALETTE, ((PaletteColorHolder) activity).getPaletteColor());
|
tagEditorIntent.putExtra(AppKeys.E_PALETTE, ((PaletteColorHolder) activity).getPaletteColor());
|
||||||
activity.startActivity(intent);
|
activity.startActivity(tagEditorIntent);
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_details:
|
case R.id.action_details:
|
||||||
String songFilePath = SongFilePathLoader.getSongFilePath(activity, song.id);
|
String songFilePath = SongFilePathLoader.getSongFilePath(activity, song.id);
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ import com.afollestad.materialdialogs.util.DialogUtils;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||||
import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
|
import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
|
||||||
|
import com.kabouzeid.gramophone.dialogs.SongShareDialog;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager;
|
import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager;
|
||||||
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
|
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
|
||||||
|
|
@ -458,6 +459,9 @@ public class MusicControllerActivity extends AbsFabActivity {
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
int id = item.getItemId();
|
int id = item.getItemId();
|
||||||
switch (id) {
|
switch (id) {
|
||||||
|
case R.id.action_share:
|
||||||
|
SongShareDialog.create(song.id).show(getSupportFragmentManager(), "SHARE_SONG");
|
||||||
|
return true;
|
||||||
case R.id.action_equalizer:
|
case R.id.action_equalizer:
|
||||||
NavigationUtil.openEqualizer(this);
|
NavigationUtil.openEqualizer(this);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -4,17 +4,20 @@ import android.content.ContentResolver;
|
||||||
import android.content.ContentUris;
|
import android.content.ContentUris;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.provider.BaseColumns;
|
import android.provider.BaseColumns;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
|
import android.provider.Settings;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
|
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
|
||||||
import com.kabouzeid.gramophone.loader.SongLoader;
|
import com.kabouzeid.gramophone.loader.SongLoader;
|
||||||
import com.kabouzeid.gramophone.model.Artist;
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
||||||
|
|
@ -30,11 +33,54 @@ import java.util.List;
|
||||||
public class MusicUtil {
|
public class MusicUtil {
|
||||||
public static final String TAG = MusicUtil.class.getSimpleName();
|
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
|
final Uri sArtworkUri = Uri
|
||||||
.parse("content://media/external/audio/albumart");
|
.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) {
|
public static String getArtistInfoString(Context context, Artist artist) {
|
||||||
|
|
@ -47,7 +93,6 @@ public class MusicUtil {
|
||||||
return String.format("%02d:%02d", minutes, seconds);
|
return String.format("%02d:%02d", minutes, seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//iTunes uses for example 1002 for track 2 CD1 or 3011 for track 11 CD3.
|
//iTunes uses for example 1002 for track 2 CD1 or 3011 for track 11 CD3.
|
||||||
//this method converts those values to normal tracknumbers
|
//this method converts those values to normal tracknumbers
|
||||||
public static int getFixedTrackNumber(int trackNumberToFix) {
|
public static int getFixedTrackNumber(int trackNumberToFix) {
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,10 @@
|
||||||
android:id="@+id/action_go_to_artist"
|
android:id="@+id/action_go_to_artist"
|
||||||
android:title="@string/action_go_to_artist"
|
android:title="@string/action_go_to_artist"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_share"
|
||||||
|
android:title="@string/action_share"
|
||||||
|
app:showAsAction="never" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_tag_editor"
|
android:id="@+id/action_tag_editor"
|
||||||
android:title="@string/action_tag_editor"
|
android:title="@string/action_tag_editor"
|
||||||
|
|
@ -30,6 +34,10 @@
|
||||||
android:id="@+id/action_details"
|
android:id="@+id/action_details"
|
||||||
android:title="@string/action_details"
|
android:title="@string/action_details"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_set_as_ringtone"
|
||||||
|
android:title="@string/action_set_as_ringtone"
|
||||||
|
app:showAsAction="never" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_delete_from_disk"
|
android:id="@+id/action_delete_from_disk"
|
||||||
android:title="@string/action_delete_from_disk"
|
android:title="@string/action_delete_from_disk"
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,10 @@
|
||||||
android:id="@+id/action_go_to_artist"
|
android:id="@+id/action_go_to_artist"
|
||||||
android:title="@string/action_go_to_artist"
|
android:title="@string/action_go_to_artist"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_share"
|
||||||
|
android:title="@string/action_share"
|
||||||
|
app:showAsAction="never" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_tag_editor"
|
android:id="@+id/action_tag_editor"
|
||||||
android:title="@string/action_tag_editor"
|
android:title="@string/action_tag_editor"
|
||||||
|
|
@ -33,6 +37,10 @@
|
||||||
android:id="@+id/action_details"
|
android:id="@+id/action_details"
|
||||||
android:title="@string/action_details"
|
android:title="@string/action_details"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_set_as_ringtone"
|
||||||
|
android:title="@string/action_set_as_ringtone"
|
||||||
|
app:showAsAction="never" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_delete_from_disk"
|
android:id="@+id/action_delete_from_disk"
|
||||||
android:title="@string/action_delete_from_disk"
|
android:title="@string/action_delete_from_disk"
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,10 @@
|
||||||
android:id="@+id/action_go_to_artist"
|
android:id="@+id/action_go_to_artist"
|
||||||
android:title="@string/action_go_to_artist"
|
android:title="@string/action_go_to_artist"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_share"
|
||||||
|
android:title="@string/action_share"
|
||||||
|
app:showAsAction="never" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_tag_editor"
|
android:id="@+id/action_tag_editor"
|
||||||
android:title="@string/action_tag_editor"
|
android:title="@string/action_tag_editor"
|
||||||
|
|
@ -29,6 +33,10 @@
|
||||||
android:id="@+id/action_details"
|
android:id="@+id/action_details"
|
||||||
android:title="@string/action_details"
|
android:title="@string/action_details"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_set_as_ringtone"
|
||||||
|
android:title="@string/action_set_as_ringtone"
|
||||||
|
app:showAsAction="never" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_delete_from_disk"
|
android:id="@+id/action_delete_from_disk"
|
||||||
android:title="@string/action_delete_from_disk"
|
android:title="@string/action_delete_from_disk"
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,15 @@
|
||||||
android:icon="@drawable/ic_queue_music_white_24dp"
|
android:icon="@drawable/ic_queue_music_white_24dp"
|
||||||
android:title="@string/action_playing_queue"
|
android:title="@string/action_playing_queue"
|
||||||
app:showAsAction="ifRoom"/>
|
app:showAsAction="ifRoom"/>
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_share"
|
||||||
|
android:icon="@drawable/ic_share_white_24dp"
|
||||||
|
android:title="@string/action_share"
|
||||||
|
app:showAsAction="ifRoom"/>
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_shuffle_all"
|
android:id="@+id/action_shuffle_all"
|
||||||
android:title="@string/shuffle_all"
|
android:title="@string/shuffle_all"
|
||||||
app:showAsAction="never"/>
|
app:showAsAction="never"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_add_to_playlist"
|
android:id="@+id/action_add_to_playlist"
|
||||||
android:title="@string/action_add_to_playlist"
|
android:title="@string/action_add_to_playlist"
|
||||||
|
|
@ -30,7 +33,6 @@
|
||||||
android:id="@+id/action_tag_editor"
|
android:id="@+id/action_tag_editor"
|
||||||
android:title="@string/action_tag_editor"
|
android:title="@string/action_tag_editor"
|
||||||
app:showAsAction="never"/>
|
app:showAsAction="never"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_equalizer"
|
android:id="@+id/action_equalizer"
|
||||||
android:orderInCategory="99"
|
android:orderInCategory="99"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,12 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
|
<string name="what_do_you_want_to_share">What do you want to share?</string>
|
||||||
|
<string name="currently_listening_to_x_by_x">Currently listening to %1$s by %2$s</string>
|
||||||
|
<string name="the_audio_file">The audio file</string>
|
||||||
|
<string name="do_you_want_to_set_x_as_ringtone">Do you want to set %1$s as your ringtone?</string>
|
||||||
|
<string name="x_has_been_set_as_ringtone">%1$s has been set as your ringtone.</string>
|
||||||
|
<string name="action_set_as_ringtone">Set as ringtone</string>
|
||||||
<string name="action_share">Share</string>
|
<string name="action_share">Share</string>
|
||||||
<string name="action_settings">Settings</string>
|
<string name="action_settings">Settings</string>
|
||||||
<string name="action_about">About</string>
|
<string name="action_about">About</string>
|
||||||
|
|
@ -19,7 +25,7 @@
|
||||||
<string name="songs">Songs</string>
|
<string name="songs">Songs</string>
|
||||||
<string name="playlists">Playlists</string>
|
<string name="playlists">Playlists</string>
|
||||||
<string name="nothing_playing">Nothing is playing</string>
|
<string name="nothing_playing">Nothing is playing</string>
|
||||||
<string name="unplayable_file">Sorry - an error occurred while attempting to play this song</string>
|
<string name="unplayable_file">Sorry - an error occurred while attempting to play this song.</string>
|
||||||
<string name="biography_unavailable">Sorry, we were not able to find a matching biography for this artist.</string>
|
<string name="biography_unavailable">Sorry, we were not able to find a matching biography for this artist.</string>
|
||||||
<string name="biography">Biography</string>
|
<string name="biography">Biography</string>
|
||||||
<string name="audio_focus_denied">We were not able to gain audio focus.</string>
|
<string name="audio_focus_denied">We were not able to gain audio focus.</string>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue