Some bug fixes and grid size adjustable

This commit is contained in:
Karim Abou Zeid 2015-04-12 15:05:37 +02:00
commit c1a4185549
19 changed files with 236 additions and 88 deletions

View file

@ -23,8 +23,8 @@ android {
applicationId "com.kabouzeid.gramophone"
minSdkVersion 16
targetSdkVersion 22
versionCode 16
versionName "0.9.8b"
versionCode 17
versionName "0.9.7.1b"
}
compileOptions {
@ -60,7 +60,7 @@ dependencies {
compile 'com.melnykov:floatingactionbutton:1.3.0'
compile 'com.github.ksoichiro:android-observablescrollview:1.5.0'
compile 'com.mcxiaoke.volley:library:1.0.15'
compile 'com.squareup.picasso:picasso:2.5.0'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup:otto:1.3.6'
compile 'com.squareup.okhttp:okhttp:2.2.0'
compile 'asia.ivity.android:drag-sort-listview:1.0'

View file

@ -5,7 +5,6 @@
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<application

View file

@ -65,6 +65,11 @@ 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) {
MusicPlayerRemote.removeFromQueue(position);
notifyDataSetChanged();
return true;
}
return MenuItemClickHelper.handleSongMenuClick(activity, song, item);
}
});

View file

@ -19,6 +19,7 @@ import com.kabouzeid.gramophone.model.Song;
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.PlaylistsUtil;
import com.squareup.picasso.Picasso;
import java.util.List;
@ -89,6 +90,11 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter<PlaylistSongAdapte
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_delete_from_playlist:
int position = getAdapterPosition();
PlaylistsUtil.removeFromPlaylist(activity, dataSet.remove(position));
notifyItemRemoved(position);
return true;
case R.id.action_go_to_album:
Pair[] albumPairs = new Pair[]{
Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_cover))

View file

@ -12,9 +12,6 @@ import android.widget.Toast;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
import com.kabouzeid.gramophone.loader.ArtistSongLoader;
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.misc.AppKeys;
import com.kabouzeid.gramophone.model.MusicRemoteEvent;
@ -310,16 +307,16 @@ public class MusicPlayerRemote {
}
public static void playFile(Uri uri) {
if (musicService != null && uri != null) {
String filename;
String scheme = uri.getScheme();
if ("file".equals(scheme)) {
filename = uri.getPath();
} else {
filename = uri.toString();
}
//musicService.playFile(filename); //TODO
Toast.makeText(context, "This feature is not working yet", Toast.LENGTH_SHORT).show();
}
// if (musicService != null && uri != null) {
// String filename;
// String scheme = uri.getScheme();
// if ("file".equals(scheme)) {
// filename = uri.getPath();
// } else {
// filename = uri.toString();
// }
// }
//TODO
Toast.makeText(context, "Sorry, this feature is not available yet!", Toast.LENGTH_SHORT).show();
}
}

View file

