Playlist empty text will invalidate when playlist data is changed, create/rename dialogs have input hints and capitalize words, etc.

This commit is contained in:
Aidan Follestad 2015-04-16 20:05:37 -05:00
commit a09c891f31
7 changed files with 96 additions and 73 deletions

View file

@ -11,15 +11,12 @@ import android.widget.ImageView;
import android.widget.PopupMenu; import android.widget.PopupMenu;
import android.widget.TextView; import android.widget.TextView;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper; import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.loader.PlaylistLoader; import com.kabouzeid.gramophone.loader.PlaylistLoader;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Playlist;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.squareup.otto.Subscribe;
import java.util.List; import java.util.List;
@ -37,7 +34,7 @@ public class PlaylistAdapter extends RecyclerView.Adapter<PlaylistAdapter.ViewHo
loadDataSet(); loadDataSet();
} }
private void loadDataSet() { public void loadDataSet() {
dataSet = PlaylistLoader.getAllPlaylists(activity); dataSet = PlaylistLoader.getAllPlaylists(activity);
} }
@ -87,31 +84,8 @@ public class PlaylistAdapter extends RecyclerView.Adapter<PlaylistAdapter.ViewHo
public void onClick(View view) { public void onClick(View view) {
Pair[] sharedViews = null; Pair[] sharedViews = null;
if (activity instanceof AbsFabActivity) if (activity instanceof AbsFabActivity)
sharedViews = ((AbsFabActivity) activity).getSharedViewsWithFab(sharedViews); sharedViews = ((AbsFabActivity) activity).getSharedViewsWithFab(null);
NavigationUtil.goToPlaylist(activity, dataSet.get(getAdapterPosition()).id, sharedViews); NavigationUtil.goToPlaylist(activity, dataSet.get(getAdapterPosition()).id, sharedViews);
} }
} }
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
App.bus.unregister(this);
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
App.bus.register(this);
}
@Subscribe
public void onDataBaseEvent(DataBaseChangedEvent event) {
switch (event.getAction()) {
case DataBaseChangedEvent.PLAYLISTS_CHANGED:
case DataBaseChangedEvent.DATABASE_CHANGED:
loadDataSet();
notifyDataSetChanged();
break;
}
}
} }

View file

@ -4,6 +4,7 @@ import android.app.Dialog;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment; import android.support.v4.app.DialogFragment;
import android.text.InputType;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
@ -43,7 +44,10 @@ public class CreatePlaylistDialog extends DialogFragment {
.title(R.string.action_new_playlist) .title(R.string.action_new_playlist)
.positiveText(android.R.string.ok) .positiveText(android.R.string.ok)
.negativeText(android.R.string.cancel) .negativeText(android.R.string.cancel)
.input(null, null, new MaterialDialog.InputCallback() { .inputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PERSON_NAME |
InputType.TYPE_TEXT_FLAG_CAP_WORDS)
.input(R.string.playlist_name, 0, new MaterialDialog.InputCallback() {
@Override @Override
public void onInput(MaterialDialog materialDialog, CharSequence charSequence) { public void onInput(MaterialDialog materialDialog, CharSequence charSequence) {
if (getActivity() == null) if (getActivity() == null)

View file

@ -4,6 +4,7 @@ import android.app.Dialog;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment; import android.support.v4.app.DialogFragment;
import android.text.InputType;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
@ -30,7 +31,10 @@ public class RenamePlaylistDialog extends DialogFragment {
.title(R.string.rename_playlist) .title(R.string.rename_playlist)
.positiveText(android.R.string.ok) .positiveText(android.R.string.ok)
.negativeText(android.R.string.cancel) .negativeText(android.R.string.cancel)
.input(null, PlaylistsUtil.getNameForPlaylist(getActivity(), playlistId), new MaterialDialog.InputCallback() { .inputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PERSON_NAME |
InputType.TYPE_TEXT_FLAG_CAP_WORDS)
.input(getString(R.string.playlist_name), PlaylistsUtil.getNameForPlaylist(getActivity(), playlistId), new MaterialDialog.InputCallback() {
@Override @Override
public void onInput(MaterialDialog materialDialog, CharSequence charSequence) { public void onInput(MaterialDialog materialDialog, CharSequence charSequence) {
if (!charSequence.toString().trim().equals("")) { if (!charSequence.toString().trim().equals("")) {

View file

@ -12,8 +12,10 @@ import com.kabouzeid.gramophone.R;
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivityFragment { public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivityFragment {
public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName(); public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName();
private RecyclerView recyclerView; private RecyclerView recyclerView;
private RecyclerView.Adapter mAdapter;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@ -30,7 +32,12 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit
private void setUpRecyclerView() { private void setUpRecyclerView() {
recyclerView.setLayoutManager(createLayoutManager()); recyclerView.setLayoutManager(createLayoutManager());
recyclerView.setPadding(0, getTopPadding(), 0, getBottomPadding()); recyclerView.setPadding(0, getTopPadding(), 0, getBottomPadding());
recyclerView.setAdapter(createAdapter()); mAdapter = createAdapter();
recyclerView.setAdapter(mAdapter);
}
public RecyclerView.Adapter getAdapter() {
return mAdapter;
} }
@Override @Override

View file

@ -1,13 +1,17 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments; package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.View; import android.view.View;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.PlaylistAdapter; import com.kabouzeid.gramophone.adapter.PlaylistAdapter;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.squareup.otto.Subscribe;
public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment { public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
@ -23,6 +27,18 @@ public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
return new GridLayoutManager(getActivity(), 1); return new GridLayoutManager(getActivity(), 1);
} }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
App.bus.register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
App.bus.unregister(this);
}
@Override @Override
protected RecyclerView.Adapter createAdapter() { protected RecyclerView.Adapter createAdapter() {
PlaylistAdapter adapter = new PlaylistAdapter((ActionBarActivity) getActivity()); PlaylistAdapter adapter = new PlaylistAdapter((ActionBarActivity) getActivity());
@ -33,4 +49,21 @@ public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
} }
return adapter; return adapter;
} }
@Subscribe
public void onDataBaseEvent(DataBaseChangedEvent event) {
switch (event.getAction()) {
case DataBaseChangedEvent.PLAYLISTS_CHANGED:
case DataBaseChangedEvent.DATABASE_CHANGED:
PlaylistAdapter adapter = (PlaylistAdapter) getAdapter();
adapter.loadDataSet();
adapter.notifyDataSetChanged();
View v = getView();
if (v != null) {
v.findViewById(android.R.id.empty).setVisibility(
adapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
}
break;
}
}
} }

View file

@ -15,15 +15,15 @@ import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.kabouzeid.gramophone.model.PlaylistSong; import com.kabouzeid.gramophone.model.PlaylistSong;
import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.Song;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
*/ */
public class PlaylistsUtil { public class PlaylistsUtil {
public static final String MUSIC_ONLY_SELECTION = MediaStore.Audio.AudioColumns.IS_MUSIC + "=1"
+ " AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''"; //$NON-NLS-2$ // public static final String MUSIC_ONLY_SELECTION = MediaStore.Audio.AudioColumns.IS_MUSIC + "=1"
// + " AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''"; //$NON-NLS-2$
public static int createPlaylist(final Context context, final String name) { public static int createPlaylist(final Context context, final String name) {
if (name != null && name.length() > 0) { if (name != null && name.length() > 0) {
@ -52,10 +52,10 @@ public class PlaylistsUtil {
return -1; return -1;
} }
public static void clearPlaylist(final Context context, final int playlistId) { // public static void clearPlaylist(final Context context, final int playlistId) {
final Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId); // final Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId);
context.getContentResolver().delete(uri, null, null); // context.getContentResolver().delete(uri, null, null);
} // }
public static void deletePlaylist(final Context context, final long playlistId) { public static void deletePlaylist(final Context context, final long playlistId) {
final Uri uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI; final Uri uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
@ -66,11 +66,11 @@ public class PlaylistsUtil {
App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED));
} }
public static void addToPlaylist(final Context context, final Song song, final int playlistId) { // public static void addToPlaylist(final Context context, final Song song, final int playlistId) {
List<Song> helperList = new ArrayList<>(); // List<Song> helperList = new ArrayList<>();
helperList.add(song); // helperList.add(song);
addToPlaylist(context, helperList, playlistId); // addToPlaylist(context, helperList, playlistId);
} // }
public static void addToPlaylist(final Context context, final List<Song> songs, final int playlistId) { public static void addToPlaylist(final Context context, final List<Song> songs, final int playlistId) {
final int size = songs.size(); final int size = songs.size();
@ -128,35 +128,35 @@ public class PlaylistsUtil {
App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED));
} }
public static void removeFromPlaylist(final Context context, final List<PlaylistSong> songs) { // public static void removeFromPlaylist(final Context context, final List<PlaylistSong> songs) {
Uri uri = MediaStore.Audio.Playlists.Members.getContentUri( // Uri uri = MediaStore.Audio.Playlists.Members.getContentUri(
"external", songs.get(0).playlistId); // "external", songs.get(0).playlistId);
String selectionArgs[] = new String[songs.size()]; // String selectionArgs[] = new String[songs.size()];
for (int i = 0; i < selectionArgs.length; i++) { // for (int i = 0; i < selectionArgs.length; i++) {
selectionArgs[i] = String.valueOf(songs.get(i).idInPlayList); // selectionArgs[i] = String.valueOf(songs.get(i).idInPlayList);
} // }
String selection = MediaStore.Audio.Playlists.Members._ID + " in ("; // String selection = MediaStore.Audio.Playlists.Members._ID + " in (";
for (String selectionArg : selectionArgs) selection += "?, "; // for (String selectionArg : selectionArgs) selection += "?, ";
selection = selection.substring(0, selection.length() - 2) + ")"; // selection = selection.substring(0, selection.length() - 2) + ")";
//
context.getContentResolver().delete(uri, selection, selectionArgs); // context.getContentResolver().delete(uri, selection, selectionArgs);
App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); // App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED));
} // }
//
public static int getSongCountForPlaylist(final Context context, final long playlistId) { // public static int getSongCountForPlaylist(final Context context, final long playlistId) {
Cursor c = context.getContentResolver().query( // Cursor c = context.getContentResolver().query(
MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId), // MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId),
new String[]{BaseColumns._ID}, MUSIC_ONLY_SELECTION, null, null); // new String[]{BaseColumns._ID}, MUSIC_ONLY_SELECTION, null, null);
if (c != null) { // if (c != null) {
int count = 0; // int count = 0;
if (c.moveToFirst()) { // if (c.moveToFirst()) {
count = c.getCount(); // count = c.getCount();
} // }
c.close(); // c.close();
return count; // return count;
} // }
return 0; // return 0;
} // }
public static void moveItem(final Context context, int playlistId, int from, int to) { public static void moveItem(final Context context, int playlistId, int from, int to) {
MediaStore.Audio.Playlists.Members.moveItem(context.getContentResolver(), MediaStore.Audio.Playlists.Members.moveItem(context.getContentResolver(),

View file

@ -100,6 +100,7 @@
<string name="update_image">Update Image</string> <string name="update_image">Update Image</string>
<string name="playlist_empty_text">This playlist is empty</string> <string name="playlist_empty_text">This playlist is empty</string>
<string name="no_playlists">No playlists</string> <string name="no_playlists">No playlists</string>
<string name="playlist_name">Playlist name</string>
<string-array name="update_albumcover_options"> <string-array name="update_albumcover_options">
<item>Download from LastFM</item> <item>Download from LastFM</item>