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:
parent
7055b443fb
commit
a09c891f31
7 changed files with 96 additions and 73 deletions
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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("")) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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(),
|
||||||
|
|
@ -191,4 +191,4 @@ public class PlaylistsUtil {
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue