Lots of progress with dynamic theming, the nav drawer now uses a RecyclerView, AboutDeveloperDialogHelper is now a DialogFragment, RTL support (to suppress Lint warnings), other various small fixes, cleaned up and formatted lot of code (and removed un-used resources), R.string.ok > android.R.string.ok, R.string.cancel > android.R.string.cancel, switched dialog helpers to DialogFragments.

This commit is contained in:
Aidan Follestad 2015-04-16 16:47:02 -05:00
commit 7ce86afd74
265 changed files with 2853 additions and 2292 deletions

View file

@ -1,47 +0,0 @@
package com.kabouzeid.gramophone.helper;
import android.content.Context;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.util.Log;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
/**
* Created by karim on 05.02.15.
*/
public class AboutDeveloperDialogHelper {
public static final String TAG = AboutDeveloperDialogHelper.class.getSimpleName();
public static MaterialDialog getDialog(final Context context) {
MaterialDialog dialog = new MaterialDialog.Builder(context)
.title(context.getResources().getString(R.string.app_name) + " " + getCurrentVersionName(context))
.iconRes(R.drawable.ic_launcher)
.content(TextUtils.concat(context.getResources().getText(R.string.credits_1),
context.getResources().getText(R.string.credits_2),
context.getResources().getText(R.string.credits_3),
context.getResources().getText(R.string.credits_4))
)
.positiveText(context.getResources().getString(R.string.ok))
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
dialog.dismiss();
}
})
.build();
return dialog;
}
private static String getCurrentVersionName(final Context context) {
String versionName = "";
try {
versionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Unable to get current app version number.", e);
}
return versionName;
}
}

View file

@ -1,49 +0,0 @@
package com.kabouzeid.gramophone.helper;
import android.content.Context;
import android.view.View;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.loader.PlaylistLoader;
import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
import java.util.ArrayList;
import java.util.List;
/**
* Created by karim on 17.03.15.
*/
public class AddToPlaylistDialogHelper {
public static MaterialDialog getDialog(final Context context, final Song song) {
List<Song> tmpSong = new ArrayList<>();
tmpSong.add(song);
return getDialog(context, tmpSong);
}
public static MaterialDialog getDialog(final Context context, final List<Song> songs) {
final List<Playlist> playlists = PlaylistLoader.getAllPlaylists(context);
CharSequence[] playlistNames = new CharSequence[playlists.size() + 1];
playlistNames[0] = context.getResources().getString(R.string.action_new_playlist);
for (int i = 1; i < playlistNames.length; i++) {
playlistNames[i] = playlists.get(i - 1).name;
}
return new MaterialDialog.Builder(context)
.items(playlistNames)
.itemsCallback(new MaterialDialog.ListCallback() {
@Override
public void onSelection(MaterialDialog materialDialog, View view, int i, CharSequence charSequence) {
if (i == 0) {
materialDialog.dismiss();
CreatePlaylistDialogHelper.getDialog(context, songs).show();
} else {
materialDialog.dismiss();
PlaylistsUtil.addToPlaylist(context, songs, playlists.get(i - 1).id);
}
}
})
.build();
}
}

View file

@ -1,45 +0,0 @@
package com.kabouzeid.gramophone.helper;
import android.content.Context;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
import java.util.ArrayList;
import java.util.List;
/**
* Created by karim on 17.03.15.
*/
public class CreatePlaylistDialogHelper {
public static MaterialDialog getDialog(final Context context, final Song song) {
List<Song> tmpSong = new ArrayList<>();
tmpSong.add(song);
return getDialog(context, tmpSong);
}
public static MaterialDialog getDialog(final Context context, final List<Song> songs) {
return new MaterialDialog.Builder(context)
.title(R.string.action_new_playlist)
.positiveText(R.string.ok)
.negativeText(R.string.cancel)
.input("", "", new MaterialDialog.InputCallback() {
@Override
public void onInput(MaterialDialog materialDialog, CharSequence charSequence) {
if (!charSequence.toString().trim().equals("")) {
final int playlistId = PlaylistsUtil.createPlaylist(context, charSequence.toString());
if (playlistId != -1 && songs != null) {
PlaylistsUtil.addToPlaylist(context, songs, playlistId);
}
}
}
})
.build();
}
public static MaterialDialog getDialog(final Context context) {
return getDialog(context, (List<Song>) null);
}
}

View file

@ -1,33 +0,0 @@
package com.kabouzeid.gramophone.helper;
import android.content.Context;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
/**
* Created by karim on 19.03.15.
*/
public class DeletePlaylistDialogHelper {
public static MaterialDialog getDialog(final Context context, final int playlistId) {
return new MaterialDialog.Builder(context)
.title(context.getResources().getString(R.string.delete_playlist) + PlaylistsUtil.getNameForPlaylist(context, playlistId))
.positiveText(context.getResources().getString(R.string.ok))
.negativeText(context.getResources().getString(R.string.cancel))
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
dialog.dismiss();
PlaylistsUtil.deletePlaylist(context, playlistId);
}
@Override
public void onNegative(MaterialDialog dialog) {
super.onNegative(dialog);
dialog.dismiss();
}
}).build();
}
}

View file

@ -11,9 +11,10 @@ import java.util.ArrayList;
import java.util.List;
/**
* Created by karim on 23.03.15.
* @author Karim Abou Zeid (kabouzeid), Aidan Follestad (afollestad)
*/
public class DeleteSongsDialogHelper {
public static MaterialDialog getDialog(final Context context, final Song song) {
List<Song> tmpList = new ArrayList<>();
tmpList.add(song);
@ -27,7 +28,7 @@ public class DeleteSongsDialogHelper {
.title(title)
.content(context.getResources().getString(R.string.delete_warning))
.positiveText(context.getResources().getString(R.string.delete))
.negativeText(context.getResources().getString(R.string.cancel))
.negativeText(context.getResources().getString(android.R.string.cancel))
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {

View file

@ -1,11 +1,15 @@
package com.kabouzeid.gramophone.helper;
import android.app.Activity;
import android.content.Intent;
import android.support.v4.util.Pair;
import android.support.v7.app.ActionBarActivity;
import android.view.MenuItem;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.DeletePlaylistDialog;
import com.kabouzeid.gramophone.dialogs.RenamePlaylistDialog;
import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.Playlist;
@ -17,16 +21,17 @@ import com.kabouzeid.gramophone.util.NavigationUtil;
import java.io.File;
/**
* Created by karim on 11.04.15.
* @author Karim Abou Zeid (kabouzeid), Aidan Follestad (afollestad)
*/
public class MenuItemClickHelper {
public static boolean handleSongMenuClick(Activity activity, Song song, MenuItem item){
public static boolean handleSongMenuClick(ActionBarActivity activity, Song song, MenuItem item) {
switch (item.getItemId()) {
case R.id.action_delete_from_disk:
DeleteSongsDialogHelper.getDialog(activity, song).show();
return true;
case R.id.action_add_to_playlist:
AddToPlaylistDialogHelper.getDialog(activity, song).show();
AddToPlaylistDialog.create(song).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
return true;
case R.id.action_play_next:
MusicPlayerRemote.playNext(song);
@ -42,31 +47,31 @@ public class MenuItemClickHelper {
case R.id.action_details:
String songFilePath = SongFilePathLoader.getSongFilePath(activity, song.id);
File songFile = new File(songFilePath);
SongDetailDialogHelper.getDialog(activity, songFile).show();
SongDetailDialog.create(songFile).show(activity.getSupportFragmentManager(), "SONG_DETAILS");
return true;
case R.id.action_go_to_album:
Pair[] albumPairs = null;
if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(null);
NavigationUtil.goToAlbum(activity, song.albumId, albumPairs);
return true;
case R.id.action_go_to_artist:
Pair[] artistPairs = null;
if (activity instanceof AbsFabActivity)
artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs);
artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(null);
NavigationUtil.goToArtist(activity, song.artistId, artistPairs);
return true;
}
return false;
}
public static boolean handlePlaylistMenuClick(Activity activity, Playlist playlist, MenuItem item){
public static boolean handlePlaylistMenuClick(ActionBarActivity activity, Playlist playlist, MenuItem item) {
switch (item.getItemId()) {
case R.id.action_rename_playlist:
RenamePlaylistDialogHelper.getDialog(activity, playlist.id).show();
RenamePlaylistDialog.create(playlist.id).show(activity.getSupportFragmentManager(), "RENAME_PLAYLIST");
return true;
case R.id.action_delete_playlist:
DeletePlaylistDialogHelper.getDialog(activity, playlist.id).show();
DeletePlaylistDialog.create(playlist.id).show(activity.getSupportFragmentManager(), "DELETE_PLAYLIST");
return true;
}
return false;

View file

@ -20,27 +20,26 @@ import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.util.InternalStorageUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Created by karim on 29.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class MusicPlayerRemote {
private static final String TAG = MusicPlayerRemote.class.getSimpleName();
private static int position = -1;
private static List<Song> playingQueue;
private static List<Song> restoredOriginalQueue;
private static ArrayList<Song> playingQueue;
private static ArrayList<Song> restoredOriginalQueue;
private static Context context;
private static MusicService musicService;
private static Intent musicServiceIntent;
private static ServiceConnection musicConnection = new ServiceConnection() {
private static final ServiceConnection musicConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MusicService.MusicBinder binder = (MusicService.MusicBinder) service;
@ -72,11 +71,10 @@ public class MusicPlayerRemote {
}
}
public static boolean playSongAt(final int position) {
public static void playSongAt(final int position) {
if (musicService != null) {
musicService.playSongAt(position);
}
return false;
}
public static void pauseSong() {
@ -104,10 +102,7 @@ public class MusicPlayerRemote {
}
public static boolean isPlaying() {
if (musicService != null) {
return musicService.isPlaying();
}
return false;
return musicService != null && musicService.isPlaying();
}
public static void resumePlaying() {
@ -127,7 +122,7 @@ public class MusicPlayerRemote {
}
}
public static void openQueue(final List<Song> playingQueue, final int startPosition, final boolean startPlaying) {
public static void openQueue(final ArrayList<Song> playingQueue, final int startPosition, final boolean startPlaying) {
MusicPlayerRemote.playingQueue = playingQueue;
if (musicService != null) {
musicService.openQueue(MusicPlayerRemote.playingQueue, startPosition, startPlaying);
@ -159,7 +154,7 @@ public class MusicPlayerRemote {
}
}
public static List<Song> getPlayingQueue() {
public static ArrayList<Song> getPlayingQueue() {
if (musicService != null) {
playingQueue = musicService.getPlayingQueue();
}
@ -174,10 +169,7 @@ public class MusicPlayerRemote {
}
public static boolean isPlayerPrepared() {
if (musicService != null) {
return musicService.isPlayerPrepared();
}
return false;
return musicService != null && musicService.isPlayerPrepared();
}
public static int getSongDurationMillis() {
@ -207,20 +199,16 @@ public class MusicPlayerRemote {
return PreferenceManager.getDefaultSharedPreferences(context).getInt(AppKeys.SP_SHUFFLE_MODE, 0);
}
public static boolean cycleRepeatMode() {
public static void cycleRepeatMode() {
if (musicService != null) {
musicService.cycleRepeatMode();
return true;
}
return false;
}
public static boolean toggleShuffleMode() {
public static void toggleShuffleMode() {
if (musicService != null) {
musicService.toggleShuffle();
return true;
}
return false;
}
public static boolean setShuffleMode(final int shuffleMode) {
@ -242,7 +230,7 @@ public class MusicPlayerRemote {
}
public static void shuffleAllSongs(final Context context) {
List<Song> songs = SongLoader.getAllSongs(context);
ArrayList<Song> songs = SongLoader.getAllSongs(context);
MusicPlayerRemote.openQueue(songs, new Random().nextInt(songs.size()), true);
forceSetShuffleMode(context, MusicService.SHUFFLE_MODE_SHUFFLE);
}
@ -294,8 +282,8 @@ public class MusicPlayerRemote {
@SuppressWarnings("unchecked")
public static void restorePreviousState() {
try {
List restoredQueue = (ArrayList<Song>) InternalStorageUtil.readObject(context, AppKeys.IS_PLAYING_QUEUE);
List restoredOriginalQueue = (ArrayList<Song>) InternalStorageUtil.readObject(context, AppKeys.IS_ORIGINAL_PLAYING_QUEUE);
ArrayList<Song> restoredQueue = (ArrayList<Song>) InternalStorageUtil.readObject(context, AppKeys.IS_PLAYING_QUEUE);
ArrayList<Song> restoredOriginalQueue = (ArrayList<Song>) InternalStorageUtil.readObject(context, AppKeys.IS_ORIGINAL_PLAYING_QUEUE);
int restoredPosition = (int) InternalStorageUtil.readObject(context, AppKeys.IS_POSITION_IN_QUEUE);
if (musicService != null) {
@ -307,7 +295,7 @@ public class MusicPlayerRemote {
position = restoredPosition;
postToBus(MusicRemoteEvent.STATE_RESTORED);
} catch (IOException | ClassNotFoundException | ClassCastException e) {
} catch (Exception e) {
Log.e(TAG, "error while restoring music service state", e);
playingQueue = new ArrayList<>();
position = -1;

View file

@ -1,7 +1,7 @@
package com.kabouzeid.gramophone.helper;
/**
* Created by karim on 27.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
import android.app.Notification;
@ -22,6 +22,7 @@ import com.kabouzeid.gramophone.util.MusicUtil;
import com.squareup.picasso.Picasso;
public class PlayingNotificationHelper {
public static final String TAG = PlayingNotificationHelper.class.getSimpleName();
public static final int NOTIFICATION_ID = 1337;
@ -163,8 +164,6 @@ public class PlayingNotificationHelper {
notificationManager.notify(NOTIFICATION_ID, notification);
}
;
public void killNotification() {
service.stopForeground(true);
notification = null;

View file

@ -1,57 +0,0 @@
package com.kabouzeid.gramophone.helper;
import android.app.Activity;
import android.view.View;
import android.widget.AdapterView;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.PlayingQueueAdapter;
import com.kabouzeid.gramophone.model.Song;
import com.mobeta.android.dslv.DragSortListView;
import java.util.List;
/**
* Created by karim on 24.01.15.
*/
public class PlayingQueueDialogHelper {
public static MaterialDialog getDialog(final Activity activity) {
final List<Song> playingQueue = MusicPlayerRemote.getPlayingQueue();
if (playingQueue.isEmpty()) {
return null;
}
MaterialDialog dialog = new MaterialDialog.Builder(activity)
.title(activity.getResources().getString(R.string.label_current_playing_queue))
.customView(R.layout.dialog_playlist, false)
.positiveText(activity.getResources().getString(R.string.save_as_playlist))
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
dialog.dismiss();
AddToPlaylistDialogHelper.getDialog(activity, playingQueue).show();
}
})
.build();
final DragSortListView dragSortListView = (DragSortListView) dialog.getCustomView().findViewById(R.id.dragSortListView);
final PlayingQueueAdapter playingQueueAdapter = new PlayingQueueAdapter(activity, playingQueue);
dragSortListView.setAdapter(playingQueueAdapter);
dragSortListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MusicPlayerRemote.playSongAt(position);
playingQueueAdapter.notifyDataSetChanged();
}
});
dragSortListView.setDropListener(new DragSortListView.DropListener() {
@Override
public void drop(int from, int to) {
MusicPlayerRemote.moveSong(from, to);
playingQueueAdapter.notifyDataSetChanged();
}
});
return dialog;
}
}

View file

@ -1,32 +0,0 @@
package com.kabouzeid.gramophone.helper;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
/**
* Created by karim on 19.03.15.
*/
public class RenamePlaylistDialogHelper {
public static MaterialDialog getDialog(final Context context, final int playlistId) {
return new MaterialDialog.Builder(context)
.title(R.string.rename_playlist)
.positiveText(R.string.ok)
.negativeText(R.string.cancel)
.input("", PlaylistsUtil.getNameForPlaylist(context, playlistId), new MaterialDialog.InputCallback() {
@Override
public void onInput(MaterialDialog materialDialog, CharSequence charSequence) {
if (!charSequence.toString().trim().equals("")) {
PlaylistsUtil.renamePlaylist(context, playlistId, charSequence.toString());
}
}
})
.build();
}
}

View file

@ -6,9 +6,10 @@ import java.util.Collections;
import java.util.List;
/**
* Created by karim on 24.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class ShuffleHelper {
public static void makeShuffleList(List<Song> listToShuffle, final int current) {
if (current >= 0) {
Song song = listToShuffle.remove(current);

View file

@ -1,84 +0,0 @@
package com.kabouzeid.gramophone.helper;
import android.content.Context;
import android.text.Html;
import android.text.Spanned;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.AudioHeader;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.tag.TagException;
import java.io.File;
import java.io.IOException;
/**
* Created by karim on 19.01.15.
*/
public class SongDetailDialogHelper {
public static final String TAG = SongDetailDialogHelper.class.getSimpleName();
public static MaterialDialog getDialog(final Context context, final File songFile) {
MaterialDialog dialog = new MaterialDialog.Builder(context)
.customView(R.layout.dialog_file_details, true)
.title(context.getResources().getString(R.string.label_details))
.positiveText(context.getResources().getString(R.string.ok))
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
dialog.dismiss();
}
})
.build();
View dialogView = dialog.getCustomView();
final TextView fileName = (TextView) dialogView.findViewById(R.id.file_name);
final TextView filePath = (TextView) dialogView.findViewById(R.id.file_path);
final TextView fileSize = (TextView) dialogView.findViewById(R.id.file_size);
final TextView fileFormat = (TextView) dialogView.findViewById(R.id.file_format);
final TextView trackLength = (TextView) dialogView.findViewById(R.id.track_length);
final TextView bitRate = (TextView) dialogView.findViewById(R.id.bitrate);
final TextView samplingRate = (TextView) dialogView.findViewById(R.id.sampling_rate);
fileName.setText(makeTextWithTitle(context, R.string.label_file_name, "-"));
filePath.setText(makeTextWithTitle(context, R.string.label_file_path, "-"));
fileSize.setText(makeTextWithTitle(context, R.string.label_file_size, "-"));
fileFormat.setText(makeTextWithTitle(context, R.string.label_file_format, "-"));
trackLength.setText(makeTextWithTitle(context, R.string.label_track_length, "-"));
bitRate.setText(makeTextWithTitle(context, R.string.label_bit_rate, "-"));
samplingRate.setText(makeTextWithTitle(context, R.string.label_sampling_rate, "-"));
try {
if (songFile != null && songFile.exists()) {
AudioFile audioFile = AudioFileIO.read(songFile);
AudioHeader audioHeader = audioFile.getAudioHeader();
fileName.setText(makeTextWithTitle(context, R.string.label_file_name, songFile.getName()));
filePath.setText(makeTextWithTitle(context, R.string.label_file_path, songFile.getAbsolutePath()));
fileSize.setText(makeTextWithTitle(context, R.string.label_file_size, Util.getFileSizeString(songFile.length())));
fileFormat.setText(makeTextWithTitle(context, R.string.label_file_format, audioHeader.getFormat()));
trackLength.setText(makeTextWithTitle(context, R.string.label_track_length, MusicUtil.getReadableDurationString(audioHeader.getTrackLength() * 1000)));
bitRate.setText(makeTextWithTitle(context, R.string.label_bit_rate, audioHeader.getBitRate() + " kb/s"));
samplingRate.setText(makeTextWithTitle(context, R.string.label_sampling_rate, audioHeader.getSampleRate() + " Hz"));
}
} catch (CannotReadException | IOException | TagException | ReadOnlyFileException | InvalidAudioFrameException e) {
Log.e(TAG, "error while reading the song file", e);
}
return dialog;
}
private static Spanned makeTextWithTitle(Context context, int titleResId, String text) {
return Html.fromHtml("<b>" + context.getResources().getString(titleResId) + ": " + "</b>" + text);
}
}