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

@ -50,7 +50,7 @@ dependencies {
compile('com.crashlytics.sdk.android:crashlytics:2.2.1@aar') {
transitive = true;
}
compile 'com.afollestad:material-dialogs:0.7.2.1'
compile 'com.afollestad:material-dialogs:0.7.2.2'
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.android.support:recyclerview-v7:22.0.0'
compile 'com.android.support:gridlayout-v7:22.0.0'

View file

@ -1,6 +1,6 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Applications/android_sdk/tools/proguard/proguard-android.txt
# in /Users/aidanfollestad/Documents/android-sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
@ -15,7 +15,7 @@
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-keep class !android.support.v7.internal.view.menu.**,** {*;}
-dontwarn
-ignorewarnings
-dontshrink
-ignorewarnings

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kabouzeid.gramophone" >
xmlns:tools="http://schemas.android.com/tools"
package="com.kabouzeid.gramophone">
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
@ -12,10 +13,13 @@
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.MaterialMusic" >
android:theme="@style/Theme.MaterialMusic"
android:supportsRtl="true"
tools:ignore="UnusedAttribute">
<activity
android:name=".ui.activities.MainActivity"
android:label="@string/app_name" >
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.MUSIC_PLAYER" />
@ -75,26 +79,24 @@
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.OPENABLE" />
<data android:mimeType="vnd.android.cursor.dir/audio"/>
<data android:mimeType="vnd.android.cursor.dir/audio" />
</intent-filter>
</activity>
<activity android:name=".ui.activities.AlbumDetailActivity" >
</activity>
<activity android:name=".ui.activities.ArtistDetailActivity" >
</activity>
<activity android:name=".ui.activities.AlbumDetailActivity" />
<activity android:name=".ui.activities.ArtistDetailActivity" />
<activity
android:name=".ui.activities.MusicControllerActivity"
android:parentActivityName=".ui.activities.MainActivity" >
</activity>
android:parentActivityName=".ui.activities.MainActivity" />
<service
android:name=".service.MusicService"
android:enabled="true" >
</service>
android:enabled="true" />
<receiver android:name=".service.MediaButtonIntentReceiver" >
<receiver android:name=".service.MediaButtonIntentReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
@ -107,18 +109,15 @@
<activity
android:name=".ui.activities.tageditor.SongTagEditorActivity"
android:label="@string/title_activity_tag_editor"
android:windowSoftInputMode="adjustResize" >
</activity>
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".ui.activities.tageditor.AlbumTagEditorActivity"
android:label="@string/title_activity_album_tag_editor" >
</activity>
android:label="@string/title_activity_album_tag_editor" />
<activity
android:name=".ui.activities.SearchActivity"
android:label="@string/title_activity_search" >
</activity>
android:label="@string/title_activity_search" />
<receiver android:name=".appwidget.MusicPlayerWidget" >
<receiver android:name=".appwidget.MusicPlayerWidget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
@ -130,12 +129,11 @@
<activity
android:name=".ui.activities.PlaylistDetailActivity"
android:label="@string/title_activity_playlist_detail" >
</activity>
android:label="@string/title_activity_playlist_detail" />
<activity
android:name=".ui.activities.SettingsActivity"
android:label="@string/title_activity_settings" >
</activity>
android:label="@string/title_activity_settings" />
</application>
</manifest>

View file

@ -1,25 +1,23 @@
package com.kabouzeid.gramophone;
import android.app.Application;
import android.preference.PreferenceManager;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
import com.crashlytics.android.Crashlytics;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.squareup.otto.Bus;
import com.squareup.otto.ThreadEnforcer;
import io.fabric.sdk.android.Fabric;
/**
* Created by karim on 25.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class App extends Application {
public static final String TAG = App.class.getSimpleName();
public static Bus bus = new Bus(ThreadEnforcer.MAIN);
public static final Bus bus = new Bus(ThreadEnforcer.MAIN);
private RequestQueue requestQueue;

View file

@ -12,17 +12,15 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.kabouzeid.gramophone.App;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.loader.AlbumLoader;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Callback;
@ -31,12 +29,13 @@ import com.squareup.picasso.Picasso;
import java.util.List;
/**
* Created by karim on 24.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder> {
public static final String TAG = AlbumAdapter.class.getSimpleName();
private Activity activity;
private boolean usePalette;
private final Activity activity;
private final boolean usePalette;
private List<Album> dataSet;
@Override
@ -83,10 +82,10 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView image;
TextView title;
TextView artist;
View footer;
final ImageView image;
final TextView title;
final TextView artist;
final View footer;
public ViewHolder(View itemView) {
super(itemView);
@ -105,7 +104,7 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
)};
if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
NavigationUtil.goToAlbum(activity, dataSet.get(getPosition()).id, albumPairs);
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).id, albumPairs);
}
}
@ -127,7 +126,7 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
if (vibrantSwatch != null) {
title.setTextColor(vibrantSwatch.getTitleTextColor());
artist.setTextColor(vibrantSwatch.getTitleTextColor());
ViewUtil.animateViewColor(footer, Util.resolveColor(activity, R.attr.default_bar_color), vibrantSwatch.getRgb());
ViewUtil.animateViewColor(footer, DialogUtils.resolveColor(activity, R.attr.default_bar_color), vibrantSwatch.getRgb());
} else {
paletteBlackAndWhite(title, artist, footer);
}
@ -136,31 +135,19 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
}
private void paletteBlackAndWhite(final TextView title, final TextView artist, final View footer) {
title.setTextColor(Util.resolveColor(activity, R.attr.title_text_color));
artist.setTextColor(Util.resolveColor(activity, R.attr.caption_text_color));
int defaultBarColor = Util.resolveColor(activity, R.attr.default_bar_color);
title.setTextColor(DialogUtils.resolveColor(activity, R.attr.title_text_color));
artist.setTextColor(DialogUtils.resolveColor(activity, R.attr.caption_text_color));
int defaultBarColor = DialogUtils.resolveColor(activity, R.attr.default_bar_color);
ViewUtil.animateViewColor(footer, defaultBarColor, defaultBarColor);
}
private void resetColors(final TextView title, final TextView artist, final View footer) {
title.setTextColor(Util.resolveColor(activity, R.attr.title_text_color));
artist.setTextColor(Util.resolveColor(activity, R.attr.caption_text_color));
int defaultBarColor = Util.resolveColor(activity, R.attr.default_bar_color);
title.setTextColor(DialogUtils.resolveColor(activity, R.attr.title_text_color));
artist.setTextColor(DialogUtils.resolveColor(activity, R.attr.caption_text_color));
int defaultBarColor = DialogUtils.resolveColor(activity, R.attr.default_bar_color);
footer.setBackgroundColor(defaultBarColor);
}
@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()) {
@ -171,14 +158,4 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
break;
}
}
@Subscribe
public void onUIChangeEvent(UIPreferenceChangedEvent event) {
switch (event.getAction()) {
case UIPreferenceChangedEvent.ALBUM_OVERVIEW_PALETTE_CHANGED:
usePalette = (boolean) event.getValue();
notifyDataSetChanged();
break;
}
}
}

View file

@ -23,10 +23,10 @@ import com.squareup.picasso.Picasso;
import java.util.List;
/**
* Created by karim on 29.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistAdapter extends RecyclerView.Adapter<ArtistAdapter.ViewHolder> {
protected Activity activity;
protected final Activity activity;
protected List<Artist> dataSet;
public ArtistAdapter(Activity activity) {
@ -70,9 +70,9 @@ public class ArtistAdapter extends RecyclerView.Adapter<ArtistAdapter.ViewHolder
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView artistName;
TextView artistInfo;
ImageView artistImage;
final TextView artistName;
final TextView artistInfo;
final ImageView artistImage;
public ViewHolder(View itemView) {
super(itemView);
@ -90,7 +90,7 @@ public class ArtistAdapter extends RecyclerView.Adapter<ArtistAdapter.ViewHolder
)};
if (activity instanceof AbsFabActivity)
artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs);
NavigationUtil.goToArtist(activity, dataSet.get(getPosition()).id, artistPairs);
NavigationUtil.goToArtist(activity, dataSet.get(getAdapterPosition()).id, artistPairs);
}
}

View file

@ -19,7 +19,7 @@ import com.squareup.picasso.Picasso;
import java.util.List;
/**
* Created by karim on 24.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistAlbumAdapter extends RecyclerView.Adapter<ArtistAlbumAdapter.ViewHolder> {
public static final String TAG = AlbumAdapter.class.getSimpleName();
@ -28,9 +28,9 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter<ArtistAlbumAdapter.
private static final int TYPE_MIDDLE = 2;
private static final int TYPE_LAST = 3;
private Activity activity;
private List<Album> dataSet;
private int listMargin;
private final Activity activity;
private final List<Album> dataSet;
private final int listMargin;
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
@ -72,9 +72,9 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter<ArtistAlbumAdapter.
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView image;
TextView title;
TextView year;
final ImageView image;
final TextView title;
final TextView year;
public ViewHolder(View itemView) {
super(itemView);
@ -92,7 +92,7 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter<ArtistAlbumAdapter.
)};
if (activity instanceof AbsFabActivity)
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
NavigationUtil.goToAlbum(activity, dataSet.get(getPosition()).id, albumPairs);
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).id, albumPairs);
}
}

View file

@ -1,52 +1,121 @@
package com.kabouzeid.gramophone.adapter;
import android.content.Context;
import android.graphics.PorterDuff;
import android.os.Build;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ColorChooserDialog;
import com.kabouzeid.gramophone.model.NavigationDrawerItem;
import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.ui.fragments.NavigationDrawerFragment;
import java.util.List;
import java.util.ArrayList;
/**
* Created by karim on 23.11.14.
* @author Aidan Follestad (afollestad)
*/
public class NavigationDrawerItemAdapter extends ArrayAdapter<NavigationDrawerItem> {
private int currentChecked = -1;
public class NavigationDrawerItemAdapter extends RecyclerView.Adapter<NavigationDrawerItemAdapter.ShortcutViewHolder> implements View.OnClickListener {
public NavigationDrawerItemAdapter(Context context, int resource, List<NavigationDrawerItem> objects) {
super(context, resource, objects);
// per the Material design guidelines
@SuppressWarnings("FieldCanBeLocal")
private final int ALPHA_ACTIVATED = 255;
@SuppressWarnings("FieldCanBeLocal")
private final int ALPHA_ICON = 138;
@SuppressWarnings("FieldCanBeLocal")
private final int ALPHA_TEXT = 222;
@Override
public void onClick(View v) {
int index = (Integer) v.getTag();
if (mCallback != null)
mCallback.onItemSelected(index);
}
public static class ShortcutViewHolder extends RecyclerView.ViewHolder {
public ShortcutViewHolder(View itemView) {
super(itemView);
divider = itemView.findViewById(R.id.divider);
container = itemView.findViewById(R.id.container);
title = (TextView) itemView.findViewById(R.id.title);
icon = (ImageView) itemView.findViewById(R.id.icon);
}
final TextView title;
final ImageView icon;
final View divider;
final View container;
}
private int currentChecked = -1;
private int navIconColor;
private final ArrayList<NavigationDrawerItem> mItems;
private final Callback mCallback;
public interface Callback {
void onItemSelected(int index);
}
public NavigationDrawerItemAdapter(Context context, ArrayList<NavigationDrawerItem> objects, Callback callback) {
navIconColor = DialogUtils.resolveColor(context, R.attr.nav_drawer_icon_color);
if (DialogUtils.isColorDark(navIconColor))
navIconColor = ColorChooserDialog.shiftColorUp(navIconColor);
mItems = objects;
mCallback = callback;
}
public void setChecked(int position) {
int oldPosition = currentChecked;
currentChecked = position;
notifyDataSetChanged();
if (oldPosition != -1)
notifyItemChanged(oldPosition);
notifyItemChanged(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
NavigationDrawerItem item = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_navigation_drawer, parent, false);
}
TextView title = (TextView) convertView.findViewById(R.id.title);
ImageView icon = (ImageView) convertView.findViewById(R.id.album_art);
title.setText(item.title);
if (position == currentChecked) {
title.setTextColor(Util.resolveColor(getContext(), R.attr.colorAccent));
icon.setImageDrawable(Util.getTintedDrawable(getContext().getResources(), item.imageRes, Util.resolveColor(getContext(), R.attr.colorAccent)));
} else {
title.setTextColor(Util.resolveColor(getContext(), R.attr.title_text_color));
icon.setImageDrawable(Util.getTintedDrawable(getContext().getResources(), item.imageRes, Util.resolveColor(getContext(), R.attr.themed_drawable_color)));
}
View container = convertView.findViewById(R.id.container);
container.setActivated(position == currentChecked);
return convertView;
public ShortcutViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_navigation_drawer, parent, false);
return new ShortcutViewHolder(view);
}
}
@Override
public void onBindViewHolder(ShortcutViewHolder holder, int position) {
NavigationDrawerItem item = mItems.get(position);
holder.title.setText(item.title);
holder.icon.setImageResource(item.imageRes);
holder.divider.setVisibility(position == NavigationDrawerFragment.ABOUT_INDEX ?
View.VISIBLE : View.GONE);
final boolean selected = position == currentChecked;
final int iconColor = selected ? ThemeSingleton.get().positiveColor : navIconColor;
final int textColor = selected ? ThemeSingleton.get().positiveColor : navIconColor;
holder.title.setTextColor(textColor);
holder.title.setAlpha(selected ? ALPHA_ACTIVATED : ALPHA_TEXT);
holder.icon.setColorFilter(iconColor, PorterDuff.Mode.SRC_ATOP);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
holder.icon.setImageAlpha(selected ? ALPHA_ACTIVATED : ALPHA_ICON);
} else {
// noinspection deprecation
holder.icon.setAlpha(selected ? ALPHA_ACTIVATED : ALPHA_ICON);
}
holder.container.setActivated(selected);
holder.container.setTag(position);
holder.container.setOnClickListener(this);
}
@Override
public int getItemCount() {
return mItems.size();
}
}

View file

@ -29,7 +29,7 @@ public class PagerAdapter extends FragmentPagerAdapter {
private int mCurrentPage;
private String[] titles;
private final String[] titles;
public PagerAdapter(final Context context, final FragmentManager fragmentManager) {
super(fragmentManager);
@ -68,16 +68,15 @@ public class PagerAdapter extends FragmentPagerAdapter {
if (mWeakFragment != null) {
mWeakFragment.clear();
}
mFragmentArray.put(position, new WeakReference<Fragment>(mFragment));
mFragmentArray.put(position, new WeakReference<>(mFragment));
return mFragment;
}
@Override
public Fragment getItem(final int position) {
final Holder mCurrentHolder = mHolderList.get(position);
final Fragment mFragment = Fragment.instantiate(mContext,
return Fragment.instantiate(mContext,
mCurrentHolder.mClassName, mCurrentHolder.mParams);
return mFragment;
}
@Override
@ -114,7 +113,7 @@ public class PagerAdapter extends FragmentPagerAdapter {
ARTIST(ArtistViewFragment.class),
PLAYLIST(PlaylistViewFragment.class);
private Class<? extends Fragment> mFragmentClass;
private final Class<? extends Fragment> mFragmentClass;
MusicFragments(final Class<? extends Fragment> fragmentClass) {
mFragmentClass = fragmentClass;

View file

@ -1,7 +1,6 @@
package com.kabouzeid.gramophone.adapter;
import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
@ -10,31 +9,24 @@ import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper;
import com.kabouzeid.gramophone.helper.DeleteSongsDialogHelper;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.Util;
import java.io.File;
import java.util.List;
import java.util.ArrayList;
/**
* Created by karim on 24.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class PlayingQueueAdapter extends ArrayAdapter<Song> {
private Activity activity;
public PlayingQueueAdapter(Activity activity, List<Song> playList) {
private final ActionBarActivity activity;
public PlayingQueueAdapter(ActionBarActivity activity, ArrayList<Song> playList) {
super(activity, R.layout.item_list_playlist_song, playList);
this.activity = activity;
}
@ -52,7 +44,7 @@ public class PlayingQueueAdapter extends ArrayAdapter<Song> {
title.setText(song.title);
if (MusicPlayerRemote.getPosition() == position) {
playingIndicator.setVisibility(View.VISIBLE);
playingIndicator.setImageDrawable(Util.getTintedDrawable(getContext().getResources(), R.drawable.ic_speaker_white_48dp, Util.resolveColor(getContext(), R.attr.themed_drawable_color)));
playingIndicator.setImageDrawable(Util.getTintedDrawable(getContext(), R.drawable.ic_speaker_white_48dp, DialogUtils.resolveColor(getContext(), R.attr.themed_drawable_color)));
} else {
playingIndicator.setVisibility(View.GONE);
}
@ -65,7 +57,7 @@ public class PlayingQueueAdapter extends ArrayAdapter<Song> {
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if(item.getItemId() == R.id.action_remove_from_playing_queue) {
if (item.getItemId() == R.id.action_remove_from_playing_queue) {
MusicPlayerRemote.removeFromQueue(position);
notifyDataSetChanged();
return true;

View file

@ -1,7 +1,7 @@
package com.kabouzeid.gramophone.adapter;
import android.app.Activity;
import android.support.v4.util.Pair;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MenuItem;
@ -24,14 +24,15 @@ import com.squareup.otto.Subscribe;
import java.util.List;
/**
* Created by karim on 16.03.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class PlaylistAdapter extends RecyclerView.Adapter<PlaylistAdapter.ViewHolder> {
public static final String TAG = PlaylistAdapter.class.getSimpleName();
protected Activity activity;
protected final ActionBarActivity activity;
protected List<Playlist> dataSet;
public PlaylistAdapter(Activity activity) {
public PlaylistAdapter(ActionBarActivity activity) {
this.activity = activity;
loadDataSet();
}
@ -57,8 +58,8 @@ public class PlaylistAdapter extends RecyclerView.Adapter<PlaylistAdapter.ViewHo
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView playlistName;
private ImageView menu;
public final TextView playlistName;
private final ImageView menu;
public ViewHolder(View itemView) {
super(itemView);
@ -73,7 +74,8 @@ public class PlaylistAdapter extends RecyclerView.Adapter<PlaylistAdapter.ViewHo
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return MenuItemClickHelper.handlePlaylistMenuClick(activity, dataSet.get(getAdapterPosition()), item);
return MenuItemClickHelper.handlePlaylistMenuClick(
activity, dataSet.get(getAdapterPosition()), item);
}
});
popupMenu.show();

View file

@ -1,8 +1,8 @@
package com.kabouzeid.gramophone.adapter;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
@ -12,22 +12,23 @@ import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.model.SearchEntry;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.SearchActivity;
import com.kabouzeid.gramophone.util.Util;
import java.util.List;
/**
* Created by karim on 27.02.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class SearchAdapter extends ArrayAdapter<SearchEntry>{
private Activity activity;
public class SearchAdapter extends ArrayAdapter<SearchEntry> {
public SearchAdapter(Activity activity, List<SearchEntry> objects) {
private final ActionBarActivity activity;
public SearchAdapter(ActionBarActivity activity, List<SearchEntry> objects) {
super(activity, R.layout.item_list_search, objects);
this.activity = activity;
}
@ -50,7 +51,7 @@ public class SearchAdapter extends ArrayAdapter<SearchEntry>{
subTitle.setVisibility(View.GONE);
imageView.setVisibility(View.GONE);
overflowButton.setVisibility(View.GONE);
convertView.setBackgroundColor(Util.resolveColor(getContext(), R.attr.default_bar_color));
convertView.setBackgroundColor(DialogUtils.resolveColor(getContext(), R.attr.default_bar_color));
} else if (item instanceof Song) {
title.setTypeface(null, Typeface.NORMAL);
subTitle.setVisibility(View.VISIBLE);

View file

@ -1,8 +1,6 @@
package com.kabouzeid.gramophone.adapter.songadapter;
import android.app.Activity;
import android.content.Intent;
import android.support.v4.util.Pair;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MenuItem;
@ -13,32 +11,23 @@ import android.widget.PopupMenu;
import android.widget.TextView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper;
import com.kabouzeid.gramophone.helper.DeleteSongsDialogHelper;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
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;
import java.util.List;
import java.util.ArrayList;
/**
* Created by karim on 27.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class AlbumSongAdapter extends RecyclerView.Adapter<AlbumSongAdapter.ViewHolder> {
public static final String TAG = AlbumSongAdapter.class.getSimpleName();
protected final ActionBarActivity activity;
protected final ArrayList<Song> dataSet;
protected Activity activity;
protected List<Song> dataSet;
public AlbumSongAdapter(Activity activity, List<Song> objects) {
public AlbumSongAdapter(ActionBarActivity activity, ArrayList<Song> objects) {
this.activity = activity;
dataSet = objects;
}
@ -66,10 +55,10 @@ public class AlbumSongAdapter extends RecyclerView.Adapter<AlbumSongAdapter.View
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView songTitle;
TextView trackNumber;
TextView artistName;
ImageView overflowButton;
final TextView songTitle;
final TextView trackNumber;
final TextView artistName;
final ImageView overflowButton;
public ViewHolder(View itemView) {
super(itemView);

View file

@ -1,8 +1,7 @@
package com.kabouzeid.gramophone.adapter.songadapter;
import android.app.Activity;
import android.content.Intent;
import android.support.v4.util.Pair;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
@ -11,33 +10,25 @@ import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper;
import com.kabouzeid.gramophone.helper.DeleteSongsDialogHelper;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
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 com.squareup.picasso.Picasso;
import java.io.File;
import java.util.List;
/**
* Created by karim on 14.03.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistSongAdapter extends ArrayAdapter<Song> {
private Activity activity;
public ArtistSongAdapter(Activity activity, List<Song> songs) {
private final ActionBarActivity activity;
public ArtistSongAdapter(ActionBarActivity activity, List<Song> songs) {
super(activity, R.layout.item_list_song, songs);
this.activity = activity;
}

View file

@ -1,7 +1,7 @@
package com.kabouzeid.gramophone.adapter.songadapter;
import android.app.Activity;
import android.support.v4.util.Pair;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MenuItem;
@ -22,17 +22,19 @@ import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
/**
* Created by karim on 27.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class PlaylistSongAdapter extends RecyclerView.Adapter<PlaylistSongAdapter.ViewHolder> {
public static final String TAG = AlbumSongAdapter.class.getSimpleName();
protected Activity activity;
protected List<PlaylistSong> dataSet;
public PlaylistSongAdapter(Activity activity, List<PlaylistSong> objects) {
public static final String TAG = AlbumSongAdapter.class.getSimpleName();
protected final ActionBarActivity activity;
protected final ArrayList<PlaylistSong> dataSet;
public PlaylistSongAdapter(ActionBarActivity activity, ArrayList<PlaylistSong> objects) {
this.activity = activity;
dataSet = objects;
}
@ -62,10 +64,10 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter<PlaylistSongAdapte
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView songTitle;
TextView songInfo;
ImageView overflowButton;
ImageView albumArt;
final TextView songTitle;
final TextView songInfo;
final ImageView overflowButton;
final ImageView albumArt;
public ViewHolder(View itemView) {
super(itemView);
@ -77,7 +79,8 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter<PlaylistSongAdapte
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MusicPlayerRemote.openQueue((List<Song>) (List) dataSet, getAdapterPosition(), true);
//noinspection unchecked
MusicPlayerRemote.openQueue((ArrayList<Song>) (List) dataSet, getAdapterPosition(), true);
}
});
}

View file

@ -1,9 +1,8 @@
package com.kabouzeid.gramophone.adapter.songadapter;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Typeface;
import android.support.v4.util.Pair;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MenuItem;
@ -13,41 +12,35 @@ import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper;
import com.kabouzeid.gramophone.helper.DeleteSongsDialogHelper;
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
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 com.kabouzeid.gramophone.util.Util;
import com.squareup.otto.Subscribe;
import com.squareup.picasso.Picasso;
import java.io.File;
import java.util.List;
import java.util.ArrayList;
/**
* Created by karim on 27.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
public static final String TAG = AlbumSongAdapter.class.getSimpleName();
private static final int SHUFFLE_BUTTON = 0;
private static final int SONG = 1;
protected Activity activity;
protected List<Song> dataSet;
protected final ActionBarActivity activity;
protected ArrayList<Song> dataSet;
public SongAdapter(Activity activity) {
public SongAdapter(ActionBarActivity activity) {
this.activity = activity;
loadDataSet();
}
@ -80,15 +73,14 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
.placeholder(R.drawable.default_album_art)
.into(holder.albumArt);
} else {
int accentColor = Util.resolveColor(activity, R.attr.colorAccent);
holder.songTitle.setText(activity.getResources().getString(R.string.shuffle_all).toUpperCase());
holder.songTitle.setTextColor(accentColor);
holder.songTitle.setTextColor(ThemeSingleton.get().positiveColor);
holder.songTitle.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
holder.songInfo.setVisibility(View.GONE);
holder.overflowButton.setVisibility(View.GONE);
final int padding = activity.getResources().getDimensionPixelSize(R.dimen.default_item_margin) / 2;
holder.albumArt.setPadding(padding, padding, padding, padding);
holder.albumArt.setColorFilter(accentColor);
holder.albumArt.setColorFilter(ThemeSingleton.get().positiveColor);
holder.albumArt.setImageResource(R.drawable.ic_shuffle_white_48dp);
holder.separator.setVisibility(View.VISIBLE);
holder.short_separator.setVisibility(View.GONE);
@ -101,12 +93,12 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView songTitle;
TextView songInfo;
ImageView overflowButton;
ImageView albumArt;
View separator;
View short_separator;
final TextView songTitle;
final TextView songInfo;
final ImageView overflowButton;
final ImageView albumArt;
final View separator;
final View short_separator;
public ViewHolder(View itemView) {
super(itemView);

View file

@ -6,7 +6,6 @@ import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.widget.RemoteViews;
import com.kabouzeid.gramophone.R;
@ -15,7 +14,6 @@ import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util;
import com.squareup.picasso.Picasso;
/**

View file

@ -5,11 +5,11 @@ import com.kabouzeid.gramophone.model.Album;
import java.util.Comparator;
/**
* Created by karim on 25.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class AlbumAlphabeticComparator implements Comparator<Album> {
class AlbumAlphabeticComparator implements Comparator<Album> {
@Override
public int compare(Album lhs, Album rhs) {
return lhs.title.trim().compareToIgnoreCase(rhs.title.trim());
}
}
}

View file

@ -5,7 +5,7 @@ import com.kabouzeid.gramophone.model.Artist;
import java.util.Comparator;
/**
* Created by karim on 29.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistAlphabeticComparator implements Comparator<Artist> {
@Override

View file

@ -5,7 +5,7 @@ import com.kabouzeid.gramophone.model.Song;
import java.util.Comparator;
/**
* Created by karim on 28.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class SongAlphabeticComparator implements Comparator<Song> {
@Override

View file

@ -5,7 +5,7 @@ import com.kabouzeid.gramophone.model.Song;
import java.util.Comparator;
/**
* Created by karim on 25.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class SongTrackNumberComparator implements Comparator<Song> {
@Override

View file

@ -0,0 +1,50 @@
package com.kabouzeid.gramophone.dialogs;
import android.app.Dialog;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.text.TextUtils;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
/**
* @author Karim Abou Zeid (kabouzeid), Aidan Follestad (afollestad)
*/
public class AboutDialog extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new MaterialDialog.Builder(getActivity())
.title(getActivity().getResources().getString(R.string.app_name) + " " + getCurrentVersionName(getActivity()))
.iconRes(R.drawable.ic_launcher)
.content(TextUtils.concat(getActivity().getResources().getText(R.string.credits_1),
getActivity().getResources().getText(R.string.credits_2),
getActivity().getResources().getText(R.string.credits_3),
getActivity().getResources().getText(R.string.credits_4))
)
.positiveText(getActivity().getResources().getString(android.R.string.ok))
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
dialog.dismiss();
}
})
.build();
}
private static String getCurrentVersionName(final Context context) {
String versionName;
try {
versionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
return "Unknown";
}
return versionName;
}
}

View file

@ -0,0 +1,65 @@
package com.kabouzeid.gramophone.dialogs;
import android.app.Dialog;
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.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;
/**
* @author Karim Abou Zeid (kabouzeid), Aidan Follestad (afollestad)
*/
public class AddToPlaylistDialog extends DialogFragment {
public static AddToPlaylistDialog create(Song song) {
ArrayList<Song> list = new ArrayList<>();
list.add(song);
return create(list);
}
public static AddToPlaylistDialog create(ArrayList<Song> songs) {
AddToPlaylistDialog dialog = new AddToPlaylistDialog();
Bundle args = new Bundle();
args.putSerializable("songs", songs);
dialog.setArguments(args);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final List<Playlist> playlists = PlaylistLoader.getAllPlaylists(getActivity());
CharSequence[] playlistNames = new CharSequence[playlists.size() + 1];
playlistNames[0] = getActivity().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(getActivity())
.items(playlistNames)
.itemsCallback(new MaterialDialog.ListCallback() {
@Override
public void onSelection(MaterialDialog materialDialog, View view, int i, CharSequence charSequence) {
//noinspection unchecked
final ArrayList<Song> songs = (ArrayList<Song>) getArguments().getSerializable("songs");
if (i == 0) {
materialDialog.dismiss();
CreatePlaylistDialog.create(songs).show(getActivity().getSupportFragmentManager(), "ADD_TO_PLAYLIST");
} else {
materialDialog.dismiss();
PlaylistsUtil.addToPlaylist(getActivity(), songs, playlists.get(i - 1).id);
}
}
})
.build();
}
}

View file

@ -0,0 +1,203 @@
package com.kabouzeid.gramophone.dialogs;
import android.app.Activity;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.RippleDrawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.StateListDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.content.res.ResourcesCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.views.CircleView;
/**
* @author Aidan Follestad (afollestad)
*/
public class ColorChooserDialog extends DialogFragment implements View.OnClickListener {
private ColorCallback mCallback;
private int[] mColors;
private GridView mGrid;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallback = (ColorCallback) activity;
}
@Override
public void onClick(View v) {
if (v.getTag() != null) {
final int index = (Integer) v.getTag();
getArguments().putInt("preselect", mColors[index]);
invalidateGrid();
}
}
public interface ColorCallback {
void onColorSelection(int title, int color);
}
public ColorChooserDialog() {
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
MaterialDialog dialog = new MaterialDialog.Builder(getActivity())
.title(getArguments().getInt("title", 0))
.autoDismiss(false)
.customView(R.layout.dialog_color_chooser, false)
.neutralText(R.string.default_str)
.positiveText(R.string.select)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
final int title = getArguments().getInt("title", 0);
final int preselect = getArguments().getInt("preselect", -1);
mCallback.onColorSelection(title, preselect);
dismiss();
}
@Override
public void onNeutral(MaterialDialog dialog) {
super.onNeutral(dialog);
if (getArguments().getInt("title", 0) == R.string.primary_color) {
getArguments().putInt("preselect", getResources().getColor(R.color.indigo_500));
} else if (getArguments().getInt("title", 0) == R.string.accent_color) {
getArguments().putInt("preselect", getResources().getColor(R.color.pink_500));
}
invalidateGrid();
}
})
.build();
final boolean primary = getArguments().getInt("title", 0) == R.string.primary_color;
final TypedArray ta = getActivity().getResources().obtainTypedArray(
primary ? R.array.colors_primary : R.array.colors_accent);
mColors = new int[ta.length()];
for (int i = 0; i < ta.length(); i++)
mColors[i] = ta.getColor(i, 0);
ta.recycle();
mGrid = (GridView) dialog.getCustomView();
invalidateGrid();
return dialog;
}
private void invalidateGrid() {
if (mGrid.getAdapter() == null) {
mGrid.setAdapter(new ColorGridAdapter());
mGrid.setSelector(ResourcesCompat.getDrawable(getResources(), R.drawable.md_transparent, null));
} else ((BaseAdapter) mGrid.getAdapter()).notifyDataSetChanged();
}
private class ColorGridAdapter extends BaseAdapter implements View.OnClickListener {
public ColorGridAdapter() {
}
@Override
public int getCount() {
return mColors.length;
}
@Override
public Object getItem(int position) {
return mColors[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = LayoutInflater.from(getActivity()).inflate(R.layout.griditem_color_chooser, parent, false);
final boolean dark = ThemeSingleton.get().darkTheme;
CircleView child = (CircleView) convertView;
child.setActivated(getArguments().getInt("preselect") == mColors[position]);
child.setBackgroundColor(mColors[position]);
child.setBorderColor(dark ? Color.WHITE : Color.BLACK);
child.setTag(position);
child.setOnClickListener(this);
Drawable selector = createSelector(mColors[position]);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int[][] states = new int[][]{
new int[]{android.R.attr.state_pressed}
};
int[] colors = new int[]{
shiftColorDown(mColors[position])
};
ColorStateList rippleColors = new ColorStateList(states, colors);
child.setForeground(new RippleDrawable(rippleColors, selector, null));
} else {
child.setForeground(selector);
}
return convertView;
}
@Override
public void onClick(View v) {
final int index = (Integer) v.getTag();
getArguments().putInt("preselect", mColors[index]);
invalidateGrid();
}
}
public static int shiftColorDown(int color) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] *= 0.9f; // value component
return Color.HSVToColor(hsv);
}
public static int shiftColorUp(int color) {
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
hsv[2] *= 1.1f; // value component
return Color.HSVToColor(hsv);
}
private static int translucentColor(int color) {
final float factor = 0.7f;
int alpha = Math.round(Color.alpha(color) * factor);
int red = Color.red(color);
int green = Color.green(color);
int blue = Color.blue(color);
return Color.argb(alpha, red, green, blue);
}
private static Drawable createSelector(int color) {
ShapeDrawable darkerCircle = new ShapeDrawable(new OvalShape());
darkerCircle.getPaint().setColor(translucentColor(shiftColorDown(color)));
StateListDrawable stateListDrawable = new StateListDrawable();
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, darkerCircle);
return stateListDrawable;
}
public void show(Activity context, int title, int preselect) {
Bundle args = new Bundle();
args.putInt("preselect", preselect);
args.putInt("title", title);
setArguments(args);
show(context.getFragmentManager(), "COLOR_SELECTOR");
}
}

View file

@ -0,0 +1,62 @@
package com.kabouzeid.gramophone.dialogs;
import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
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;
/**
* @author Karim Abou Zeid (kabouzeid), Aidan Follestad (afollestad)
*/
public class CreatePlaylistDialog extends DialogFragment {
public static CreatePlaylistDialog create() {
return create((Song) null);
}
public static CreatePlaylistDialog create(Song song) {
ArrayList<Song> list = new ArrayList<>();
if (song != null)
list.add(song);
return create(list);
}
public static CreatePlaylistDialog create(ArrayList<Song> songs) {
CreatePlaylistDialog dialog = new CreatePlaylistDialog();
Bundle args = new Bundle();
args.putSerializable("songs", songs);
dialog.setArguments(args);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new MaterialDialog.Builder(getActivity())
.title(R.string.action_new_playlist)
.positiveText(android.R.string.ok)
.negativeText(android.R.string.cancel)
.input(null, null, new MaterialDialog.InputCallback() {
@Override
public void onInput(MaterialDialog materialDialog, CharSequence charSequence) {
if (getActivity() == null)
return;
if (!charSequence.toString().trim().equals("")) {
final int playlistId = PlaylistsUtil.createPlaylist(getActivity(), charSequence.toString());
if (playlistId != -1 && getActivity() != null) {
//noinspection unchecked
ArrayList<Song> songs = (ArrayList<Song>) getArguments().getSerializable("songs");
PlaylistsUtil.addToPlaylist(getActivity(), songs, playlistId);
}
}
}
}).build();
}
}

View file

@ -0,0 +1,49 @@
package com.kabouzeid.gramophone.dialogs;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
/**
* @author Karim Abou Zeid (kabouzeid), Aidan Follestad (afollestad)
*/
public class DeletePlaylistDialog extends DialogFragment {
public static DeletePlaylistDialog create(long playlistId) {
DeletePlaylistDialog dialog = new DeletePlaylistDialog();
Bundle args = new Bundle();
args.putLong("playlist_id", playlistId);
dialog.setArguments(args);
return dialog;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
long playlistId = getArguments().getLong("playlist_id");
return new MaterialDialog.Builder(getActivity())
.title(getActivity().getResources().getString(R.string.delete_playlist) +
PlaylistsUtil.getNameForPlaylist(getActivity(), playlistId))
.positiveText(getActivity().getResources().getString(android.R.string.ok))
.negativeText(getActivity().getResources().getString(android.R.string.cancel))
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
if (getActivity() == null)
return;
long playlistId = getArguments().getLong("playlist_id");
PlaylistsUtil.deletePlaylist(getActivity(), playlistId);
}
@Override
public void onNegative(MaterialDialog dialog) {
super.onNegative(dialog);
dialog.dismiss();
}
}).build();
}
}

View file