@ -9,6 +9,7 @@ import java.io.Serializable;
* Created by karim on 23.11.14.
*/
public class Song implements Serializable, SearchEntry {
public int id;
public int albumId;
public int artistId;

View file

@ -74,7 +74,7 @@ public class ArtistJSONStore extends SQLiteOpenHelper {
public void removeItem(final String artistName) {
final SQLiteDatabase database = getReadableDatabase();
database.delete(ArtistJSONColumns.NAME, ArtistJSONColumns.ARTIST_NAME + " = ?", new String[]{
database.delete(ArtistJSONColumns.NAME, ArtistJSONColumns.ARTIST_NAME + "=?", new String[]{
artistName.trim().toLowerCase()
});

View file

@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.service;
import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentUris;
@ -20,7 +19,6 @@ import android.os.Binder;
import android.os.IBinder;
import android.os.PowerManager;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
@ -289,10 +287,11 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
registerEverything();
isPlayerPrepared = false;
player.reset();
player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
try {
Uri trackUri = getCurrentPositionTrackUri();
player.setDataSource(getApplicationContext(), trackUri);
currentSongId = getPlayingQueue().get(getPosition()).id;
currentSongId = playingQueue.get(getPosition()).id;
updateNotification();
MusicPlayerWidget.updateWidgets(this);
updateRemoteControlClient();
@ -300,6 +299,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
} catch (Exception e) {
Log.e("MUSIC SERVICE", "Error setting data source", e);
player.reset();
player = null;
Toast.makeText(getApplicationContext(), getResources().getString(R.string.unplayable_file), Toast.LENGTH_SHORT).show();
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP);
playingNotificationHelper.updatePlayState(false);
@ -397,7 +397,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
}
break;
case REPEAT_MODE_THIS:
if(force){
if (force) {
position = getPosition() + 1;
if (isLastTrack()) {
position = 0;
@ -440,6 +440,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
public boolean onError(MediaPlayer mp, int what, int extra) {
isPlayerPrepared = false;
player.reset();
player = null;
notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP);
return false;
}
@ -670,7 +671,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
}
break;
case REPEAT_MODE_THIS:
if(force){
if (force) {
position = getPosition() - 1;
if (position < 0) {
position = getPlayingQueue().size() - 1;

View file

@ -14,6 +14,7 @@ import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import com.astuetz.PagerSlidingTabStrip;
@ -32,6 +33,10 @@ import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent;
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
import com.kabouzeid.gramophone.ui.fragments.NavigationDrawerFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AlbumViewFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.ArtistViewFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.PlaylistViewFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.SongViewFragment;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
@ -226,13 +231,13 @@ public class MainActivity extends AbsFabActivity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
switch (currentPage) {
case 3:
getMenuInflater().inflate(R.menu.menu_playlists, menu);
break;
default:
getMenuInflater().inflate(R.menu.menu_main, menu);
break;
if (isAlbumPage()) {
getMenuInflater().inflate(R.menu.menu_albums, menu);
setUpGridMenu(menu);
} else if (isPlaylistPage()) {
getMenuInflater().inflate(R.menu.menu_playlists, menu);
} else {
getMenuInflater().inflate(R.menu.menu_main, menu);
}
restoreActionBar();
return true;
@ -250,6 +255,9 @@ public class MainActivity extends AbsFabActivity
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
if (handleGridSize(item)) return true;
int id = item.getItemId();
switch (id) {
case R.id.action_shuffle_all:
@ -363,4 +371,87 @@ public class MainActivity extends AbsFabActivity
}
return id;
}
private boolean isArtistPage() {
return viewPager.getCurrentItem() == PagerAdapter.MusicFragments.ARTIST.ordinal();
}
public ArtistViewFragment getArtistFragment() {
return (ArtistViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.ARTIST.ordinal());
}
private boolean isAlbumPage() {
return viewPager.getCurrentItem() == PagerAdapter.MusicFragments.ALBUM.ordinal();
}
public AlbumViewFragment getAlbumFragment() {
return (AlbumViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.ALBUM.ordinal());
}
private boolean isSongPage() {
return viewPager.getCurrentItem() == PagerAdapter.MusicFragments.SONG.ordinal();
}
public SongViewFragment getSongFragment() {
return (SongViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.SONG.ordinal());
}
private boolean isPlaylistPage() {
return viewPager.getCurrentItem() == PagerAdapter.MusicFragments.PLAYLIST.ordinal();
}
public PlaylistViewFragment getPlaylistFragment() {
return (PlaylistViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.PLAYLIST.ordinal());
}
private void setUpGridMenu(Menu menu) {
boolean isPortrait = Util.isInPortraitMode(this);
int columns = isPortrait ? PreferenceUtils.getInstance(this).getAlbumGridColumns() : PreferenceUtils.getInstance(this).getAlbumGridColumnsLand();
String title = isPortrait ? getResources().getString(R.string.action_grid_columns) : getResources().getString(R.string.action_grid_columns_land);
MenuItem gridSizeItem = menu.findItem(R.id.action_grid_columns);
gridSizeItem.setTitle(title);
SubMenu gridSizeMenu = gridSizeItem.getSubMenu();
gridSizeMenu.getItem(columns - 1).setChecked(true);
}
private boolean handleGridSize(MenuItem item) {
int size = -1;
switch (item.getItemId()) {
case R.id.gridSizeOne:
size = 1;
break;
case R.id.gridSizeTwo:
size = 2;
break;
case R.id.gridSizeThree:
size = 3;
break;
case R.id.gridSizeFour:
size = 4;
break;
case R.id.gridSizeFive:
size = 5;
break;
case R.id.gridSizeSix:
size = 6;
break;
}
if (size > 0) {
item.setChecked(true);
if (isAlbumPage()) {
getAlbumFragment().setColumns(size);
if (Util.isInPortraitMode(this)) {
PreferenceUtils.getInstance(this).setAlbumGridColumns(size);
} else {
PreferenceUtils.getInstance(this).setAlbumGridColumnsLand(size);
}
}
return true;
}
return false;
}
}

View file

@ -2,10 +2,7 @@ package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

View file

@ -2,9 +2,12 @@ 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;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.kabouzeid.gramophone.util.Util;
/**
* Created by karim on 22.11.14.
@ -12,6 +15,8 @@ import com.kabouzeid.gramophone.adapter.AlbumAdapter;
public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment {
public static final String TAG = AlbumViewFragment.class.getSimpleName();
private GridLayoutManager layoutManager;
@Override
protected int getLayoutResId() {
return R.layout.fragment_album_view;
@ -19,11 +24,18 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment {
@Override
protected RecyclerView.LayoutManager createLayoutManager() {
return new GridLayoutManager(getActivity(), getResources().getInteger(R.integer.grid_columns));
int columns = Util.isInPortraitMode(getActivity()) ? PreferenceUtils.getInstance(getActivity()).getAlbumGridColumns() : PreferenceUtils.getInstance(getActivity()).getAlbumGridColumnsLand();
layoutManager = new GridLayoutManager(getActivity(), columns);
return layoutManager;
}
@Override
protected RecyclerView.Adapter createAdapter() {
return new AlbumAdapter(getActivity());
}
public void setColumns(int columns) {
layoutManager.setSpanCount(columns);
layoutManager.requestLayout();
}
}

View file

@ -8,58 +8,26 @@ import com.kabouzeid.gramophone.R;
public final class PreferenceUtils {
/* Default start page (Album page) */
public static final int DEFAULT_PAGE = 1;
public static final String GENERAL_THEME = "general_theme";
/* Saves the last page the pager was on in {@link MainActivity} */
public static final String DEFAULT_START_PAGE = "default_start_page";
/* Saves the last page the pager was on in {@link MainActivity} */
public static final String LAST_START_PAGE = "last_start_page";
// Sort order for the artist list
public static final String ARTIST_SORT_ORDER = "artist_sort_order";
// Sort order for the artist song list
public static final String ARTIST_SONG_SORT_ORDER = "artist_song_sort_order";
// Sort order for the artist album list
public static final String ARTIST_ALBUM_SORT_ORDER = "artist_album_sort_order";
// Sort order for the album list
public static final String ALBUM_SORT_ORDER = "album_sort_order";
// Sort order for the album song list
public static final String ALBUM_SONG_SORT_ORDER = "album_song_sort_order";
// Sort order for the song list
public static final String SONG_SORT_ORDER = "song_sort_order";
// Key used to download images only on Wi-Fi
public static final String ONLY_ON_WIFI = "auto_download_artist_images";
// Key that gives permissions to download missing artist images
public static final String DOWNLOAD_MISSING_ARTIST_IMAGES = "auto_download_artist_images";
// Key used to en or disable palette
public static final String COLORED_ALBUM_FOOTERS = "colored_album_footers";
// Key used to en or disable the colored navigation bar
public static final String COLORED_NAVIGATION_BAR_ALBUM = "colored_navigation_bar_album";
// Key used to en or disable the colored navigation bar
public static final String COLORED_NAVIGATION_BAR_ARTIST = "colored_navigation_bar_artist";
// Key used to en or disable the colored navigation bar
public static final String COLORED_NAVIGATION_BAR_CURRENT_PLAYING = "colored_navigation_bar_current_playing_enabled";
// Key used to en or disable the colored navigation bar
public static final String PLAYBACK_CONTROLLER_BOX = "playback_controller_card";
/* Saves the last page the pager was on in {@link MainActivity} */
public static final String TRANSPARENT_TOOLBAR = "transparent_toolbar";
public static final String ALBUM_GRID_COLUMNS = "album_grid_columns";
public static final String ALBUM_GRID_COLUMNS_LAND = "album_grid_columns_land";
private static PreferenceUtils sInstance;
@ -77,8 +45,8 @@ public final class PreferenceUtils {
}
public int getGeneralTheme() {
int value = Integer.parseInt(mPreferences.getString(GENERAL_THEME, "1"));
switch (value){
int value = Integer.parseInt(mPreferences.getString(GENERAL_THEME, "1"));
switch (value) {
case 0:
return R.style.Theme_MaterialMusic_Light;
case 1:
@ -261,4 +229,24 @@ public final class PreferenceUtils {
public final String getSongSortOrder() {
return mPreferences.getString(SONG_SORT_ORDER, SortOrder.SongSortOrder.SONG_A_Z);
}
public void setAlbumGridColumns(final int value) {
final SharedPreferences.Editor editor = mPreferences.edit();
editor.putInt(ALBUM_GRID_COLUMNS, value);
editor.apply();
}
public final int getAlbumGridColumns() {
return mPreferences.getInt(ALBUM_GRID_COLUMNS, 2);
}
public void setAlbumGridColumnsLand(final int value) {
final SharedPreferences.Editor editor = mPreferences.edit();
editor.putInt(ALBUM_GRID_COLUMNS_LAND, value);
editor.apply();
}
public final int getAlbumGridColumnsLand() {
return mPreferences.getInt(ALBUM_GRID_COLUMNS_LAND, 3);
}
}

View file

@ -13,6 +13,5 @@
android:clipToPadding="false"
android:dividerHeight="0px"
android:divider="@null"
android:numColumns="@integer/grid_columns"
android:scrollbars="vertical"/>
</LinearLayout>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_current_playing"
android:icon="@drawable/ic_equalizer_white_24dp"
android:title="@string/action_current_playing"
app:showAsAction="always"/>
<item
android:id="@+id/action_search"
android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
android:title="@string/action_search"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_shuffle_all"
android:title="@string/shuffle_all"
app:showAsAction="never"/>
<item
android:id="@+id/action_playing_queue"
android:title="@string/action_playing_queue"
app:showAsAction="never"/>
<item
android:id="@+id/action_grid_columns"
android:title="@string/action_grid_columns">
<menu>
<group
android:id="@+id/gridSizeGroup"
android:checkableBehavior="single">
<item
android:id="@+id/gridSizeOne"
android:title="1"/>
<item
android:id="@+id/gridSizeTwo"
android:title="2"/>
<item
android:id="@+id/gridSizeThree"
android:title="3"/>
<item
android:id="@+id/gridSizeFour"
android:title="4"/>
<item
android:id="@+id/gridSizeFive"
android:title="5"/>
<item
android:id="@+id/gridSizeSix"
android:title="6"/>
</group>
</menu>
</item>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="@string/action_settings"
app:showAsAction="never"/>
<item
android:id="@+id/action_about"
android:orderInCategory="101"
android:title="@string/action_about"
app:showAsAction="never"/>
</menu>

View file

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="grid_columns">3</integer>
</resources>

View file

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="grid_columns">6</integer>
</resources>

View file

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="grid_columns">4</integer>
</resources>

View file

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="grid_columns">2</integer>
</resources>

View file

@ -79,6 +79,8 @@
<string name="inserted_titles_to_playlist_1">Inserted\u0020</string>
<string name="inserted_titles_to_playlist_2">\u0020titles to playlist\u0020</string>
<string name="action_new_playlist">New playlist</string>
<string name="action_grid_columns">Grid columns</string>
<string name="action_grid_columns_land">Grid columns (Land)</string>
<string name="cancel">Cancel</string>
<string name="created_playlist">Created playlist\u0020</string>
<string name="deleted_playlist">Deleted playlist\u0020</string>