@ -0,0 +1,78 @@
package com.kabouzeid.gramophone.dialogs;
import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.ActionBarActivity;
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.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.model.Song;
import com.mobeta.android.dslv.DragSortListView;
import java.util.ArrayList;
/**
* @author Karim Abou Zeid (kabouzeid), Aidan Follestad (afollestad)
*/
public class PlayingQueueDialog extends DialogFragment {
public static PlayingQueueDialog create() {
final ArrayList<Song> playingQueue = MusicPlayerRemote.getPlayingQueue();
if (playingQueue.isEmpty())
return null;
PlayingQueueDialog dialog = new PlayingQueueDialog();
Bundle args = new Bundle();
args.putSerializable("queue", playingQueue);
dialog.setArguments(args);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
MaterialDialog dialog = new MaterialDialog.Builder(getActivity())
.title(getActivity().getResources().getString(R.string.label_current_playing_queue))
.customView(R.layout.dialog_playlist, false)
.positiveText(getActivity().getResources().getString(R.string.save_as_playlist))
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {
super.onPositive(dialog);
if (getActivity() == null)
return;
//noinspection unchecked
ArrayList<Song> playingQueue = (ArrayList<Song>) getArguments().getSerializable("queue");
AddToPlaylistDialog.create(playingQueue).show(getActivity().getSupportFragmentManager(), "ADD_PLAYLIST");
}
})
.build();
//noinspection unchecked
final ArrayList<Song> playingQueue = (ArrayList<Song>) getArguments().getSerializable("queue");
final DragSortListView dragSortListView = (DragSortListView) dialog.getCustomView().findViewById(R.id.dragSortListView);
final PlayingQueueAdapter playingQueueAdapter =
new PlayingQueueAdapter((ActionBarActivity) getActivity(), 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

@ -0,0 +1,44 @@
package com.kabouzeid.gramophone.dialogs;
import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
/**
* @author Karim Abou Zeid (kabouzeid), Aidan Follestad (afollestad)
*/
public class RenamePlaylistDialog extends DialogFragment {
public static RenamePlaylistDialog create(long playlistId) {
RenamePlaylistDialog dialog = new RenamePlaylistDialog();
Bundle args = new Bundle();
args.putLong("playlist_id", playlistId);
dialog.setArguments(args);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
long playlistId = getArguments().getLong("playlist_id");
return new MaterialDialog.Builder(getActivity())
.title(R.string.rename_playlist)
.positiveText(android.R.string.ok)
.negativeText(android.R.string.cancel)
.input(null, PlaylistsUtil.getNameForPlaylist(getActivity(), playlistId), new MaterialDialog.InputCallback() {
@Override
public void onInput(MaterialDialog materialDialog, CharSequence charSequence) {
if (!charSequence.toString().trim().equals("")) {
long playlistId = getArguments().getLong("playlist_id");
PlaylistsUtil.renamePlaylist(getActivity(), playlistId, charSequence.toString());
}
}
})
.build();
}
}

View file

@ -1,6 +1,11 @@
package com.kabouzeid.gramophone.helper;
package com.kabouzeid.gramophone.dialogs;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.text.Html;
import android.text.Spanned;
import android.util.Log;
@ -24,16 +29,30 @@ import java.io.File;
import java.io.IOException;
/**
* Created by karim on 19.01.15.
* @author Karim Abou Zeid (kabouzeid), Aidan Follestad (afollestad)
*/
public class SongDetailDialogHelper {
public static final String TAG = SongDetailDialogHelper.class.getSimpleName();
public class SongDetailDialog extends DialogFragment {
public static final String TAG = SongDetailDialog.class.getSimpleName();
public static SongDetailDialog create(File songFile) {
SongDetailDialog dialog = new SongDetailDialog();
Bundle args = new Bundle();
args.putSerializable("song_file", songFile);
dialog.setArguments(args);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Activity context = getActivity();
final File songFile = (File) getArguments().getSerializable("song_file");
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))
.positiveText(android.R.string.ok)
.callback(new MaterialDialog.ButtonCallback() {
@Override
public void onPositive(MaterialDialog dialog) {

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,12 +1,13 @@
package com.kabouzeid.gramophone.interfaces;
/**
* Created by karim on 23.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public interface KabViewsDisableAble {
public void enableViews();
public void disableViews();
void enableViews();
public boolean areViewsEnabled();
void disableViews();
boolean areViewsEnabled();
}

View file

@ -1,9 +1,9 @@
package com.kabouzeid.gramophone.lastfm;
/**
* Created by karim on 15.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class LastFMUtil {
public static String BASE_URL = "ws.audioscrobbler.com";
public static String API_KEY = "bd9c6ea4d55ec9ed3af7d276e5ece304";
public static final String BASE_URL = "ws.audioscrobbler.com";
public static final String API_KEY = "bd9c6ea4d55ec9ed3af7d276e5ece304";
}

View file

@ -11,7 +11,7 @@ import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by karim on 01.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class LastFMAlbumImageUrlLoader {
public static final String TAG = LastFMAlbumImageUrlLoader.class.getSimpleName();
@ -50,9 +50,9 @@ public class LastFMAlbumImageUrlLoader {
}
}
public static interface AlbumImageUrlLoaderCallback {
public void onAlbumImageUrlLoaded(String url);
public interface AlbumImageUrlLoaderCallback {
void onAlbumImageUrlLoaded(String url);
public void onError();
void onError();
}
}

View file

@ -16,12 +16,12 @@ import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by karim on 24.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class LastFMAlbumInfoUtil {
public static final String TAG = LastFMAlbumInfoUtil.class.getSimpleName();
private static String AUTO_CORRECT = "1";
private static final String AUTO_CORRECT = "1";
public static String getAlbumUrl(String album, String artist) {
if (album != null) {

View file

@ -13,7 +13,7 @@ import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by karim on 01.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class LastFMArtistBiographyLoader {
public static final String TAG = LastFMArtistBiographyLoader.class.getSimpleName();
@ -55,7 +55,7 @@ public class LastFMArtistBiographyLoader {
app.addToVolleyRequestQueue(artistInfoJSONRequest);
}
public static interface ArtistBioLoaderCallback {
public void onArtistBioLoaded(String bio);
public interface ArtistBioLoaderCallback {
void onArtistBioLoaded(String bio);
}
}

View file

@ -10,7 +10,7 @@ import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by karim on 01.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class LastFMArtistImageUrlLoader {
public static final String TAG = LastFMArtistImageUrlLoader.class.getSimpleName();
@ -42,7 +42,7 @@ public class LastFMArtistImageUrlLoader {
}
}
public static interface ArtistImageUrlLoaderCallback {
public void onArtistImageUrlLoaded(String url);
public interface ArtistImageUrlLoaderCallback {
void onArtistImageUrlLoaded(String url);
}
}

View file

@ -16,12 +16,13 @@ import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by karim on 24.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class LastFMArtistInfoUtil {
public static final String TAG = LastFMArtistInfoUtil.class.getSimpleName();
private static String AUTO_CORRECT = "1";
public static final String TAG = LastFMArtistInfoUtil.class.getSimpleName();
@SuppressWarnings("FieldCanBeLocal")
private static final String AUTO_CORRECT = "1";
public static String getArtistUrl(String artist) {
if (artist != null) {

View file

@ -10,7 +10,7 @@ import org.json.JSONException;
import org.json.JSONObject;
/**
* Created by karim on 01.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class LastFMArtistThumbnailUrlLoader {
public static final String TAG = LastFMArtistThumbnailUrlLoader.class.getSimpleName();
@ -42,7 +42,7 @@ public class LastFMArtistThumbnailUrlLoader {
}
}
public static interface ArtistThumbnailUrlLoaderCallback {
public void onArtistThumbnailUrlLoaded(String url);
public interface ArtistThumbnailUrlLoaderCallback {
void onArtistThumbnailUrlLoaded(String url);
}
}

View file

@ -12,7 +12,7 @@ import java.util.ArrayList;
import java.util.List;
/**
* Created by karim on 29.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class AlbumLoader {
@ -39,11 +39,11 @@ public class AlbumLoader {
return albums;
}
public static final Cursor makeAlbumCursor(final Context context) {
public static Cursor makeAlbumCursor(final Context context) {
return makeAlbumCursor(context, null, null);
}
public static final Cursor makeAlbumCursor(final Context context, final String selection, final String[] values) {
public static Cursor makeAlbumCursor(final Context context, final String selection, final String[] values) {
return context.getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[]{
/* 0 */

View file

@ -11,22 +11,21 @@ import com.kabouzeid.gramophone.util.PreferenceUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Created by karim on 29.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class AlbumSongLoader {
public static List<Song> getAlbumSongList(final Context context, final int albumId, Comparator<Song> comparator) {
List<Song> songs = getAlbumSongList(context, albumId);
public static ArrayList<Song> getAlbumSongList(final Context context, final int albumId, Comparator<Song> comparator) {
ArrayList<Song> songs = getAlbumSongList(context, albumId);
Collections.sort(songs, comparator);
return songs;
}
public static List<Song> getAlbumSongList(final Context context, final int albumId) {
public static ArrayList<Song> getAlbumSongList(final Context context, final int albumId) {
Cursor cursor = makeAlbumSongCursor(context, albumId);
List<Song> songs = new ArrayList<>();
ArrayList<Song> songs = new ArrayList<>();
if (cursor != null && cursor.moveToFirst()) {
do {
final int id = cursor.getInt(0);
@ -48,11 +47,7 @@ public class AlbumSongLoader {
return songs;
}
public static final Cursor makeAlbumSongCursor(final Context context, final int albumId) {
final StringBuilder selection = new StringBuilder();
selection.append(MediaStore.Audio.AudioColumns.IS_MUSIC + "=1");
selection.append(" AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''");
selection.append(" AND " + MediaStore.Audio.AudioColumns.ALBUM_ID + "=" + albumId);
public static Cursor makeAlbumSongCursor(final Context context, final int albumId) {
return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[]{
/* 0 */
@ -69,6 +64,9 @@ public class AlbumSongLoader {
MediaStore.Audio.AudioColumns.TRACK,
/* 6 */
MediaStore.Audio.AudioColumns.ARTIST_ID
}, selection.toString(), null, PreferenceUtils.getInstance(context).getAlbumSongSortOrder());
}, (MediaStore.Audio.AudioColumns.IS_MUSIC + "=1") + " AND " +
MediaStore.Audio.AudioColumns.TITLE + " != ''" + " AND " +
MediaStore.Audio.AudioColumns.ALBUM_ID + "=" + albumId, null,
PreferenceUtils.getInstance(context).getAlbumSongSortOrder());
}
}

View file

@ -12,7 +12,7 @@ import java.util.ArrayList;
import java.util.List;
/**
* Created by karim on 04.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistAlbumLoader {
public static List<Album> getArtistAlbumList(final Context context, final int artistId) {

View file

@ -12,7 +12,7 @@ import java.util.ArrayList;
import java.util.List;
/**
* Created by karim on 29.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistLoader {
@ -37,11 +37,11 @@ public class ArtistLoader {
return artists;
}
public static final Cursor makeArtistCursor(final Context context) {
public static Cursor makeArtistCursor(final Context context) {
return makeArtistCursor(context, null, null);
}
public static final Cursor makeArtistCursor(final Context context, final String selection, final String[] values) {
public static Cursor makeArtistCursor(final Context context, final String selection, final String[] values) {
return context.getContentResolver().query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
new String[]{
/* 0 */

View file

@ -9,15 +9,15 @@ import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Created by karim on 01.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class ArtistSongLoader {
public static List<Song> getArtistSongList(final Context context, final int artistId) {
public static ArrayList<Song> getArtistSongList(final Context context, final int artistId) {
Cursor cursor = makeArtistSongCursor(context, artistId);
List<Song> songs = new ArrayList<>();
ArrayList<Song> songs = new ArrayList<>();
if (cursor != null && cursor.moveToFirst()) {
do {
final int id = cursor.getInt(0);
@ -40,10 +40,6 @@ public class ArtistSongLoader {
}
public static Cursor makeArtistSongCursor(final Context context, final int artistId) {
final StringBuilder selection = new StringBuilder();
selection.append(MediaStore.Audio.AudioColumns.IS_MUSIC + "=1");
selection.append(" AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''");
selection.append(" AND " + MediaStore.Audio.AudioColumns.ARTIST_ID + "=" + artistId);
return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[]{
/* 0 */
@ -60,6 +56,9 @@ public class ArtistSongLoader {
MediaStore.Audio.AudioColumns.TRACK,
/* 6 */
MediaStore.Audio.AudioColumns.ALBUM_ID
}, selection.toString(), null, PreferenceUtils.getInstance(context).getArtistSongSortOrder());
}, (MediaStore.Audio.AudioColumns.IS_MUSIC + "=1") + " AND " +
MediaStore.Audio.AudioColumns.TITLE + " != ''" + " AND " +
MediaStore.Audio.AudioColumns.ARTIST_ID + "=" + artistId, null,
PreferenceUtils.getInstance(context).getArtistSongSortOrder());
}
}

View file

@ -8,12 +8,11 @@ import android.provider.MediaStore.Audio.AudioColumns;
import com.kabouzeid.gramophone.model.PlaylistSong;
import java.util.ArrayList;
import java.util.List;
public class PlaylistSongLoader {
public static List<PlaylistSong> getPlaylistSongList(final Context context, final int playlistID) {
List<PlaylistSong> songs = new ArrayList<>();
public static ArrayList<PlaylistSong> getPlaylistSongList(final Context context, final int playlistID) {
ArrayList<PlaylistSong> songs = new ArrayList<>();
Cursor cursor = makePlaylistSongCursor(context, playlistID);
if (cursor != null && cursor.moveToFirst()) {

View file

@ -9,7 +9,7 @@ import java.util.ArrayList;
import java.util.List;
/**
* Created by karim on 11.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class SongFilePathLoader {
public static final String TAG = SongFilePathLoader.class.getSimpleName();
@ -46,11 +46,11 @@ public class SongFilePathLoader {
}
}
public static final Cursor makeSongFilePathCursor(final Context context) {
public static Cursor makeSongFilePathCursor(final Context context) {
return makeSongFilePathCursor(context, null);
}
public static final Cursor makeSongFilePathCursor(final Context context, String selection) {
public static Cursor makeSongFilePathCursor(final Context context, String selection) {
return context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[]{
/* 0 */

View file

@ -12,14 +12,14 @@ import java.util.ArrayList;
import java.util.List;
/**
* Created by karim on 29.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class SongLoader {
private static final String BASE_SELECTION = MediaStore.Audio.AudioColumns.IS_MUSIC + "=1" + " AND " + MediaStore.Audio.AudioColumns.TITLE + " != ''";
public static List<Song> getAllSongs(Context context) {
public static ArrayList<Song> getAllSongs(Context context) {
Cursor cursor = makeSongCursor(context);
List<Song> songs = new ArrayList<>();
ArrayList<Song> songs = new ArrayList<>();
if (cursor != null && cursor.moveToFirst()) {
do {
final int id = cursor.getInt(0);
@ -48,7 +48,7 @@ public class SongLoader {
public static Cursor makeSongCursor(final Context context, final String selection, final String[] values) {
String finalSelection = BASE_SELECTION;
if(selection != null){
if (selection != null) {
finalSelection += " AND " + selection;
}

View file

@ -1,7 +1,7 @@
package com.kabouzeid.gramophone.misc;
/**
* Created by karim on 22.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public final class AppKeys {
public static final String CL_CURRENT_ACTIVITY = "Current activity";

View file

@ -71,13 +71,13 @@ public class DragSortRecycler extends RecyclerView.ItemDecoration implements Rec
public interface OnItemMovedListener {
public void onItemMoved(int from, int to);
void onItemMoved(int from, int to);
}
public interface OnDragStateChangedListener {
public void onDragStart();
void onDragStart();
public void onDragStop();
void onDragStop();
}
private void debugLog(String log) {
@ -135,15 +135,14 @@ public class DragSortRecycler extends RecyclerView.ItemDecoration implements Rec
debugLog("View top = " + view.getTop());
if (selectedDragItemPos != -1) {
int itemPos = rv.getChildPosition(view);
int itemPos = rv.getChildAdapterPosition(view);
debugLog("itemPos =" + itemPos);
if (!canDragOver(itemPos)) {
return;
}
//Movement of finger
float totalMovement = fingerY - fingerAnchorY;
// float totalMovement = fingerY - fingerAnchorY;
if (itemPos == selectedDragItemPos) {
view.setVisibility(View.INVISIBLE);
@ -211,7 +210,7 @@ public class DragSortRecycler extends RecyclerView.ItemDecoration implements Rec
if (view.getVisibility() != View.VISIBLE)
continue;
int itemPos = rv.getChildPosition(view);
int itemPos = rv.getChildAdapterPosition(view);
if (itemPos == selectedDragItemPos) //Don't check against itself!
continue;
@ -306,7 +305,7 @@ public class DragSortRecycler extends RecyclerView.ItemDecoration implements Rec
fingerOffsetInViewY = fingerAnchorY - itemView.getTop();
fingerY = fingerAnchorY;
selectedDragItemPos = rv.getChildPosition(itemView);
selectedDragItemPos = rv.getChildAdapterPosition(itemView);
debugLog("selectedDragItemPos = " + selectedDragItemPos);
return true;
@ -381,7 +380,7 @@ public class DragSortRecycler extends RecyclerView.ItemDecoration implements Rec
}
Paint bgColor = new Paint();
final Paint bgColor = new Paint();
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
@ -393,12 +392,7 @@ public class DragSortRecycler extends RecyclerView.ItemDecoration implements Rec
}
}
RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
final RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
@ -407,15 +401,10 @@ public class DragSortRecycler extends RecyclerView.ItemDecoration implements Rec
}
};
/**
* @param position
* @return True if we can drag the item over this position, False if not.
*/
protected boolean canDragOver(int position) {
return true;
}
private BitmapDrawable createFloatingBitmap(View v) {
floatingItemStatingBounds = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
floatingItemBounds = new Rect(floatingItemStatingBounds);

View file

@ -1,7 +1,7 @@
package com.kabouzeid.gramophone.misc;
/**
* Created by karim on 20.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class SmallAnimatorListener implements com.nineoldandroids.animation.Animator.AnimatorListener {
@Override

View file

@ -4,7 +4,7 @@ import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCal
import com.github.ksoichiro.android.observablescrollview.ScrollState;
/**
* Created by karim on 20.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class SmallObservableScrollViewCallbacks implements ObservableScrollViewCallbacks {
@Override

View file

@ -4,7 +4,7 @@ import android.view.GestureDetector;
import android.view.MotionEvent;
/**
* Created by karim on 20.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class SmallOnGestureListener implements GestureDetector.OnGestureListener {
@Override

View file

@ -4,7 +4,7 @@ import android.annotation.TargetApi;
import android.transition.Transition;
/**
* Created by karim on 20.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
@TargetApi(21)
public class SmallTransitionListener implements Transition.TransitionListener {

View file

@ -8,16 +8,16 @@ import com.kabouzeid.gramophone.util.MusicUtil;
import com.squareup.picasso.Picasso;
/**
* Created by karim on 22.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class Album implements SearchEntry {
public int id;
public final int id;
public int artistId;
public String title;
public String artistName;
public int songCount;
public int year;
public final String title;
public final String artistName;
public final int songCount;
public final int year;
public Album(final int id, final String title, final String artistName, final int artistId,
final int songNumber, final int albumYear) {

View file

@ -8,13 +8,13 @@ import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistThumbnailUrlLoader;
import com.squareup.picasso.Picasso;
/**
* Created by karim on 29.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class Artist implements SearchEntry {
public int id;
public String name;
public int albumCount;
public int songCount;
public final int id;
public final String name;
public final int albumCount;
public final int songCount;
public Artist(final int id, final String name, final int albumCount, final int songCount) {
this.id = id;

View file

@ -1,7 +1,7 @@
package com.kabouzeid.gramophone.model;
/**
* Created by karim on 17.03.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class DataBaseChangedEvent {
public static final int PLAYLISTS_CHANGED = 0;
@ -10,7 +10,7 @@ public class DataBaseChangedEvent {
public static final int SONGS_CHANGED = 3;
public static final int DATABASE_CHANGED = 4;
private int action;
private final int action;
public DataBaseChangedEvent(int action) {
this.action = action;

View file

@ -1,7 +1,7 @@
package com.kabouzeid.gramophone.model;
/**
* Created by karim on 19.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class MusicRemoteEvent {
public static final int PLAY = 0;
@ -24,7 +24,7 @@ public class MusicRemoteEvent {
public static final int SHUFFLE_MODE_CHANGED = 13;
public static final int REPEAT_MODE_CHANGED = 14;
private int action;
private final int action;
public MusicRemoteEvent(int action) {
this.action = action;

View file

@ -1,11 +1,12 @@
package com.kabouzeid.gramophone.model;
/**
* Created by karim on 23.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class NavigationDrawerItem {
public String title;
public int imageRes;
public final String title;
public final int imageRes;
public NavigationDrawerItem(String title, int imageRes) {
this.title = title;

View file

@ -1,8 +1,8 @@
package com.kabouzeid.gramophone.model;
public class Playlist {
public int id;
public String name;
public final int id;
public final String name;
public Playlist(final int id, final String name) {
this.id = id;

View file

@ -1,7 +1,7 @@
package com.kabouzeid.gramophone.model;
public class PlaylistSong extends Song {
public int playlistId;
public final int playlistId;
public int idInPlayList;
public PlaylistSong(final int id, final int albumId, final int artistId, final String title, final String artistName,

View file

@ -4,12 +4,12 @@ import android.content.Context;
import android.widget.ImageView;
/**
* Created by karim on 27.02.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public interface SearchEntry {
public String getTitle();
String getTitle();
public String getSubTitle();
String getSubTitle();
public void loadImage(Context context, ImageView imageView);
void loadImage(Context context, ImageView imageView);
}

View file

@ -6,18 +6,18 @@ import android.widget.ImageView;
import java.io.Serializable;
/**
* Created by karim on 23.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class Song implements Serializable, SearchEntry {
public int id;
public int albumId;
public int artistId;
public String title;
public String artistName;
public String albumName;
public long duration;
public int trackNumber;
public final int albumId;
public final int artistId;
public final String title;
public final String artistName;
public final String albumName;
public final long duration;
public final int trackNumber;
public Song(final int id, final int albumId, final int artistId, final String title, final String artistName,
final String albumName, final long duration, final int trackNumber) {

View file

@ -1,7 +1,7 @@
package com.kabouzeid.gramophone.model;
/**
* Created by karim on 28.03.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class UIPreferenceChangedEvent {
public static final int THEME_CHANGED = 0;
@ -11,8 +11,8 @@ public class UIPreferenceChangedEvent {
public static final int PLAYBACK_CONTROLLER_CARD_CHANGED = 4;
public static final int TOOLBAR_TRANSPARENT_CHANGED = 5;
private int action;
private Object value;
private final int action;
private final Object value;
public UIPreferenceChangedEvent(int action, Object value) {
this.action = action;

View file

@ -0,0 +1,56 @@
package com.kabouzeid.gramophone.prefs;
import android.content.Context;
import android.preference.Preference;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.View;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.views.CircleView;
public class ColorChooserPreference extends Preference {
private View mView;
private int color;
private int border;
public ColorChooserPreference(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ColorChooserPreference(Context context) {
this(context, null, 0);
}
public ColorChooserPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setLayoutResource(R.layout.preference_custom);
}
@Override
protected void onBindView(@NonNull View view) {
super.onBindView(view);
mView = view;
invalidateColor();
}
public void setColor(int color, int border) {
this.color = color;
this.border = border;
invalidateColor();
}
private void invalidateColor() {
if (mView != null) {
CircleView circle = (CircleView) mView.findViewById(R.id.circle);
if (this.color != 0) {
circle.setVisibility(View.VISIBLE);
circle.setBackgroundColor(color);
circle.setBorderColor(border);
} else {
circle.setVisibility(View.GONE);
}
}
}
}

View file

@ -0,0 +1,39 @@
package com.kabouzeid.gramophone.prefs;
import android.content.Context;
import android.preference.PreferenceCategory;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.kabouzeid.gramophone.R;
/**
* Uses the theme's primary color as the text color of the category.
*
* @author Aidan Follestad (afollestad)
*/
public class DynamicPreferenceCategory extends PreferenceCategory {
public DynamicPreferenceCategory(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public DynamicPreferenceCategory(Context context) {
this(context, null, 0);
}
public DynamicPreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setLayoutResource(R.layout.preference_category_custom);
setSelectable(false);
}
@Override
protected void onBindView(@NonNull View view) {
super.onBindView(view);
((TextView) view.findViewById(android.R.id.title)).setTextColor(ThemeSingleton.get().positiveColor);
}
}

View file

@ -81,9 +81,9 @@ public class AlbumJSONStore extends SQLiteOpenHelper {
}
public interface AlbumJSONColumns {
public static final String NAME = "AlbumJSON";
public static final String ALBUMANDARTIST_NAME = "AlbumAndArtistName";
public static final String JSON = "JSON";
String NAME = "AlbumJSON";
String ALBUMANDARTIST_NAME = "AlbumAndArtistName";
String JSON = "JSON";
}
@Override

View file

@ -81,9 +81,9 @@ public class ArtistJSONStore extends SQLiteOpenHelper {
}
public interface ArtistJSONColumns {
public static final String NAME = "ArtistJSON";
public static final String ARTIST_NAME = "ArtistName";
public static final String JSON = "JSON";
String NAME = "ArtistJSON";
String ARTIST_NAME = "ArtistName";
String JSON = "JSON";
}
@Override

View file

@ -38,7 +38,6 @@ import com.squareup.picasso.Target;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MusicService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, AudioManager.OnAudioFocusChangeListener {
public static final String ACTION_TOGGLE_PLAYBACK = "com.kabouzeid.gramophone.action.TOGGLE_PLAYBACK";
@ -66,8 +65,8 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
}
};
private MediaPlayer player;
private List<Song> playingQueue;
private List<Song> originalPlayingQueue;
private ArrayList<Song> playingQueue;
private ArrayList<Song> originalPlayingQueue;
private int currentSongId = -1;
private int position = -1;
private int shuffleMode;
@ -355,7 +354,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
.into(remoteAlbumArt);
}
private Target remoteAlbumArt = new Target() {
private final Target remoteAlbumArt = new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
updateRemoteControlClientBitmap(bitmap.copy(bitmap.getConfig(), true));
@ -432,7 +431,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
return getPosition() == getPlayingQueue().size() - 1;
}
public List<Song> getPlayingQueue() {
public ArrayList<Song> getPlayingQueue() {
return playingQueue;
}
@ -475,7 +474,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
savePosition();
}
public void openQueue(final List<Song> playingQueue, final int startPosition, final boolean startPlaying) {
public void openQueue(final ArrayList<Song> playingQueue, final int startPosition, final boolean startPlaying) {
if (playingQueue != null && !playingQueue.isEmpty() && startPosition >= 0 && startPosition < playingQueue.size()) {
originalPlayingQueue = playingQueue;
this.playingQueue = new ArrayList<>(originalPlayingQueue);
@ -514,7 +513,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
}
}
public void restorePreviousState(final List<Song> originalPlayingQueue, final List<Song> playingQueue, int position) {
public void restorePreviousState(final ArrayList<Song> originalPlayingQueue, final ArrayList<Song> playingQueue, int position) {
this.originalPlayingQueue = originalPlayingQueue;
this.playingQueue = playingQueue;
this.position = position;
@ -772,6 +771,8 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
}
public int getAudioSessionId() {
if (player == null)
return AudioEffect.ERROR_BAD_VALUE;
return player.getAudioSessionId();
}

View file

@ -16,8 +16,8 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
@ -43,7 +43,7 @@ import com.squareup.otto.Subscribe;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import java.util.List;
import java.util.ArrayList;
/*
*
@ -54,10 +54,8 @@ import java.util.List;
* */
public class AlbumDetailActivity extends AbsFabActivity {
public static final String TAG = AlbumDetailActivity.class.getSimpleName();
private App app;
private Album album;
private ObservableRecyclerView recyclerView;
@ -66,12 +64,11 @@ public class AlbumDetailActivity extends AbsFabActivity {
private View songsBackgroundView;
private TextView albumTitleView;
private Toolbar toolbar;
private int toolbarHeight;
private int headerOffset;
private int titleViewHeight;
private int albumArtViewHeight;
private int toolbarColor;
private SmallObservableScrollViewCallbacks observableScrollViewCallbacks = new SmallObservableScrollViewCallbacks() {
private final SmallObservableScrollViewCallbacks observableScrollViewCallbacks = new SmallObservableScrollViewCallbacks() {
@Override
public void onScrollChanged(int scrollY, boolean b, boolean b2) {
scrollY += albumArtViewHeight + titleViewHeight;
@ -112,7 +109,8 @@ public class AlbumDetailActivity extends AbsFabActivity {
App.bus.register(this);
if (Util.hasLollipopSDK()) postponeEnterTransition();
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarAlbumEnabled()) getWindow().setNavigationBarColor(Util.resolveColor(this, R.attr.default_bar_color));
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarAlbumEnabled())
getWindow().setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color));
Bundle intentExtras = getIntent().getExtras();
int albumId = -1;
@ -148,8 +146,8 @@ public class AlbumDetailActivity extends AbsFabActivity {
private void setUpObservableListViewParams() {
albumArtViewHeight = getResources().getDimensionPixelSize(R.dimen.header_image_height);
toolbarColor = Util.resolveColor(this, R.attr.default_bar_color);
toolbarHeight = Util.getActionBarSize(this);
toolbarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color);
int toolbarHeight = Util.getActionBarSize(this);
titleViewHeight = getResources().getDimensionPixelSize(R.dimen.title_view_height);
headerOffset = toolbarHeight;
headerOffset += getResources().getDimensionPixelSize(R.dimen.statusMargin);
@ -199,8 +197,8 @@ public class AlbumDetailActivity extends AbsFabActivity {
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setNavigationBarColored(boolean colored){
if (colored){
private void setNavigationBarColored(boolean colored) {
if (colored) {
if (Util.hasLollipopSDK()) getWindow().setNavigationBarColor(toolbarColor);
} else {
if (Util.hasLollipopSDK()) getWindow().setNavigationBarColor(Color.BLACK);
@ -216,8 +214,8 @@ public class AlbumDetailActivity extends AbsFabActivity {
public void run() {
songsBackgroundView.getLayoutParams().height = contentView.getHeight();
observableScrollViewCallbacks.onScrollChanged(-(albumArtViewHeight + titleViewHeight), false, false);
recyclerView.scrollBy(0,1);
recyclerView.scrollBy(0,-1);
recyclerView.scrollBy(0, 1);
recyclerView.scrollBy(0, -1);
}
});
}
@ -229,7 +227,7 @@ public class AlbumDetailActivity extends AbsFabActivity {
}
private void setUpSongsAdapter() {
final List<Song> songs = AlbumSongLoader.getAlbumSongList(this, album.id, new SongTrackNumberComparator());
final ArrayList<Song> songs = AlbumSongLoader.getAlbumSongList(this, album.id, new SongTrackNumberComparator());
final AlbumSongAdapter albumSongAdapter = new AlbumSongAdapter(this, songs);
recyclerView.setLayoutManager(new GridLayoutManager(this, 1));
recyclerView.setAdapter(albumSongAdapter);
@ -283,16 +281,16 @@ public class AlbumDetailActivity extends AbsFabActivity {
startActivity(intent);
return true;
case R.id.action_go_to_artist:
Pair[] artistPairs = null;
artistPairs = getSharedViewsWithFab(artistPairs);
Pair[] artistPairs = getSharedViewsWithFab(null);
NavigationUtil.goToArtist(this, album.artistId, artistPairs);
return true;
}
return super.onOptionsItemSelected(item);
}
@Subscribe public void onUIPreferenceChanged(UIPreferenceChangedEvent event){
switch (event.getAction()){
@Subscribe
public void onUIPreferenceChanged(UIPreferenceChangedEvent event) {
switch (event.getAction()) {
case UIPreferenceChangedEvent.COLORED_NAVIGATION_BAR_ALBUM_CHANGED:
setNavigationBarColored((boolean) event.getValue());
break;

View file

@ -23,6 +23,7 @@ import android.widget.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.github.ksoichiro.android.observablescrollview.ObservableListView;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
@ -50,6 +51,7 @@ import com.squareup.otto.Subscribe;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
/*
@ -74,7 +76,6 @@ public class ArtistDetailActivity extends AbsFabActivity {
private View songsBackgroundView;
private TextView artistNameTv;
private Toolbar toolbar;
private int toolbarHeight;
private int headerOffset;
private int titleViewHeight;
private int artistImageViewHeight;
@ -85,7 +86,7 @@ public class ArtistDetailActivity extends AbsFabActivity {
private Spanned biography;
private SmallObservableScrollViewCallbacks observableScrollViewCallbacks = new SmallObservableScrollViewCallbacks() {
private final SmallObservableScrollViewCallbacks observableScrollViewCallbacks = new SmallObservableScrollViewCallbacks() {
@Override
public void onScrollChanged(int scrollY, boolean b, boolean b2) {
scrollY += artistImageViewHeight + titleViewHeight;
@ -127,7 +128,8 @@ public class ArtistDetailActivity extends AbsFabActivity {
App.bus.register(this);
if (Util.hasLollipopSDK()) postponeEnterTransition();
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarArtistEnabled()) getWindow().setNavigationBarColor(Util.resolveColor(this, R.attr.default_bar_color));
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarArtistEnabled())
getWindow().setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color));
getIntentExtras();
initViews();
@ -153,8 +155,8 @@ public class ArtistDetailActivity extends AbsFabActivity {
private void setUpObservableListViewParams() {
artistImageViewHeight = getResources().getDimensionPixelSize(R.dimen.header_image_height);
toolbarColor = Util.resolveColor(this, R.attr.default_bar_color);
toolbarHeight = Util.getActionBarSize(this);
toolbarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color);
int toolbarHeight = Util.getActionBarSize(this);
titleViewHeight = getResources().getDimensionPixelSize(R.dimen.title_view_height);
headerOffset = toolbarHeight;
headerOffset += getResources().getDimensionPixelSize(R.dimen.statusMargin);
@ -180,8 +182,8 @@ public class ArtistDetailActivity extends AbsFabActivity {
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setNavigationBarColored(boolean colored){
if (colored){
private void setNavigationBarColored(boolean colored) {
if (colored) {
if (Util.hasLollipopSDK()) getWindow().setNavigationBarColor(toolbarColor);
} else {
if (Util.hasLollipopSDK()) getWindow().setNavigationBarColor(Color.BLACK);
@ -193,7 +195,7 @@ public class ArtistDetailActivity extends AbsFabActivity {
songListView.setPadding(0, artistImageViewHeight + titleViewHeight, 0, 0);
songListView.addHeaderView(songListHeader);
final List<Song> songs = ArtistSongLoader.getArtistSongList(this, artist.id);
final ArrayList<Song> songs = ArtistSongLoader.getArtistSongList(this, artist.id);
ArtistSongAdapter songAdapter = new ArtistSongAdapter(this, songs);
songListView.setAdapter(songAdapter);
@ -242,6 +244,7 @@ public class ArtistDetailActivity extends AbsFabActivity {
return new MaterialDialog.Builder(ArtistDetailActivity.this)
.title(artist.name)
.content(biography)
.positiveText(android.R.string.ok)
.build();
}
@ -285,14 +288,15 @@ public class ArtistDetailActivity extends AbsFabActivity {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setStandardColors() {
int titleTextColor = Util.resolveColor(this, R.attr.title_text_color);
int defaultBarColor = Util.resolveColor(this, R.attr.default_bar_color);
int titleTextColor = DialogUtils.resolveColor(this, R.attr.title_text_color);
int defaultBarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color);
toolbarColor = defaultBarColor;
artistNameTv.setBackgroundColor(defaultBarColor);
artistNameTv.setTextColor(titleTextColor);
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarArtistEnabled()) getWindow().setNavigationBarColor(Util.resolveColor(this, R.attr.default_bar_color));
if (Util.hasLollipopSDK() && PreferenceUtils.getInstance(this).coloredNavigationBarArtistEnabled())
getWindow().setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color));
}
private void setUpToolBar() {
@ -398,8 +402,8 @@ public class ArtistDetailActivity extends AbsFabActivity {
}
@Subscribe
public void onUIPreferenceChanged(UIPreferenceChangedEvent event){
switch (event.getAction()){
public void onUIPreferenceChanged(UIPreferenceChangedEvent event) {
switch (event.getAction()) {
case UIPreferenceChangedEvent.COLORED_NAVIGATION_BAR_ARTIST_CHANGED:
setNavigationBarColored((boolean) event.getValue());
break;

View file

@ -4,6 +4,7 @@ import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.support.v4.util.Pair;
import android.support.v4.view.ViewPager;
@ -17,11 +18,12 @@ import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.astuetz.PagerSlidingTabStrip;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.PagerAdapter;
import com.kabouzeid.gramophone.helper.AboutDeveloperDialogHelper;
import com.kabouzeid.gramophone.helper.CreatePlaylistDialogHelper;
import com.kabouzeid.gramophone.dialogs.AboutDialog;
import com.kabouzeid.gramophone.dialogs.CreatePlaylistDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
@ -44,6 +46,7 @@ import com.kabouzeid.gramophone.util.Util;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
@ -95,8 +98,7 @@ public class MainActivity extends AbsFabActivity
navigationDrawerFragment.setItemChecked(startPosition);
final int accentColor = Util.resolveColor(MainActivity.this, R.attr.colorAccent);
slidingTabLayout.setIndicatorColor(accentColor);
slidingTabLayout.setIndicatorColor(ThemeSingleton.get().positiveColor);
slidingTabLayout.setViewPager(viewPager);
slidingTabLayout.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@ -137,7 +139,7 @@ public class MainActivity extends AbsFabActivity
private void setToolBarTransparent(boolean transparent) {
float alpha = transparent ? 0.97f : 1f;
final int colorPrimary = Util.resolveColor(this, R.attr.colorPrimary);
final int colorPrimary = PreferenceUtils.getInstance(this).getThemeColorPrimary();
ViewUtil.setBackgroundAlpha(toolbar, alpha, colorPrimary);
ViewUtil.setBackgroundAlpha(statusBar, alpha, colorPrimary);
ViewUtil.setBackgroundAlpha(slidingTabLayout, alpha, colorPrimary);
@ -222,6 +224,22 @@ public class MainActivity extends AbsFabActivity
getResources().getString(R.string.transition_album_cover)
)
}));
} else if (position == NavigationDrawerFragment.ABOUT_INDEX) {
drawerLayout.closeDrawers();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
new AboutDialog().show(getSupportFragmentManager(), "ABOUT_DIALOG");
}
}, 200);
} else if (position == NavigationDrawerFragment.SETTINGS_INDEX) {
drawerLayout.closeDrawers();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent(MainActivity.this, SettingsActivity.class));
}
}, 200);
} else {
if (viewPager != null) {
viewPager.setCurrentItem(position, true);
@ -267,17 +285,11 @@ public class MainActivity extends AbsFabActivity
MusicPlayerRemote.shuffleAllSongs(this);
return true;
case R.id.action_new_playlist:
CreatePlaylistDialogHelper.getDialog(this).show();
CreatePlaylistDialog.create().show(getSupportFragmentManager(), "CREATE_PLAYLIST");
return true;
case R.id.action_search:
startActivity(new Intent(MainActivity.this, SearchActivity.class));
return true;
case R.id.action_settings:
startActivity(new Intent(MainActivity.this, SettingsActivity.class));
return true;
case R.id.action_about:
AboutDeveloperDialogHelper.getDialog(this).show();
return true;
case R.id.action_current_playing:
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null));
return true;
@ -319,9 +331,9 @@ public class MainActivity extends AbsFabActivity
PreferenceUtils.getInstance(MainActivity.this).setLastStartPage(currentPage);
}
private boolean handlePlaybackIntent(Intent intent) {
private void handlePlaybackIntent(Intent intent) {
if (intent == null) {
return false;
return;
}
Uri uri = intent.getData();
@ -335,7 +347,8 @@ public class MainActivity extends AbsFabActivity
final int id = (int) parseIdFromIntent(intent, "playlistId", "playlist");
if (id >= 0) {
int position = intent.getIntExtra("position", 0);
MusicPlayerRemote.openQueue((List<Song>) (List<? extends Song>) PlaylistSongLoader.getPlaylistSongList(this, id), position, true);
//noinspection unchecked
MusicPlayerRemote.openQueue((ArrayList<Song>) (List<? extends Song>) PlaylistSongLoader.getPlaylistSongList(this, id), position, true);
handled = true;
}
} else if (MediaStore.Audio.Albums.CONTENT_TYPE.equals(mimeType)) {
@ -356,7 +369,6 @@ public class MainActivity extends AbsFabActivity
if (handled) {
setIntent(new Intent());
}
return handled;
}
private long parseIdFromIntent(Intent intent, String longKey,

View file

@ -3,7 +3,6 @@ package com.kabouzeid.gramophone.ui.activities;
import android.annotation.TargetApi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.os.Bundle;
@ -20,11 +19,14 @@ import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.afollestad.materialdialogs.internal.MDTintHelper;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper;
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SongDetailDialogHelper;
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistImageUrlLoader;
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
@ -66,9 +68,7 @@ public class MusicControllerActivity extends AbsFabActivity {
private ImageButton repeatButton;
private ImageButton shuffleButton;
private View mediaControllerContainer;
private int lastFooterColor = -1;
private boolean killThreads = false;
@Override
@ -128,11 +128,13 @@ public class MusicControllerActivity extends AbsFabActivity {
if (Util.hasLollipopSDK()) {
mediaControllerContainer.setElevation(getResources().getDimensionPixelSize(R.dimen.cardview_default_elevation));
}
mediaControllerContainer.setBackgroundColor(Util.resolveColor(this, R.attr.music_controller_container_color));
mediaControllerContainer.setBackgroundColor(
DialogUtils.resolveColor(this, R.attr.music_controller_container_color));
} else {
if (Util.hasLollipopSDK() && !Util.isInPortraitMode(this)) {
mediaControllerContainer.setElevation(getResources().getDimensionPixelSize(R.dimen.cardview_default_elevation));
mediaControllerContainer.setBackgroundColor(Util.resolveColor(this, R.attr.music_controller_container_color));
mediaControllerContainer.setBackgroundColor(
DialogUtils.resolveColor(this, R.attr.music_controller_container_color));
} else {
mediaControllerContainer.setBackground(null);
}
@ -140,6 +142,7 @@ public class MusicControllerActivity extends AbsFabActivity {
}
private void setUpProgressSlider() {
MDTintHelper.setTint(progressSlider, ThemeSingleton.get().positiveColor);
progressSlider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
@ -159,8 +162,10 @@ public class MusicControllerActivity extends AbsFabActivity {
}
private void setUpPrevNext() {
nextButton.setImageDrawable(Util.getTintedDrawable(getResources(), R.drawable.ic_skip_next_white_48dp, Util.resolveColor(this, R.attr.themed_drawable_color)));
prevButton.setImageDrawable(Util.getTintedDrawable(getResources(), R.drawable.ic_skip_previous_white_48dp, Util.resolveColor(this, R.attr.themed_drawable_color)));
nextButton.setImageDrawable(Util.getTintedDrawable(this,
R.drawable.ic_skip_next_white_48dp, DialogUtils.resolveColor(this, R.attr.themed_drawable_color)));
prevButton.setImageDrawable(Util.getTintedDrawable(this,
R.drawable.ic_skip_previous_white_48dp, DialogUtils.resolveColor(this, R.attr.themed_drawable_color)));
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -188,10 +193,12 @@ public class MusicControllerActivity extends AbsFabActivity {
private void updateShuffleState() {
switch (MusicPlayerRemote.getShuffleMode()) {
case MusicService.SHUFFLE_MODE_SHUFFLE:
shuffleButton.setImageDrawable(Util.getTintedDrawable(getResources(), R.drawable.ic_shuffle_white_48dp, Util.resolveColor(this, R.attr.themed_drawable_activated_color)));
shuffleButton.setImageDrawable(Util.getTintedDrawable(this, R.drawable.ic_shuffle_white_48dp,
ThemeSingleton.get().positiveColor));
break;
default:
shuffleButton.setImageDrawable(Util.getTintedDrawable(getResources(), R.drawable.ic_shuffle_white_48dp, Util.resolveColor(this, R.attr.themed_drawable_color)));
shuffleButton.setImageDrawable(Util.getTintedDrawable(this, R.drawable.ic_shuffle_white_48dp,
DialogUtils.resolveColor(this, R.attr.themed_drawable_color)));
break;
}
}
@ -209,13 +216,16 @@ public class MusicControllerActivity extends AbsFabActivity {
private void updateRepeatState() {
switch (MusicPlayerRemote.getRepeatMode()) {
case MusicService.REPEAT_MODE_NONE:
repeatButton.setImageDrawable(Util.getTintedDrawable(getResources(), R.drawable.ic_repeat_white_48dp, Util.resolveColor(this, R.attr.themed_drawable_color)));
repeatButton.setImageDrawable(Util.getTintedDrawable(this, R.drawable.ic_repeat_white_48dp,
DialogUtils.resolveColor(this, R.attr.themed_drawable_color)));
break;
case MusicService.REPEAT_MODE_ALL:
repeatButton.setImageDrawable(Util.getTintedDrawable(getResources(), R.drawable.ic_repeat_white_48dp, Util.resolveColor(this, R.attr.themed_drawable_activated_color)));
repeatButton.setImageDrawable(Util.getTintedDrawable(this, R.drawable.ic_repeat_white_48dp,
ThemeSingleton.get().positiveColor));
break;
default:
repeatButton.setImageDrawable(Util.getTintedDrawable(getResources(), R.drawable.ic_repeat_one_white_48dp, Util.resolveColor(this, R.attr.themed_drawable_activated_color)));
repeatButton.setImageDrawable(Util.getTintedDrawable(this, R.drawable.ic_repeat_one_white_48dp,
ThemeSingleton.get().positiveColor));
break;
}
}
@ -294,9 +304,9 @@ public class MusicControllerActivity extends AbsFabActivity {
}
private void setStandardColors() {
int songTitleTextColor = Util.resolveColor(this, R.attr.title_text_color);
int artistNameTextColor = Util.resolveColor(this, R.attr.caption_text_color);
int defaultBarColor = Util.resolveColor(this, R.attr.default_bar_color);
int songTitleTextColor = DialogUtils.resolveColor(this, R.attr.title_text_color);
int artistNameTextColor = DialogUtils.resolveColor(this, R.attr.caption_text_color);
int defaultBarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color);
animateColorChange(defaultBarColor);
@ -353,7 +363,8 @@ public class MusicControllerActivity extends AbsFabActivity {
Thread.sleep(1);
} catch (InterruptedException e) {
return;
} catch (Exception e) {
} catch (Exception e2) {
e2.printStackTrace();
}
final int finalTotal = total;
final int finalCurrentPosition = currentPosition;
@ -427,7 +438,7 @@ public class MusicControllerActivity extends AbsFabActivity {
Toast.makeText(this, "This feature is not available yet", Toast.LENGTH_SHORT).show();
return true;
case R.id.action_add_to_playlist:
AddToPlaylistDialogHelper.getDialog(this, song).show();
AddToPlaylistDialog.create(song).show(getSupportFragmentManager(), "ADD_PLAYLIST");
return true;
case android.R.id.home:
super.onBackPressed();
@ -443,7 +454,7 @@ public class MusicControllerActivity extends AbsFabActivity {
case R.id.action_details:
String songFilePath = SongFilePathLoader.getSongFilePath(this, song.id);
File songFile = new File(songFilePath);
SongDetailDialogHelper.getDialog(this, songFile).show();
SongDetailDialog.create(songFile).show(getSupportFragmentManager(), "SONG_DETAIL");
return true;
case R.id.action_go_to_album:
NavigationUtil.goToAlbum(this, song.albumId, getSharedViewsWithFab(null));
@ -480,4 +491,4 @@ public class MusicControllerActivity extends AbsFabActivity {
super.onDestroy();
App.bus.unregister(this);
}
}
}

View file

@ -1,5 +1,7 @@
package com.kabouzeid.gramophone.ui.activities;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
@ -18,25 +20,34 @@ import com.kabouzeid.gramophone.model.PlaylistSong;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PlaylistsUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
import java.util.List;
import java.util.ArrayList;
public class PlaylistDetailActivity extends AbsFabActivity {
public static final String TAG = PlaylistDetailActivity.class.getSimpleName();
private RecyclerView recyclerView;
private Playlist playlist;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
setUpTranslucence(false, false);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_playlist_detail);
getIntentExtras();
setUpToolBar();
final int primary = PreferenceUtils.getInstance(this).getThemeColorPrimary();
final int primaryDark = PreferenceUtils.getInstance(this).getThemeColorPrimaryDarker();
if (Util.hasLollipopSDK()) {
getWindow().setStatusBarColor(primaryDark);
getWindow().setNavigationBarColor(primaryDark);
}
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
final List<PlaylistSong> songs = PlaylistSongLoader.getPlaylistSongList(this, playlist.id);
getIntentExtras();
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
final ArrayList<PlaylistSong> songs = PlaylistSongLoader.getPlaylistSongList(this, playlist.id);
final PlaylistSongAdapter adapter = new PlaylistSongAdapter(this, songs);
recyclerView.setLayoutManager(new GridLayoutManager(this, 1));
recyclerView.setAdapter(adapter);
@ -57,6 +68,12 @@ public class PlaylistDetailActivity extends AbsFabActivity {
recyclerView.addItemDecoration(dragSortRecycler);
recyclerView.addOnItemTouchListener(dragSortRecycler);
recyclerView.setOnScrollListener(dragSortRecycler.getScrollListener());
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setBackgroundColor(primary);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle(playlist.name);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
private void getIntentExtras() {
@ -68,12 +85,6 @@ public class PlaylistDetailActivity extends AbsFabActivity {
}
}
private void setUpToolBar() {
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
getSupportActionBar().setTitle(playlist.name);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public String getTag() {
return TAG;

View file

@ -29,6 +29,7 @@ import com.kabouzeid.gramophone.model.SearchEntry;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
import java.util.ArrayList;
@ -48,9 +49,11 @@ public class SearchActivity extends AbsBaseActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
final int primary = PreferenceUtils.getInstance(this).getThemeColorPrimary();
final int primaryDark = PreferenceUtils.getInstance(this).getThemeColorPrimaryDarker();
if (Util.hasLollipopSDK()) {
getWindow().setStatusBarColor(Util.resolveColor(this, R.attr.colorPrimaryDark));
getWindow().setNavigationBarColor(Util.resolveColor(this, R.attr.colorPrimaryDark));
getWindow().setStatusBarColor(primaryDark);
getWindow().setNavigationBarColor(primaryDark);
}
listView = (ListView) findViewById(R.id.list);
@ -60,7 +63,7 @@ public class SearchActivity extends AbsBaseActivity {
Object item = parent.getItemAtPosition(position);
if (item instanceof SearchEntry) {
if (item instanceof Song) {
List<Song> playList = new ArrayList<>();
ArrayList<Song> playList = new ArrayList<>();
playList.add((Song) item);
MusicPlayerRemote.openQueue(playList, 0, true);
} else if (item instanceof Album) {
@ -95,7 +98,9 @@ public class SearchActivity extends AbsBaseActivity {
}
});
setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setBackgroundColor(primary);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@ -164,10 +169,7 @@ public class SearchActivity extends AbsBaseActivity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
return id == R.id.action_settings || super.onOptionsItemSelected(item);
}
private void search(String query) {
@ -201,7 +203,7 @@ public class SearchActivity extends AbsBaseActivity {
public static class LabelEntry implements SearchEntry {
String title;
final String title;
String label;
public LabelEntry(String label) {

View file

@ -4,6 +4,7 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.media.audiofx.AudioEffect;
import android.os.Build;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
@ -12,23 +13,46 @@ import android.preference.PreferenceManager;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ColorChooserDialog;
import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.prefs.ColorChooserPreference;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
public class SettingsActivity extends AbsBaseActivity {
public class SettingsActivity extends AbsBaseActivity implements ColorChooserDialog.ColorCallback {
public static final String TAG = SettingsActivity.class.getSimpleName();
private Toolbar mToolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_preferences);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mToolbar.setBackgroundColor(PreferenceUtils.getInstance(this).getThemeColorPrimary());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
getWindow().setStatusBarColor(PreferenceUtils.getInstance(this).getThemeColorPrimaryDarker());
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getFragmentManager().beginTransaction().replace(R.id.content_frame, new SettingsFragment()).commit();
if (savedInstanceState == null)
getFragmentManager().beginTransaction().replace(R.id.content_frame, new SettingsFragment()).commit();
}
@Override
public void onColorSelection(int title, int color) {
if (title == R.string.primary_color) {
PreferenceUtils.getInstance(this).setThemeColorPrimary(color);
App.bus.post(new UIPreferenceChangedEvent(UIPreferenceChangedEvent.THEME_CHANGED, color));
} else if (title == R.string.accent_color) {
PreferenceUtils.getInstance(this).setThemeColorAccent(color);
App.bus.post(new UIPreferenceChangedEvent(UIPreferenceChangedEvent.THEME_CHANGED, color));
}
recreate();
}
public static class SettingsFragment extends PreferenceFragment {
@ -62,6 +86,30 @@ public class SettingsActivity extends AbsBaseActivity {
}
});
ColorChooserPreference primaryColor = (ColorChooserPreference) findPreference("primary_color");
primaryColor.setColor(PreferenceUtils.getInstance(getActivity()).getThemeColorPrimary(),
DialogUtils.resolveColor(getActivity(), android.R.attr.textColorPrimary));
primaryColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
new ColorChooserDialog().show(getActivity(), preference.getTitleRes(),
PreferenceUtils.getInstance(getActivity()).getThemeColorPrimary());
return true;
}
});
ColorChooserPreference accentColor = (ColorChooserPreference) findPreference("accent_color");
accentColor.setColor(PreferenceUtils.getInstance(getActivity()).getThemeColorAccent(),
DialogUtils.resolveColor(getActivity(), android.R.attr.textColorPrimary));
accentColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
new ColorChooserDialog().show(getActivity(), preference.getTitleRes(),
PreferenceUtils.getInstance(getActivity()).getThemeColorAccent());
return true;
}
});
findPreference("transparent_toolbar").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object o) {

View file

@ -3,24 +3,22 @@ package com.kabouzeid.gramophone.ui.activities.base;
import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import com.crashlytics.android.Crashlytics;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
import com.squareup.otto.Subscribe;
/**
* Created by karim on 20.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsBaseActivity extends ActionBarActivity implements KabViewsDisableAble {
public abstract class AbsBaseActivity extends ThemeBaseActivity implements KabViewsDisableAble {
private App app;
private boolean areViewsEnabled;
private Object uiPreferenceChangeListener = new Object() {
private final Object uiPreferenceChangeListener = new Object() {
@Subscribe
public void onUIPreferenceChangedEvent(UIPreferenceChangedEvent event) {
AbsBaseActivity.this.onUIPreferenceChangedEvent(event);
@ -30,7 +28,6 @@ public abstract class AbsBaseActivity extends ActionBarActivity implements KabVi
@Override
protected void onCreate(Bundle savedInstanceState) {
Crashlytics.setString(AppKeys.CL_CURRENT_ACTIVITY, getTag());
setTheme(PreferenceUtils.getInstance(this).getGeneralTheme());
super.onCreate(savedInstanceState);
try {
App.bus.register(uiPreferenceChangeListener);
@ -45,7 +42,7 @@ public abstract class AbsBaseActivity extends ActionBarActivity implements KabVi
return app;
}
public abstract String getTag();
protected abstract String getTag();
@Override
protected void onResume() {
@ -53,15 +50,6 @@ public abstract class AbsBaseActivity extends ActionBarActivity implements KabVi
enableViews();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void onUIPreferenceChangedEvent(UIPreferenceChangedEvent event) {
switch (event.getAction()) {
case UIPreferenceChangedEvent.THEME_CHANGED:
recreate();
break;
}
}
@Override
public void enableViews() {
areViewsEnabled = true;
@ -77,14 +65,12 @@ public abstract class AbsBaseActivity extends ActionBarActivity implements KabVi
return areViewsEnabled;
}
protected void setUpTranslucence(boolean statusBarTranslucent, boolean navigationBarTranslucent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Util.setStatusBarTranslucent(getWindow(), statusBarTranslucent);
if (Util.isInPortraitMode(this) || Util.isTablet(this)) {
Util.setNavBarTranslucent(getWindow(), navigationBarTranslucent);
} else {
Util.setNavBarTranslucent(getWindow(), false);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
protected void onUIPreferenceChangedEvent(UIPreferenceChangedEvent event) {
switch (event.getAction()) {
case UIPreferenceChangedEvent.THEME_CHANGED:
recreate();
break;
}
}

View file

@ -1,5 +1,7 @@
package com.kabouzeid.gramophone.ui.activities.base;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.support.v4.util.Pair;
import android.util.Log;
@ -8,8 +10,10 @@ import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.ColorChooserDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.misc.SmallOnGestureListener;
import com.kabouzeid.gramophone.model.MusicRemoteEvent;
@ -19,14 +23,14 @@ import com.melnykov.fab.FloatingActionButton;
import com.squareup.otto.Subscribe;
/**
* Created by karim on 22.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsFabActivity extends AbsBaseActivity {
public static final String TAG = AbsFabActivity.class.getSimpleName();
private FloatingActionButton fab;
private PlayPauseDrawable playPauseDrawable;
private Object busEventListener = new Object() {
private final Object busEventListener = new Object() {
@Subscribe
public void onBusEvent(MusicRemoteEvent event) {
onMusicRemoteEvent(event);
@ -49,6 +53,17 @@ public abstract class AbsFabActivity extends AbsBaseActivity {
}
getFab().setImageDrawable(playPauseDrawable);
final int accentColor = ThemeSingleton.get().positiveColor;
if (accentColor == Color.WHITE) {
getFab().setColorNormal(accentColor);
getFab().setColorPressed(ColorChooserDialog.shiftColorDown(accentColor));
getFab().getDrawable().setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
} else {
getFab().setColorNormal(accentColor);
getFab().setColorPressed(ColorChooserDialog.shiftColorUp(accentColor));
getFab().getDrawable().clearColorFilter();
}
updateFabState();
final GestureDetector gestureDetector = new GestureDetector(this, new SmallOnGestureListener() {
@Override
@ -111,9 +126,7 @@ public abstract class AbsFabActivity extends AbsBaseActivity {
Pair[] sharedViewsWithFab;
if (sharedViews != null) {
sharedViewsWithFab = new Pair[sharedViews.length + 1];
for (int i = 0; i < sharedViews.length; i++) {
sharedViewsWithFab[i] = sharedViews[i];
}
System.arraycopy(sharedViews, 0, sharedViewsWithFab, 0, sharedViews.length);
} else {
sharedViewsWithFab = new Pair[1];
}
@ -134,7 +147,7 @@ public abstract class AbsFabActivity extends AbsBaseActivity {
}
}
public void onMusicRemoteEvent(MusicRemoteEvent event) {
protected void onMusicRemoteEvent(MusicRemoteEvent event) {
switch (event.getAction()) {
case MusicRemoteEvent.PLAY:
setFabPause();

View file

@ -0,0 +1,76 @@
package com.kabouzeid.gramophone.ui.activities.base;
import android.app.ActivityManager;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import com.afollestad.materialdialogs.ThemeSingleton;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
/**
* @author Aidan Follestad (afollestad)
*/
public abstract class ThemeBaseActivity extends ActionBarActivity implements KabViewsDisableAble {
private boolean mLastDarkTheme;
private int mLastPrimary;
private int mLastAccent;
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(PreferenceUtils.getInstance(this).getGeneralTheme());
super.onCreate(savedInstanceState);
setupTheme();
}
private void setupTheme() {
// Persist current values so the Activity knows if they change
mLastDarkTheme = PreferenceUtils.getInstance(this).getGeneralTheme() == 1;
mLastPrimary = PreferenceUtils.getInstance(this).getThemeColorPrimary();
mLastAccent = PreferenceUtils.getInstance(this).getThemeColorAccent();
// Accent colors in dialogs, and any dynamic views that pull from this singleton
ThemeSingleton.get().positiveColor = mLastAccent;
ThemeSingleton.get().negativeColor = ThemeSingleton.get().positiveColor;
ThemeSingleton.get().neutralColor = ThemeSingleton.get().positiveColor;
ThemeSingleton.get().widgetColor = ThemeSingleton.get().positiveColor;
// Dark theme
ThemeSingleton.get().darkTheme = mLastDarkTheme;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// Sets color of entry in the system recents page
ActivityManager.TaskDescription td = new ActivityManager.TaskDescription(
getString(R.string.app_name),
BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher),
mLastPrimary);
setTaskDescription(td);
}
}
@Override
protected void onResume() {
super.onResume();
if (mLastDarkTheme != (PreferenceUtils.getInstance(this).getGeneralTheme() == 1) ||
mLastPrimary != PreferenceUtils.getInstance(this).getThemeColorPrimary() ||
mLastAccent != PreferenceUtils.getInstance(this).getThemeColorAccent()) {
// Theme colors changed, recreate the Activity
recreate();
}
}
protected void setUpTranslucence(boolean statusBarTranslucent, boolean navigationBarTranslucent) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Util.setStatusBarTranslucent(getWindow(), statusBarTranslucent);
if (Util.isInPortraitMode(this) || Util.isTablet(this)) {
Util.setNavBarTranslucent(getWindow(), navigationBarTranslucent);
} else {
Util.setNavBarTranslucent(getWindow(), false);
}
}
}
}

View file

@ -17,6 +17,7 @@ import android.view.animation.OvershootInterpolator;
import android.widget.ImageView;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.github.ksoichiro.android.observablescrollview.ObservableScrollView;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
@ -48,10 +49,11 @@ import java.util.List;
import java.util.Map;
/**
* Created by karim on 18.01.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsTagEditorActivity extends AbsBaseActivity {
public static final String TAG = AbsTagEditorActivity.class.getSimpleName();
private static final String TAG = AbsTagEditorActivity.class.getSimpleName();
private static final int REQUEST_CODE_SELECT_IMAGE = 1337;
private int id;
@ -64,7 +66,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
private Toolbar toolBar;
private ImageView image;
private View header;
private SmallObservableScrollViewCallbacks observableScrollViewCallbacks = new SmallObservableScrollViewCallbacks() {
private final SmallObservableScrollViewCallbacks observableScrollViewCallbacks = new SmallObservableScrollViewCallbacks() {
@Override
public void onScrollChanged(int scrollY, boolean b, boolean b2) {
float alpha;
@ -168,7 +170,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
protected abstract void deleteImage();
protected void setUpFab() {
private void setUpFab() {
ViewHelper.setScaleX(fab, 0);
ViewHelper.setScaleY(fab, 0);
fab.setEnabled(false);
@ -183,7 +185,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
protected abstract void save();
private void restoreStandardColors() {
final int vibrantColor = Util.resolveColor(this, R.attr.colorPrimary);
final int vibrantColor = DialogUtils.resolveColor(this, R.attr.colorPrimary);
paletteColorPrimary = vibrantColor;
observableScrollViewCallbacks.onScrollChanged(scrollView.getCurrentScrollY(), false, false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
@ -199,7 +201,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
}
}
protected void setUpToolBar() {
private void setUpToolBar() {
setSupportActionBar(toolBar);
getSupportActionBar().setTitle(getResources().getString(R.string.tag_editor));
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
@ -270,7 +272,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
final int vibrantColor = palette.getVibrantColor(Util.resolveColor(AbsTagEditorActivity.this, R.attr.default_bar_color));
final int vibrantColor = palette.getVibrantColor(DialogUtils.resolveColor(AbsTagEditorActivity.this, R.attr.default_bar_color));
paletteColorPrimary = vibrantColor;
observableScrollViewCallbacks.onScrollChanged(scrollView.getCurrentScrollY(), false, false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

View file

@ -34,7 +34,6 @@ import java.util.Map;
public class AlbumTagEditorActivity extends AbsTagEditorActivity implements TextWatcher {
public static final String TAG = AlbumTagEditorActivity.class.getSimpleName();
private File albumArtFile;
private Bitmap albumArtBitmap;
private boolean deleteAlbumArt;
@ -157,13 +156,9 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
fieldKeyValueMap.put(FieldKey.GENRE, genreName.getText().toString());
fieldKeyValueMap.put(FieldKey.YEAR, year.getText().toString());
try {
albumArtFile = MusicUtil.getAlbumArtFile(this, String.valueOf(getId()));
} catch (IOException e) {
Log.e(TAG, "error while creating albumArtFile", e);
}
File albumArtFile = MusicUtil.getAlbumArtFile(String.valueOf(getId()));
if (albumArtBitmap != null && albumArtFile != null) {
if (albumArtBitmap != null) {
try {
albumArtBitmap.compress(Bitmap.CompressFormat.PNG, 0, new FileOutputStream(albumArtFile));
artwork = ArtworkFactory.createArtworkFromFile(albumArtFile);

View file

@ -7,34 +7,34 @@ import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.NavigationDrawerItemAdapter;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.NavigationDrawerItem;
import com.nhaarman.listviewanimations.appearance.simple.AlphaInAnimationAdapter;
import java.util.ArrayList;
public class NavigationDrawerFragment extends Fragment {
public static final int NAVIGATION_DRAWER_HEADER = -1;
private static final String TAG = NavigationDrawerFragment.class.getSimpleName();
public static final int ABOUT_INDEX = 4;
public static final int SETTINGS_INDEX = 5;
private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
public View fragmentRootView;
private App app;
private NavigationDrawerCallbacks callbacks;
private NavigationDrawerItemAdapter drawerAdapter;
private DrawerLayout drawerLayout;
private ListView drawerListView;
private RecyclerView drawerRecyclerView;
private View fragmentContainerView;
private Button headerButton;
@ -91,7 +91,6 @@ public class NavigationDrawerFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
app = (App) getActivity().getApplicationContext();
userLearnedDrawer = PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean(AppKeys.SP_USER_LEARNED_DRAWER, false);
if (savedInstanceState != null) {
setItemChecked(savedInstanceState.getInt(STATE_SELECTED_POSITION));
@ -101,8 +100,7 @@ public class NavigationDrawerFragment extends Fragment {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
}
@ -115,7 +113,7 @@ public class NavigationDrawerFragment extends Fragment {
}
private void initViews() {
drawerListView = (ListView) fragmentRootView.findViewById(R.id.navigation_drawer_list);
drawerRecyclerView = (RecyclerView) fragmentRootView.findViewById(R.id.navigation_drawer_list);
final View drawerHeader = fragmentRootView.findViewById(R.id.header);
headerButton = (Button) drawerHeader.findViewById(R.id.header_clickable);
albumArt = (ImageView) drawerHeader.findViewById(R.id.album_art);
@ -139,23 +137,22 @@ public class NavigationDrawerFragment extends Fragment {
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.albums), R.drawable.ic_album_white_24dp));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.artists), R.drawable.ic_person_white_24dp));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.playlists), R.drawable.ic_queue_music_white_24dp));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.action_about), R.drawable.ic_drawer_about));
navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.action_settings), R.drawable.ic_drawer_settings));
drawerAdapter = new NavigationDrawerItemAdapter(getActivity(), R.id.navigation_drawer, navigationDrawerItems);
final AlphaInAnimationAdapter animationAdapter = new AlphaInAnimationAdapter(drawerAdapter);
animationAdapter.setAbsListView(drawerListView);
drawerListView.setAdapter(animationAdapter);
drawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
drawerAdapter = new NavigationDrawerItemAdapter(getActivity(), navigationDrawerItems, new NavigationDrawerItemAdapter.Callback() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
public void onItemSelected(int index) {
selectItem(index);
}
});
drawerRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
drawerRecyclerView.setAdapter(drawerAdapter);
}
private void selectItem(final int position) {
if (position != NAVIGATION_DRAWER_HEADER) {
if (position != NAVIGATION_DRAWER_HEADER &&
position != ABOUT_INDEX && position != SETTINGS_INDEX) {
setItemChecked(position);
if (drawerLayout != null) {
new Handler().postDelayed(new Runnable() {
@ -165,11 +162,9 @@ public class NavigationDrawerFragment extends Fragment {
}
}, 400);
}
}
if (callbacks != null) {
if (callbacks != null)
callbacks.onNavigationDrawerItemSelected(position);
}
}
@Override
@ -191,7 +186,7 @@ public class NavigationDrawerFragment extends Fragment {
}
}
public static interface NavigationDrawerCallbacks {
public interface NavigationDrawerCallbacks {
void onNavigationDrawerItemSelected(int position);
}
}

View file

@ -10,7 +10,7 @@ import com.kabouzeid.gramophone.ui.activities.MainActivity;
import com.kabouzeid.gramophone.util.Util;
/**
* Created by karim on 27.02.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMainActivityFragment extends Fragment implements KabViewsDisableAble {
private boolean areViewsEnabled;

View file

@ -9,7 +9,7 @@ import android.view.ViewGroup;
import com.kabouzeid.gramophone.R;
/**
* Created by karim on 30.03.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivityFragment {
public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName();

View file

@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.AlbumAdapter;
@ -10,7 +9,7 @@ import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
/**
* Created by karim on 22.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment {
public static final String TAG = AlbumViewFragment.class.getSimpleName();

View file

@ -1,6 +1,7 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
@ -8,6 +9,7 @@ import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.PlaylistAdapter;
public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
public static final String TAG = PlaylistViewFragment.class.getSimpleName();
@Override
@ -22,6 +24,6 @@ public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
@Override
protected RecyclerView.Adapter createAdapter() {
return new PlaylistAdapter(getActivity());
return new PlaylistAdapter((ActionBarActivity) getActivity());
}
}

View file

@ -1,5 +1,6 @@
package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
@ -7,9 +8,10 @@ import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.songadapter.SongAdapter;
/**
* Created by karim on 29.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class SongViewFragment extends AbsMainActivityRecyclerViewFragment {
public static final String TAG = SongViewFragment.class.getSimpleName();
@Override
@ -24,6 +26,6 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewFragment {
@Override
protected RecyclerView.Adapter createAdapter() {
return new SongAdapter(getActivity());
return new SongAdapter((ActionBarActivity) getActivity());
}
}

View file

@ -13,7 +13,6 @@ import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.util.Property;
import android.view.animation.DecelerateInterpolator;
@ -45,8 +44,8 @@ public class PlayPauseDrawable extends Drawable {
private float width;
private float height;
private float fallBackWidth;
private float fallBackHeight;
private final float fallBackWidth;
private final float fallBackHeight;
private float progress;
private boolean isPlay;

View file

@ -5,7 +5,7 @@ import android.util.AttributeSet;
import android.widget.ImageView;
/**
* Created by karim on 22.11.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class SquareImageView extends ImageView {
@ -23,6 +23,7 @@ public class SquareImageView extends ImageView {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//noinspection SuspiciousNameCombination
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}

View file

@ -1,7 +1,6 @@
package com.kabouzeid.gramophone.util;
import android.content.Context;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
@ -11,24 +10,19 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* Created by karim on 22.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public final class InternalStorageUtil {
private static final String TAG = InternalStorageUtil.class.getSimpleName();
public static synchronized void writeObject(final Context context, final String key, final Object object) throws IOException {
try {
String tempFileName = "TEMP_" + key;
FileOutputStream fos;
fos = context.openFileOutput(tempFileName, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(object);
oos.close();
fos.close();
renameAppFile(context, tempFileName, key);
} catch (IOException e) {
Log.e(TAG, "Writing Object to internal storage failed! Maybe the Object is not serializable?", e);
}
String tempFileName = "TEMP_" + key;
FileOutputStream fos;
fos = context.openFileOutput(tempFileName, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(object);
oos.close();
fos.close();
renameAppFile(context, tempFileName, key);
}
public static synchronized void renameAppFile(final Context context, String originalFileName, String newFileName) {

View file

@ -24,7 +24,7 @@ import java.io.IOException;
import java.util.List;
/**
* Created by karim on 29.12.14.
* @author Karim Abou Zeid (kabouzeid)
*/
public class MusicUtil {
public static final String TAG = MusicUtil.class.getSimpleName();
@ -78,12 +78,11 @@ public class MusicUtil {
contentResolver.delete(ContentUris.withAppendedId(localUri, albumId), null, null);
}
public static File getAlbumArtFile(Context context, String name)
throws IOException {
return new File(createAlbumArtDir(context), name + System.currentTimeMillis());
public static File getAlbumArtFile(String name) {
return new File(createAlbumArtDir(), name + System.currentTimeMillis());
}
public static File createAlbumArtDir(Context paramContext) {
public static File createAlbumArtDir() {
File albumArtDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "/.albumart/");
if (!albumArtDir.exists()) {
albumArtDir.mkdirs();
@ -141,7 +140,7 @@ public class MusicUtil {
cursor.moveToNext();
} catch (final SecurityException ex) {
cursor.moveToNext();
} catch (NullPointerException e){
} catch (NullPointerException e) {
Log.e("MusicUtils", "Failed to find file " + name);
}
}

View file

@ -7,12 +7,12 @@ import android.media.audiofx.AudioEffect;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.util.Pair;
import android.support.v7.app.ActionBarActivity;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.dialogs.PlayingQueueDialog;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.PlayingQueueDialogHelper;
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.ui.activities.AlbumDetailActivity;
@ -21,7 +21,7 @@ import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
import com.kabouzeid.gramophone.ui.activities.PlaylistDetailActivity;
/**
* Created by karim on 12.03.15.
* @author Karim Abou Zeid (kabouzeid)
*/
public class NavigationUtil {
public static void goToArtist(final Activity activity, final int artistId, final Pair[] sharedViews) {
@ -34,7 +34,7 @@ public class NavigationUtil {
final Intent intent = new Intent(activity, ArtistDetailActivity.class);
intent.putExtra(AppKeys.E_ARTIST, artistId);
if (sharedViews != null) {
ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
@SuppressWarnings("unchecked") ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
sharedViews
);
ActivityCompat.startActivity(activity, intent, optionsCompat.toBundle());
@ -54,7 +54,7 @@ public class NavigationUtil {
final Intent intent = new Intent(activity, AlbumDetailActivity.class);
intent.putExtra(AppKeys.E_ALBUM, albumId);
if (sharedViews != null) {
ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
@SuppressWarnings("unchecked") ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
sharedViews
);
ActivityCompat.startActivity(activity, intent, optionsCompat.toBundle());
@ -71,7 +71,7 @@ public class NavigationUtil {
final Intent intent = new Intent(activity, PlaylistDetailActivity.class);
intent.putExtra(AppKeys.E_PLAYLIST, playlistId);
if (sharedViews != null) {
ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
@SuppressWarnings("unchecked") ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
sharedViews
);
ActivityCompat.startActivity(activity, intent, optionsCompat.toBundle());
@ -92,7 +92,7 @@ public class NavigationUtil {
((KabViewsDisableAble) activity).disableViews();
Intent intent = new Intent(activity, MusicControllerActivity.class);
if (sharedViews != null) {
ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
@SuppressWarnings("unchecked") ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(activity,
sharedViews
);
ActivityCompat.startActivity(activity, intent, optionsCompat.toBundle());
@ -105,10 +105,10 @@ public class NavigationUtil {
}
}
public static void openPlayingQueueDialog(final Activity activity) {
final MaterialDialog materialDialog = PlayingQueueDialogHelper.getDialog(activity);
if (materialDialog != null) {
materialDialog.show();
public static void openPlayingQueueDialog(final ActionBarActivity activity) {
PlayingQueueDialog dialog = PlayingQueueDialog.create();
if (dialog != null) {
dialog.show(activity.getSupportFragmentManager(), "PLAY_QUEUE");
} else {
Toast.makeText(activity, activity.getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show();
}

Some files were not shown because too many files have changed in this diff Show more