From 7ce86afd74b2eac40c463ee0f0f2b172951bb5db Mon Sep 17 00:00:00 2001 From: Aidan Follestad Date: Thu, 16 Apr 2015 16:47:02 -0500 Subject: [PATCH] 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. --- app/build.gradle | 2 +- app/proguard-rules.pro | 6 +- app/src/main/AndroidManifest.xml | 46 ++- .../java/com/kabouzeid/gramophone/App.java | 6 +- .../gramophone/adapter/AlbumAdapter.java | 57 ++-- .../gramophone/adapter/ArtistAdapter.java | 12 +- .../adapter/ArtistAlbumAdapter.java | 16 +- .../adapter/NavigationDrawerItemAdapter.java | 125 ++++++-- .../gramophone/adapter/PagerAdapter.java | 9 +- .../adapter/PlayingQueueAdapter.java | 26 +- .../gramophone/adapter/PlaylistAdapter.java | 16 +- .../gramophone/adapter/SearchAdapter.java | 15 +- .../adapter/songadapter/AlbumSongAdapter.java | 33 +-- .../songadapter/ArtistSongAdapter.java | 19 +- .../songadapter/PlaylistSongAdapter.java | 25 +- .../adapter/songadapter/SongAdapter.java | 40 +-- .../appwidget/MusicPlayerWidget.java | 2 - .../comparator/AlbumAlphabeticComparator.java | 6 +- .../ArtistAlphabeticComparator.java | 2 +- .../comparator/SongAlphabeticComparator.java | 2 +- .../comparator/SongTrackNumberComparator.java | 2 +- .../gramophone/dialogs/AboutDialog.java | 50 ++++ .../dialogs/AddToPlaylistDialog.java | 65 ++++ .../dialogs/ColorChooserDialog.java | 203 +++++++++++++ .../dialogs/CreatePlaylistDialog.java | 62 ++++ .../dialogs/DeletePlaylistDialog.java | 49 +++ .../dialogs/PlayingQueueDialog.java | 78 +++++ .../dialogs/RenamePlaylistDialog.java | 44 +++ .../SongDetailDialog.java} | 31 +- .../helper/AboutDeveloperDialogHelper.java | 47 --- .../helper/AddToPlaylistDialogHelper.java | 49 --- .../helper/CreatePlaylistDialogHelper.java | 45 --- .../helper/DeletePlaylistDialogHelper.java | 33 --- .../helper/DeleteSongsDialogHelper.java | 5 +- .../helper/MenuItemClickHelper.java | 25 +- .../gramophone/helper/MusicPlayerRemote.java | 44 +-- .../helper/PlayingNotificationHelper.java | 5 +- .../helper/PlayingQueueDialogHelper.java | 57 ---- .../helper/RenamePlaylistDialogHelper.java | 32 -- .../gramophone/helper/ShuffleHelper.java | 3 +- .../interfaces/KabViewsDisableAble.java | 9 +- .../gramophone/lastfm/LastFMUtil.java | 6 +- .../album/LastFMAlbumImageUrlLoader.java | 8 +- .../lastfm/album/LastFMAlbumInfoUtil.java | 4 +- .../artist/LastFMArtistBiographyLoader.java | 6 +- .../artist/LastFMArtistImageUrlLoader.java | 6 +- .../lastfm/artist/LastFMArtistInfoUtil.java | 7 +- .../LastFMArtistThumbnailUrlLoader.java | 6 +- .../gramophone/loader/AlbumLoader.java | 6 +- .../gramophone/loader/AlbumSongLoader.java | 22 +- .../gramophone/loader/ArtistAlbumLoader.java | 2 +- .../gramophone/loader/ArtistLoader.java | 6 +- .../gramophone/loader/ArtistSongLoader.java | 17 +- .../gramophone/loader/PlaylistSongLoader.java | 5 +- .../gramophone/loader/SongFilePathLoader.java | 6 +- .../gramophone/loader/SongLoader.java | 8 +- .../kabouzeid/gramophone/misc/AppKeys.java | 2 +- .../gramophone/misc/DragSortRecycler.java | 29 +- .../misc/SmallAnimatorListener.java | 2 +- .../SmallObservableScrollViewCallbacks.java | 2 +- .../misc/SmallOnGestureListener.java | 2 +- .../misc/SmallTransitionListener.java | 2 +- .../com/kabouzeid/gramophone/model/Album.java | 12 +- .../kabouzeid/gramophone/model/Artist.java | 10 +- .../model/DataBaseChangedEvent.java | 4 +- .../gramophone/model/MusicRemoteEvent.java | 4 +- .../model/NavigationDrawerItem.java | 7 +- .../kabouzeid/gramophone/model/Playlist.java | 4 +- .../gramophone/model/PlaylistSong.java | 2 +- .../gramophone/model/SearchEntry.java | 8 +- .../com/kabouzeid/gramophone/model/Song.java | 16 +- .../model/UiPreferenceChangedEvent.java | 6 +- .../prefs/ColorChooserPreference.java | 56 ++++ .../prefs/DynamicPreferenceCategory.java | 39 +++ .../gramophone/provider/AlbumJSONStore.java | 6 +- .../gramophone/provider/ArtistJSONStore.java | 6 +- .../gramophone/service/MusicService.java | 15 +- .../ui/activities/AlbumDetailActivity.java | 36 ++- .../ui/activities/ArtistDetailActivity.java | 30 +- .../ui/activities/MainActivity.java | 44 ++- .../activities/MusicControllerActivity.java | 53 ++-- .../ui/activities/PlaylistDetailActivity.java | 35 ++- .../ui/activities/SearchActivity.java | 20 +- .../ui/activities/SettingsActivity.java | 56 +++- .../ui/activities/base/AbsBaseActivity.java | 36 +-- .../ui/activities/base/AbsFabActivity.java | 25 +- .../ui/activities/base/ThemeBaseActivity.java | 76 +++++ .../tageditor/AbsTagEditorActivity.java | 16 +- .../tageditor/AlbumTagEditorActivity.java | 9 +- .../fragments/NavigationDrawerFragment.java | 45 ++- .../AbsMainActivityFragment.java | 2 +- .../AbsMainActivityRecyclerViewFragment.java | 2 +- .../AlbumViewFragment.java | 3 +- .../PlaylistViewFragment.java | 4 +- .../SongViewFragment.java | 6 +- .../ui/widget/PlayPauseDrawable.java | 5 +- .../gramophone/ui/widget/SquareImageView.java | 3 +- .../gramophone/util/InternalStorageUtil.java | 24 +- .../kabouzeid/gramophone/util/MusicUtil.java | 11 +- .../gramophone/util/NavigationUtil.java | 22 +- .../gramophone/util/PlaylistsUtil.java | 10 +- .../gramophone/util/PreferenceUtils.java | 190 ++++++------ .../kabouzeid/gramophone/util/SortOrder.java | 72 ++--- .../com/kabouzeid/gramophone/util/Util.java | 161 +++++----- .../kabouzeid/gramophone/util/ViewUtil.java | 3 +- .../gramophone/views/CircleView.java | 105 +++++++ .../gramophone/views/DynamicCheckBox.java | 34 +++ app/src/main/res/drawable-hdpi/ic_check.png | Bin 0 -> 1085 bytes app/src/main/res/drawable-hdpi/ic_drawer.png | Bin 2829 -> 0 bytes .../res/drawable-hdpi/ic_drawer_about.png | Bin 0 -> 726 bytes .../res/drawable-hdpi/ic_drawer_settings.png | Bin 0 -> 591 bytes .../drawable-hdpi/ic_more_vert_black_24dp.png | Bin 214 -> 0 bytes .../ic_my_library_music_white_24dp.png | Bin 330 -> 0 bytes .../res/drawable-hdpi/ic_pause_white_24dp.png | Bin 188 -> 0 bytes .../ic_play_arrow_white_24dp.png | Bin 282 -> 0 bytes .../ic_queue_music_black_24dp.png | Bin 262 -> 0 bytes .../drawable-hdpi/ic_settings_white_24dp.png | Bin 561 -> 0 bytes app/src/main/res/drawable-mdpi/ic_check.png | Bin 0 -> 613 bytes app/src/main/res/drawable-mdpi/ic_drawer.png | Bin 2820 -> 0 bytes .../res/drawable-mdpi/ic_drawer_about.png | Bin 0 -> 451 bytes .../res/drawable-mdpi/ic_drawer_settings.png | Bin 0 -> 368 bytes .../drawable-mdpi/ic_more_vert_black_24dp.png | Bin 189 -> 0 bytes .../ic_my_library_music_white_24dp.png | Bin 262 -> 0 bytes .../res/drawable-mdpi/ic_pause_white_24dp.png | Bin 174 -> 0 bytes .../ic_play_arrow_white_24dp.png | Bin 257 -> 0 bytes .../ic_queue_music_black_24dp.png | Bin 214 -> 0 bytes .../drawable-mdpi/ic_settings_white_24dp.png | Bin 420 -> 0 bytes .../res/drawable-v21/list_ripple_selector.xml | 6 + .../list_ripple_selector_dark.xml | 6 + .../drawable-v21/notification_selector.xml | 4 +- .../res/drawable-v21/rect_ripple_selector.xml | 7 +- .../rect_ripple_selector_dark.xml | 7 +- .../main/res/drawable-v21/rect_selector.xml | 7 - .../res/drawable-v21/rect_selector_dark.xml | 7 - .../drawable-v21/round_ripple_selector.xml | 10 +- .../round_ripple_selector_dark.xml | 7 +- .../round_ripple_selector_mask.xml | 5 + .../main/res/drawable-v21/round_selector.xml | 7 - .../res/drawable-v21/round_selector_dark.xml | 7 - app/src/main/res/drawable-xhdpi/ic_check.png | Bin 0 -> 1324 bytes app/src/main/res/drawable-xhdpi/ic_drawer.png | Bin 2836 -> 0 bytes .../res/drawable-xhdpi/ic_drawer_about.png | Bin 0 -> 959 bytes .../res/drawable-xhdpi/ic_drawer_settings.png | Bin 0 -> 796 bytes .../ic_more_vert_black_24dp.png | Bin 239 -> 0 bytes .../ic_my_library_music_white_24dp.png | Bin 421 -> 0 bytes .../drawable-xhdpi/ic_pause_white_24dp.png | Bin 193 -> 0 bytes .../ic_play_arrow_white_24dp.png | Bin 318 -> 0 bytes .../ic_queue_music_black_24dp.png | Bin 281 -> 0 bytes .../drawable-xhdpi/ic_settings_white_24dp.png | Bin 737 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_check.png | Bin 0 -> 2219 bytes .../main/res/drawable-xxhdpi/ic_drawer.png | Bin 202 -> 0 bytes .../res/drawable-xxhdpi/ic_drawer_about.png | Bin 0 -> 1520 bytes .../drawable-xxhdpi/ic_drawer_settings.png | Bin 0 -> 1283 bytes .../ic_more_vert_black_24dp.png | Bin 296 -> 0 bytes .../ic_my_library_music_white_24dp.png | Bin 577 -> 0 bytes .../drawable-xxhdpi/ic_pause_white_24dp.png | Bin 215 -> 0 bytes .../ic_play_arrow_white_24dp.png | Bin 399 -> 0 bytes .../ic_queue_music_black_24dp.png | Bin 345 -> 0 bytes .../ic_settings_white_24dp.png | Bin 974 -> 0 bytes .../ic_more_vert_black_24dp.png | Bin 393 -> 0 bytes .../ic_my_library_music_white_24dp.png | Bin 739 -> 0 bytes .../drawable-xxxhdpi/ic_pause_white_24dp.png | Bin 256 -> 0 bytes .../ic_play_arrow_white_24dp.png | Bin 477 -> 0 bytes .../ic_queue_music_black_24dp.png | Bin 483 -> 0 bytes .../ic_settings_white_24dp.png | Bin 1273 -> 0 bytes app/src/main/res/drawable/list_activated.xml | 5 + .../main/res/drawable/list_activated_dark.xml | 5 + app/src/main/res/drawable/list_divider.xml | 25 -- .../main/res/drawable/list_item_activated.xml | 5 - .../res/drawable/list_item_activated_dark.xml | 5 - app/src/main/res/drawable/list_selector.xml | 10 +- .../main/res/drawable/list_selector_dark.xml | 10 +- app/src/main/res/drawable/rect_selected.xml | 2 +- .../main/res/drawable/rect_selected_dark.xml | 2 +- app/src/main/res/drawable/round_selected.xml | 8 +- .../main/res/drawable/round_selected_dark.xml | 8 +- app/src/main/res/drawable/round_selector.xml | 7 +- .../main/res/drawable/round_selector_dark.xml | 7 +- .../layout-land/activity_music_controller.xml | 86 +++--- .../res/layout-v21/notification_playing.xml | 132 ++++----- .../notification_playing_expanded.xml | 41 ++- .../main/res/layout/activity_album_detail.xml | 31 +- .../res/layout/activity_album_tag_editor.xml | 33 ++- .../res/layout/activity_artist_detail.xml | 33 ++- app/src/main/res/layout/activity_main.xml | 33 ++- .../res/layout/activity_music_controller.xml | 70 +++-- .../res/layout/activity_playlist_detail.xml | 19 +- .../main/res/layout/activity_preferences.xml | 5 +- app/src/main/res/layout/activity_search.xml | 10 +- .../res/layout/activity_song_tag_editor.xml | 42 +-- .../main/res/layout/artist_detail_header.xml | 10 +- .../main/res/layout/dialog_color_chooser.xml | 13 + .../main/res/layout/dialog_empty_frame.xml | 9 - .../main/res/layout/dialog_file_details.xml | 36 +-- app/src/main/res/layout/dialog_playlist.xml | 2 +- .../main/res/layout/fragment_album_view.xml | 3 +- .../main/res/layout/fragment_artist_view.xml | 3 +- app/src/main/res/layout/fragment_drawer.xml | 16 - .../res/layout/fragment_navigation_drawer.xml | 27 +- .../main/res/layout/fragment_place_holder.xml | 11 - .../res/layout/fragment_playlist_view.xml | 3 +- .../main/res/layout/fragment_recyclerview.xml | 8 - app/src/main/res/layout/fragment_songview.xml | 3 +- .../res/layout/griditem_color_chooser.xml | 4 + app/src/main/res/layout/item_grid_album.xml | 15 +- .../res/layout/item_grid_artist_album.xml | 22 +- .../main/res/layout/item_list_album_song.xml | 21 +- app/src/main/res/layout/item_list_artist.xml | 19 +- .../main/res/layout/item_list_artist_song.xml | 24 +- .../main/res/layout/item_list_playlist.xml | 25 +- .../res/layout/item_list_playlist_song.xml | 14 +- app/src/main/res/layout/item_list_search.xml | 20 +- app/src/main/res/layout/item_list_song.xml | 24 +- .../res/layout/item_navigation_drawer.xml | 64 ++-- .../main/res/layout/music_player_widget.xml | 28 +- .../main/res/layout/notification_playing.xml | 133 ++++----- .../layout/notification_playing_expanded.xml | 36 ++- .../res/layout/preference_category_custom.xml | 24 ++ app/src/main/res/layout/preference_custom.xml | 79 +++++ .../res/layout/preference_dynamiccheckbox.xml | 8 + app/src/main/res/layout/tab_indicator.xml | 26 -- app/src/main/res/menu/menu_album_detail.xml | 1 + app/src/main/res/menu/menu_albums.xml | 42 ++- app/src/main/res/menu/menu_artist_detail.xml | 1 + .../res/menu/menu_item_playing_queue_song.xml | 18 +- app/src/main/res/menu/menu_item_playlist.xml | 1 - .../main/res/menu/menu_item_playlist_song.xml | 20 +- app/src/main/res/menu/menu_item_song.xml | 18 +- app/src/main/res/menu/menu_main.xml | 11 - app/src/main/res/menu/menu_music_playing.xml | 1 + .../main/res/menu/menu_playlist_detail.xml | 17 +- app/src/main/res/menu/menu_playlists.xml | 26 +- app/src/main/res/menu/menu_search.xml | 8 +- app/src/main/res/values-de/strings.xml | 10 +- app/src/main/res/values-es-r419/strings.xml | 6 +- app/src/main/res/values-es-rES/strings.xml | 8 +- app/src/main/res/values-fr/strings.xml | 8 +- app/src/main/res/values-it/strings.xml | 4 +- app/src/main/res/values-nl/strings.xml | 10 +- app/src/main/res/values-pl/strings.xml | 11 +- app/src/main/res/values-pt-rPT/strings.xml | 10 +- app/src/main/res/values-ro/strings.xml | 8 +- app/src/main/res/values-ru/strings.xml | 10 +- app/src/main/res/values-sw600dp/dimens.xml | 1 - app/src/main/res/values-v14/dimens.xml | 10 - app/src/main/res/values-v21/colors.xml | 4 +- app/src/main/res/values-v21/fonts.xml | 7 + app/src/main/res/values-v21/integers.xml | 6 + app/src/main/res/values-v21/styles.xml | 9 +- app/src/main/res/values-w820dp/dimens.xml | 6 - app/src/main/res/values-zh-rCN/strings.xml | 4 +- app/src/main/res/values/arrays.xml | 52 ++++ app/src/main/res/values/attrs.xml | 31 +- app/src/main/res/values/colors.xml | 18 +- app/src/main/res/values/dimens.xml | 22 +- app/src/main/res/values/fonts.xml | 7 + app/src/main/res/values/integers.xml | 6 + app/src/main/res/values/materialcolors.xml | 278 +----------------- app/src/main/res/values/strings.xml | 22 +- app/src/main/res/values/styles.xml | 14 +- app/src/main/res/values/styles_parents.xml | 30 +- app/src/main/res/values/values.xml | 2 - app/src/main/res/xml/pref_audio.xml | 8 +- app/src/main/res/xml/pref_general.xml | 10 +- app/src/main/res/xml/pref_ui.xml | 41 ++- 265 files changed, 2866 insertions(+), 2305 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/dialogs/AboutDialog.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/dialogs/ColorChooserDialog.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/dialogs/CreatePlaylistDialog.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/dialogs/DeletePlaylistDialog.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/dialogs/PlayingQueueDialog.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/dialogs/RenamePlaylistDialog.java rename app/src/main/java/com/kabouzeid/gramophone/{helper/SongDetailDialogHelper.java => dialogs/SongDetailDialog.java} (81%) delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/helper/AboutDeveloperDialogHelper.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/helper/AddToPlaylistDialogHelper.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/helper/CreatePlaylistDialogHelper.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/helper/DeletePlaylistDialogHelper.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/helper/PlayingQueueDialogHelper.java delete mode 100644 app/src/main/java/com/kabouzeid/gramophone/helper/RenamePlaylistDialogHelper.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/prefs/DynamicPreferenceCategory.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/ThemeBaseActivity.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/views/CircleView.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/views/DynamicCheckBox.java create mode 100755 app/src/main/res/drawable-hdpi/ic_check.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_drawer.png create mode 100755 app/src/main/res/drawable-hdpi/ic_drawer_about.png create mode 100755 app/src/main/res/drawable-hdpi/ic_drawer_settings.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_more_vert_black_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_my_library_music_white_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_pause_white_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_play_arrow_white_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_queue_music_black_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png create mode 100755 app/src/main/res/drawable-mdpi/ic_check.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_drawer.png create mode 100755 app/src/main/res/drawable-mdpi/ic_drawer_about.png create mode 100755 app/src/main/res/drawable-mdpi/ic_drawer_settings.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_more_vert_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_my_library_music_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_pause_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_queue_music_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_settings_white_24dp.png create mode 100644 app/src/main/res/drawable-v21/list_ripple_selector.xml create mode 100644 app/src/main/res/drawable-v21/list_ripple_selector_dark.xml delete mode 100644 app/src/main/res/drawable-v21/rect_selector.xml delete mode 100644 app/src/main/res/drawable-v21/rect_selector_dark.xml create mode 100644 app/src/main/res/drawable-v21/round_ripple_selector_mask.xml delete mode 100644 app/src/main/res/drawable-v21/round_selector.xml delete mode 100644 app/src/main/res/drawable-v21/round_selector_dark.xml create mode 100755 app/src/main/res/drawable-xhdpi/ic_check.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_drawer.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_drawer_about.png create mode 100755 app/src/main/res/drawable-xhdpi/ic_drawer_settings.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_more_vert_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_my_library_music_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_queue_music_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_check.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_drawer.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_drawer_about.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_drawer_settings.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_more_vert_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_my_library_music_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_queue_music_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_settings_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_more_vert_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_my_library_music_white_24dp.png delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_pause_white_24dp.png delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_queue_music_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png create mode 100644 app/src/main/res/drawable/list_activated.xml create mode 100644 app/src/main/res/drawable/list_activated_dark.xml delete mode 100644 app/src/main/res/drawable/list_divider.xml delete mode 100755 app/src/main/res/drawable/list_item_activated.xml delete mode 100755 app/src/main/res/drawable/list_item_activated_dark.xml create mode 100644 app/src/main/res/layout/dialog_color_chooser.xml delete mode 100644 app/src/main/res/layout/dialog_empty_frame.xml delete mode 100644 app/src/main/res/layout/fragment_drawer.xml delete mode 100644 app/src/main/res/layout/fragment_place_holder.xml delete mode 100644 app/src/main/res/layout/fragment_recyclerview.xml create mode 100644 app/src/main/res/layout/griditem_color_chooser.xml create mode 100644 app/src/main/res/layout/preference_category_custom.xml create mode 100644 app/src/main/res/layout/preference_custom.xml create mode 100644 app/src/main/res/layout/preference_dynamiccheckbox.xml delete mode 100644 app/src/main/res/layout/tab_indicator.xml delete mode 100644 app/src/main/res/values-v14/dimens.xml create mode 100644 app/src/main/res/values-v21/fonts.xml create mode 100644 app/src/main/res/values-v21/integers.xml delete mode 100644 app/src/main/res/values-w820dp/dimens.xml create mode 100644 app/src/main/res/values/arrays.xml create mode 100644 app/src/main/res/values/fonts.xml create mode 100644 app/src/main/res/values/integers.xml diff --git a/app/build.gradle b/app/build.gradle index 00799021..372998bd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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' diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 56446cc5..eaf91897 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -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 \ No newline at end of file +-ignorewarnings \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a2858ff7..b9117137 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + xmlns:tools="http://schemas.android.com/tools" + package="com.kabouzeid.gramophone"> @@ -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"> + + android:label="@string/app_name"> @@ -75,26 +79,24 @@ + - + + - - - - + + - + android:parentActivityName=".ui.activities.MainActivity" /> - + android:enabled="true" /> - + @@ -107,18 +109,15 @@ - + android:windowSoftInputMode="adjustResize" /> - + android:label="@string/title_activity_album_tag_editor" /> - + android:label="@string/title_activity_search" /> - + @@ -130,12 +129,11 @@ - + android:label="@string/title_activity_playlist_detail" /> - + android:label="@string/title_activity_settings" /> + diff --git a/app/src/main/java/com/kabouzeid/gramophone/App.java b/app/src/main/java/com/kabouzeid/gramophone/App.java index 688886d6..1d7eb3f4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/App.java +++ b/app/src/main/java/com/kabouzeid/gramophone/App.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java index bcc5d74d..f93d0867 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/AlbumAdapter.java @@ -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 { + public static final String TAG = AlbumAdapter.class.getSimpleName(); - private Activity activity; - private boolean usePalette; + private final Activity activity; + private final boolean usePalette; private List dataSet; @Override @@ -83,10 +82,10 @@ public class AlbumAdapter extends RecyclerView.Adapter } 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 )}; 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 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 } 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 break; } } - - @Subscribe - public void onUIChangeEvent(UIPreferenceChangedEvent event) { - switch (event.getAction()) { - case UIPreferenceChangedEvent.ALBUM_OVERVIEW_PALETTE_CHANGED: - usePalette = (boolean) event.getValue(); - notifyDataSetChanged(); - break; - } - } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAdapter.java index 1e40bd59..76ccb6da 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/ArtistAdapter.java @@ -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 { - protected Activity activity; + protected final Activity activity; protected List dataSet; public ArtistAdapter(Activity activity) { @@ -70,9 +70,9 @@ public class ArtistAdapter extends RecyclerView.Adapter { public static final String TAG = AlbumAdapter.class.getSimpleName(); @@ -28,9 +28,9 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter dataSet; - private int listMargin; + private final Activity activity; + private final List dataSet; + private final int listMargin; @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { @@ -72,9 +72,9 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter { - private int currentChecked = -1; +public class NavigationDrawerItemAdapter extends RecyclerView.Adapter implements View.OnClickListener { - public NavigationDrawerItemAdapter(Context context, int resource, List 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 mItems; + private final Callback mCallback; + + public interface Callback { + void onItemSelected(int index); + } + + public NavigationDrawerItemAdapter(Context context, ArrayList 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(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java index 7b7541f9..367d4ef9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java @@ -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(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 mFragmentClass; + private final Class mFragmentClass; MusicFragments(final Class fragmentClass) { mFragmentClass = fragmentClass; diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlayingQueueAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlayingQueueAdapter.java index 25db4d82..b0c06493 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlayingQueueAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlayingQueueAdapter.java @@ -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 { - private Activity activity; - public PlayingQueueAdapter(Activity activity, List playList) { + private final ActionBarActivity activity; + + public PlayingQueueAdapter(ActionBarActivity activity, ArrayList playList) { super(activity, R.layout.item_list_playlist_song, playList); this.activity = activity; } @@ -52,7 +44,7 @@ public class PlayingQueueAdapter extends ArrayAdapter { 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 { 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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java index 6cdeb3ac..3e53c4fb 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java @@ -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 { + public static final String TAG = PlaylistAdapter.class.getSimpleName(); - protected Activity activity; + protected final ActionBarActivity activity; protected List dataSet; - public PlaylistAdapter(Activity activity) { + public PlaylistAdapter(ActionBarActivity activity) { this.activity = activity; loadDataSet(); } @@ -57,8 +58,8 @@ public class PlaylistAdapter extends RecyclerView.Adapter{ - private Activity activity; +public class SearchAdapter extends ArrayAdapter { - public SearchAdapter(Activity activity, List objects) { + private final ActionBarActivity activity; + + public SearchAdapter(ActionBarActivity activity, List objects) { super(activity, R.layout.item_list_search, objects); this.activity = activity; } @@ -50,7 +51,7 @@ public class SearchAdapter extends ArrayAdapter{ 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); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java index 80c47131..44bfb681 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java @@ -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 { + public static final String TAG = AlbumSongAdapter.class.getSimpleName(); + protected final ActionBarActivity activity; + protected final ArrayList dataSet; - protected Activity activity; - protected List dataSet; - - public AlbumSongAdapter(Activity activity, List objects) { + public AlbumSongAdapter(ActionBarActivity activity, ArrayList objects) { this.activity = activity; dataSet = objects; } @@ -66,10 +55,10 @@ public class AlbumSongAdapter extends RecyclerView.Adapter { - private Activity activity; - public ArtistSongAdapter(Activity activity, List songs) { + private final ActionBarActivity activity; + + public ArtistSongAdapter(ActionBarActivity activity, List songs) { super(activity, R.layout.item_list_song, songs); this.activity = activity; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java index c1cadf60..943529d3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java @@ -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 { - public static final String TAG = AlbumSongAdapter.class.getSimpleName(); - protected Activity activity; - protected List dataSet; - public PlaylistSongAdapter(Activity activity, List objects) { + public static final String TAG = AlbumSongAdapter.class.getSimpleName(); + protected final ActionBarActivity activity; + protected final ArrayList dataSet; + + public PlaylistSongAdapter(ActionBarActivity activity, ArrayList objects) { this.activity = activity; dataSet = objects; } @@ -62,10 +64,10 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter) (List) dataSet, getAdapterPosition(), true); + //noinspection unchecked + MusicPlayerRemote.openQueue((ArrayList) (List) dataSet, getAdapterPosition(), true); } }); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java index 2d300093..66e6c3f9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java @@ -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 { + 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 dataSet; + protected final ActionBarActivity activity; + protected ArrayList dataSet; - public SongAdapter(Activity activity) { + public SongAdapter(ActionBarActivity activity) { this.activity = activity; loadDataSet(); } @@ -80,15 +73,14 @@ public class SongAdapter extends RecyclerView.Adapter { .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 { } 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); diff --git a/app/src/main/java/com/kabouzeid/gramophone/appwidget/MusicPlayerWidget.java b/app/src/main/java/com/kabouzeid/gramophone/appwidget/MusicPlayerWidget.java index 1c273797..ee5456e9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appwidget/MusicPlayerWidget.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appwidget/MusicPlayerWidget.java @@ -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; /** diff --git a/app/src/main/java/com/kabouzeid/gramophone/comparator/AlbumAlphabeticComparator.java b/app/src/main/java/com/kabouzeid/gramophone/comparator/AlbumAlphabeticComparator.java index 05fd6ac9..e5f4e6ef 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/comparator/AlbumAlphabeticComparator.java +++ b/app/src/main/java/com/kabouzeid/gramophone/comparator/AlbumAlphabeticComparator.java @@ -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 { +class AlbumAlphabeticComparator implements Comparator { @Override public int compare(Album lhs, Album rhs) { return lhs.title.trim().compareToIgnoreCase(rhs.title.trim()); } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/comparator/ArtistAlphabeticComparator.java b/app/src/main/java/com/kabouzeid/gramophone/comparator/ArtistAlphabeticComparator.java index 55209fe9..9cd5d389 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/comparator/ArtistAlphabeticComparator.java +++ b/app/src/main/java/com/kabouzeid/gramophone/comparator/ArtistAlphabeticComparator.java @@ -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 { @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/comparator/SongAlphabeticComparator.java b/app/src/main/java/com/kabouzeid/gramophone/comparator/SongAlphabeticComparator.java index c7ff301d..abf8aa3c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/comparator/SongAlphabeticComparator.java +++ b/app/src/main/java/com/kabouzeid/gramophone/comparator/SongAlphabeticComparator.java @@ -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 { @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/comparator/SongTrackNumberComparator.java b/app/src/main/java/com/kabouzeid/gramophone/comparator/SongTrackNumberComparator.java index 220e2baa..65b4ede5 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/comparator/SongTrackNumberComparator.java +++ b/app/src/main/java/com/kabouzeid/gramophone/comparator/SongTrackNumberComparator.java @@ -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 { @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/AboutDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/AboutDialog.java new file mode 100644 index 00000000..0cb1c79b --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/AboutDialog.java @@ -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; + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java new file mode 100644 index 00000000..3cbf8180 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java @@ -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 list = new ArrayList<>(); + list.add(song); + return create(list); + } + + public static AddToPlaylistDialog create(ArrayList 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 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 songs = (ArrayList) 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(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/ColorChooserDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/ColorChooserDialog.java new file mode 100644 index 00000000..9edd21df --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/ColorChooserDialog.java @@ -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"); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/CreatePlaylistDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/CreatePlaylistDialog.java new file mode 100644 index 00000000..aebac7bc --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/CreatePlaylistDialog.java @@ -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 list = new ArrayList<>(); + if (song != null) + list.add(song); + return create(list); + } + + public static CreatePlaylistDialog create(ArrayList 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 songs = (ArrayList) getArguments().getSerializable("songs"); + PlaylistsUtil.addToPlaylist(getActivity(), songs, playlistId); + } + } + } + }).build(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/DeletePlaylistDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/DeletePlaylistDialog.java new file mode 100644 index 00000000..aef080b3 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/DeletePlaylistDialog.java @@ -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(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/PlayingQueueDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/PlayingQueueDialog.java new file mode 100644 index 00000000..cc3364d0 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/PlayingQueueDialog.java @@ -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 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 playingQueue = (ArrayList) getArguments().getSerializable("queue"); + AddToPlaylistDialog.create(playingQueue).show(getActivity().getSupportFragmentManager(), "ADD_PLAYLIST"); + } + }) + .build(); + + //noinspection unchecked + final ArrayList playingQueue = (ArrayList) 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; + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/RenamePlaylistDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/RenamePlaylistDialog.java new file mode 100644 index 00000000..5f1b2c0f --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/RenamePlaylistDialog.java @@ -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(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/SongDetailDialogHelper.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/SongDetailDialog.java similarity index 81% rename from app/src/main/java/com/kabouzeid/gramophone/helper/SongDetailDialogHelper.java rename to app/src/main/java/com/kabouzeid/gramophone/dialogs/SongDetailDialog.java index fcffb921..de7dd4e3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/SongDetailDialogHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/SongDetailDialog.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/AboutDeveloperDialogHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/AboutDeveloperDialogHelper.java deleted file mode 100644 index 7a5fcf65..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/AboutDeveloperDialogHelper.java +++ /dev/null @@ -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; - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/AddToPlaylistDialogHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/AddToPlaylistDialogHelper.java deleted file mode 100644 index 4be6588b..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/AddToPlaylistDialogHelper.java +++ /dev/null @@ -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 tmpSong = new ArrayList<>(); - tmpSong.add(song); - return getDialog(context, tmpSong); - } - - public static MaterialDialog getDialog(final Context context, final List songs) { - final List 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(); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/CreatePlaylistDialogHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/CreatePlaylistDialogHelper.java deleted file mode 100644 index 9d5d6189..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/CreatePlaylistDialogHelper.java +++ /dev/null @@ -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 tmpSong = new ArrayList<>(); - tmpSong.add(song); - return getDialog(context, tmpSong); - } - - public static MaterialDialog getDialog(final Context context, final List 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) null); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/DeletePlaylistDialogHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/DeletePlaylistDialogHelper.java deleted file mode 100644 index d6f5bb44..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/DeletePlaylistDialogHelper.java +++ /dev/null @@ -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(); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/DeleteSongsDialogHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/DeleteSongsDialogHelper.java index 7a2bea98..753ce9af 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/DeleteSongsDialogHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/DeleteSongsDialogHelper.java @@ -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 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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MenuItemClickHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MenuItemClickHelper.java index bc266a4f..0bb8b966 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MenuItemClickHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MenuItemClickHelper.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java index 0285a113..ce057c49 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java @@ -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 playingQueue; - private static List restoredOriginalQueue; + private static ArrayList playingQueue; + private static ArrayList 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 playingQueue, final int startPosition, final boolean startPlaying) { + public static void openQueue(final ArrayList 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 getPlayingQueue() { + public static ArrayList 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 songs = SongLoader.getAllSongs(context); + ArrayList 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) InternalStorageUtil.readObject(context, AppKeys.IS_PLAYING_QUEUE); - List restoredOriginalQueue = (ArrayList) InternalStorageUtil.readObject(context, AppKeys.IS_ORIGINAL_PLAYING_QUEUE); + ArrayList restoredQueue = (ArrayList) InternalStorageUtil.readObject(context, AppKeys.IS_PLAYING_QUEUE); + ArrayList restoredOriginalQueue = (ArrayList) 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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java index ab2dc5d1..95c4d7f7 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingNotificationHelper.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingQueueDialogHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingQueueDialogHelper.java deleted file mode 100644 index 4110a133..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/PlayingQueueDialogHelper.java +++ /dev/null @@ -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 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; - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/RenamePlaylistDialogHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/RenamePlaylistDialogHelper.java deleted file mode 100644 index 71a122f5..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/RenamePlaylistDialogHelper.java +++ /dev/null @@ -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(); - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/ShuffleHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/ShuffleHelper.java index 865aaf98..28c92180 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/ShuffleHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/ShuffleHelper.java @@ -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 listToShuffle, final int current) { if (current >= 0) { Song song = listToShuffle.remove(current); diff --git a/app/src/main/java/com/kabouzeid/gramophone/interfaces/KabViewsDisableAble.java b/app/src/main/java/com/kabouzeid/gramophone/interfaces/KabViewsDisableAble.java index c8e795b4..ef585ac2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/interfaces/KabViewsDisableAble.java +++ b/app/src/main/java/com/kabouzeid/gramophone/interfaces/KabViewsDisableAble.java @@ -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(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/LastFMUtil.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/LastFMUtil.java index d829b4a3..ace2b1ac 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/lastfm/LastFMUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/lastfm/LastFMUtil.java @@ -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"; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumImageUrlLoader.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumImageUrlLoader.java index 8c576a3f..a2c01428 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumImageUrlLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumImageUrlLoader.java @@ -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(); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumInfoUtil.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumInfoUtil.java index a21b6ecd..32a05d33 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumInfoUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/lastfm/album/LastFMAlbumInfoUtil.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistBiographyLoader.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistBiographyLoader.java index a77c0ecf..c8f60f3d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistBiographyLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistBiographyLoader.java @@ -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); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistImageUrlLoader.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistImageUrlLoader.java index ff0ce65d..924f5115 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistImageUrlLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistImageUrlLoader.java @@ -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); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistInfoUtil.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistInfoUtil.java index 70d57e40..0feee8f4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistInfoUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistInfoUtil.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistThumbnailUrlLoader.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistThumbnailUrlLoader.java index bd08254c..94c201ec 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistThumbnailUrlLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/lastfm/artist/LastFMArtistThumbnailUrlLoader.java @@ -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); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java index 19106031..c187cce7 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumLoader.java @@ -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 */ diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java index 2e97ce35..be50d7d8 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/AlbumSongLoader.java @@ -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 getAlbumSongList(final Context context, final int albumId, Comparator comparator) { - List songs = getAlbumSongList(context, albumId); + public static ArrayList getAlbumSongList(final Context context, final int albumId, Comparator comparator) { + ArrayList songs = getAlbumSongList(context, albumId); Collections.sort(songs, comparator); return songs; } - public static List getAlbumSongList(final Context context, final int albumId) { + public static ArrayList getAlbumSongList(final Context context, final int albumId) { Cursor cursor = makeAlbumSongCursor(context, albumId); - List songs = new ArrayList<>(); + ArrayList 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()); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java index 15251046..7c729321 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistAlbumLoader.java @@ -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 getArtistAlbumList(final Context context, final int artistId) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistLoader.java index d2354f4f..29a2eb9e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistLoader.java @@ -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 */ diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistSongLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistSongLoader.java index c35158a7..f410c5e5 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistSongLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/ArtistSongLoader.java @@ -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 getArtistSongList(final Context context, final int artistId) { + + public static ArrayList getArtistSongList(final Context context, final int artistId) { Cursor cursor = makeArtistSongCursor(context, artistId); - List songs = new ArrayList<>(); + ArrayList 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()); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java index 33b13f79..5b201d99 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/PlaylistSongLoader.java @@ -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 getPlaylistSongList(final Context context, final int playlistID) { - List songs = new ArrayList<>(); + public static ArrayList getPlaylistSongList(final Context context, final int playlistID) { + ArrayList songs = new ArrayList<>(); Cursor cursor = makePlaylistSongCursor(context, playlistID); if (cursor != null && cursor.moveToFirst()) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/SongFilePathLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/SongFilePathLoader.java index 5952c654..6d15fc56 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/SongFilePathLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/SongFilePathLoader.java @@ -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 */ diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java b/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java index 01f809ad..9d48599a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/SongLoader.java @@ -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 getAllSongs(Context context) { + public static ArrayList getAllSongs(Context context) { Cursor cursor = makeSongCursor(context); - List songs = new ArrayList<>(); + ArrayList 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; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/misc/AppKeys.java b/app/src/main/java/com/kabouzeid/gramophone/misc/AppKeys.java index ec3a2053..31324b7e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/misc/AppKeys.java +++ b/app/src/main/java/com/kabouzeid/gramophone/misc/AppKeys.java @@ -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"; diff --git a/app/src/main/java/com/kabouzeid/gramophone/misc/DragSortRecycler.java b/app/src/main/java/com/kabouzeid/gramophone/misc/DragSortRecycler.java index 53897422..4c5bd829 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/misc/DragSortRecycler.java +++ b/app/src/main/java/com/kabouzeid/gramophone/misc/DragSortRecycler.java @@ -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); diff --git a/app/src/main/java/com/kabouzeid/gramophone/misc/SmallAnimatorListener.java b/app/src/main/java/com/kabouzeid/gramophone/misc/SmallAnimatorListener.java index 62d510e3..d53b8fd3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/misc/SmallAnimatorListener.java +++ b/app/src/main/java/com/kabouzeid/gramophone/misc/SmallAnimatorListener.java @@ -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 diff --git a/app/src/main/java/com/kabouzeid/gramophone/misc/SmallObservableScrollViewCallbacks.java b/app/src/main/java/com/kabouzeid/gramophone/misc/SmallObservableScrollViewCallbacks.java index 2639fa9d..c6c8a7bd 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/misc/SmallObservableScrollViewCallbacks.java +++ b/app/src/main/java/com/kabouzeid/gramophone/misc/SmallObservableScrollViewCallbacks.java @@ -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 diff --git a/app/src/main/java/com/kabouzeid/gramophone/misc/SmallOnGestureListener.java b/app/src/main/java/com/kabouzeid/gramophone/misc/SmallOnGestureListener.java index 4be14809..56fecb08 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/misc/SmallOnGestureListener.java +++ b/app/src/main/java/com/kabouzeid/gramophone/misc/SmallOnGestureListener.java @@ -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 diff --git a/app/src/main/java/com/kabouzeid/gramophone/misc/SmallTransitionListener.java b/app/src/main/java/com/kabouzeid/gramophone/misc/SmallTransitionListener.java index 29676799..8bbf47ea 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/misc/SmallTransitionListener.java +++ b/app/src/main/java/com/kabouzeid/gramophone/misc/SmallTransitionListener.java @@ -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 { diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java index f8cbeee4..e14cef61 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Artist.java b/app/src/main/java/com/kabouzeid/gramophone/model/Artist.java index e8f79208..3b275b48 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Artist.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Artist.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/DataBaseChangedEvent.java b/app/src/main/java/com/kabouzeid/gramophone/model/DataBaseChangedEvent.java index cad9c41a..deb80b1f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/DataBaseChangedEvent.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/DataBaseChangedEvent.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/MusicRemoteEvent.java b/app/src/main/java/com/kabouzeid/gramophone/model/MusicRemoteEvent.java index 630bcac9..782998c7 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/MusicRemoteEvent.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/MusicRemoteEvent.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/NavigationDrawerItem.java b/app/src/main/java/com/kabouzeid/gramophone/model/NavigationDrawerItem.java index 9568a595..2d90d8e3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/NavigationDrawerItem.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/NavigationDrawerItem.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Playlist.java b/app/src/main/java/com/kabouzeid/gramophone/model/Playlist.java index 26e13c01..8905c4cf 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Playlist.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Playlist.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java b/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java index dfdff80e..694d4e17 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/PlaylistSong.java @@ -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, diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/SearchEntry.java b/app/src/main/java/com/kabouzeid/gramophone/model/SearchEntry.java index e67d0887..c5a7ea86 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/SearchEntry.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/SearchEntry.java @@ -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); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Song.java b/app/src/main/java/com/kabouzeid/gramophone/model/Song.java index 8700ad1c..b7787f1b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Song.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Song.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/UiPreferenceChangedEvent.java b/app/src/main/java/com/kabouzeid/gramophone/model/UiPreferenceChangedEvent.java index d589289e..61635751 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/UiPreferenceChangedEvent.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/UiPreferenceChangedEvent.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java b/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java new file mode 100644 index 00000000..60b1d7f2 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java @@ -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); + } + } + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/prefs/DynamicPreferenceCategory.java b/app/src/main/java/com/kabouzeid/gramophone/prefs/DynamicPreferenceCategory.java new file mode 100644 index 00000000..40a2f976 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/prefs/DynamicPreferenceCategory.java @@ -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); + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/provider/AlbumJSONStore.java b/app/src/main/java/com/kabouzeid/gramophone/provider/AlbumJSONStore.java index 67419db0..6b08c117 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/provider/AlbumJSONStore.java +++ b/app/src/main/java/com/kabouzeid/gramophone/provider/AlbumJSONStore.java @@ -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 diff --git a/app/src/main/java/com/kabouzeid/gramophone/provider/ArtistJSONStore.java b/app/src/main/java/com/kabouzeid/gramophone/provider/ArtistJSONStore.java index c073a710..2d69c94d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/provider/ArtistJSONStore.java +++ b/app/src/main/java/com/kabouzeid/gramophone/provider/ArtistJSONStore.java @@ -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 diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index 939640a6..ca6ed1b7 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -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 playingQueue; - private List originalPlayingQueue; + private ArrayList playingQueue; + private ArrayList 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 getPlayingQueue() { + public ArrayList getPlayingQueue() { return playingQueue; } @@ -475,7 +474,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe savePosition(); } - public void openQueue(final List playingQueue, final int startPosition, final boolean startPlaying) { + public void openQueue(final ArrayList 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 originalPlayingQueue, final List playingQueue, int position) { + public void restorePreviousState(final ArrayList originalPlayingQueue, final ArrayList 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(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index e494d92c..488f4657 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -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 songs = AlbumSongLoader.getAlbumSongList(this, album.id, new SongTrackNumberComparator()); + final ArrayList 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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index f0ab157c..9e9409e2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -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 songs = ArtistSongLoader.getArtistSongList(this, artist.id); + final ArrayList 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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 6b0579dd..076a9713 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -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) (List) PlaylistSongLoader.getPlaylistSongList(this, id), position, true); + //noinspection unchecked + MusicPlayerRemote.openQueue((ArrayList) (List) 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, diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java index 2b74f663..ad4de18a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java @@ -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); } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java index 8478585d..5bb0a0e8 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java @@ -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 songs = PlaylistSongLoader.getPlaylistSongList(this, playlist.id); + getIntentExtras(); + + RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); + final ArrayList 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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java index 722c4732..6b95cd99 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java @@ -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 playList = new ArrayList<>(); + ArrayList 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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java index 0453237a..ce0ca23f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java index 739659c2..293bb12d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java @@ -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; } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java index 2c17478c..50937d46 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java @@ -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(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/ThemeBaseActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/ThemeBaseActivity.java new file mode 100644 index 00000000..ea3d0275 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/ThemeBaseActivity.java @@ -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); + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java index 686cce05..88e2986a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java index 537225e4..1b4203bf 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java @@ -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); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/NavigationDrawerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/NavigationDrawerFragment.java index ac5a0e0f..b2bb5568 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/NavigationDrawerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/NavigationDrawerFragment.java @@ -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); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java index 73c97abf..020dba8c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java index dd130829..8360c03b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java @@ -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(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java index 0c033fea..69cdb518 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java @@ -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(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java index 328f9c07..3e575549 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java @@ -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()); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java index 3ba8981d..94f1fd7e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java @@ -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()); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/widget/PlayPauseDrawable.java b/app/src/main/java/com/kabouzeid/gramophone/ui/widget/PlayPauseDrawable.java index dfb04926..1f478e4f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/widget/PlayPauseDrawable.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/widget/PlayPauseDrawable.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/widget/SquareImageView.java b/app/src/main/java/com/kabouzeid/gramophone/ui/widget/SquareImageView.java index 5726e3ac..88f2b896 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/widget/SquareImageView.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/widget/SquareImageView.java @@ -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); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/InternalStorageUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/InternalStorageUtil.java index b2dbb15b..66439ea0 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/InternalStorageUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/InternalStorageUtil.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java index 53b0e81d..628116a7 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java @@ -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); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java index cc311647..a8fc6e88 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java @@ -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(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java index fc9ea5a7..b8d0e90d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PlaylistsUtil.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; /** - * Created by karim on 16.03.15. + * @author Karim Abou Zeid (kabouzeid) */ public class PlaylistsUtil { public static final String MUSIC_ONLY_SELECTION = MediaStore.Audio.AudioColumns.IS_MUSIC + "=1" @@ -57,7 +57,7 @@ public class PlaylistsUtil { context.getContentResolver().delete(uri, null, null); } - public static void deletePlaylist(final Context context, final int playlistId) { + public static void deletePlaylist(final Context context, final long playlistId) { final Uri uri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI; String where = MediaStore.Audio.Playlists._ID + "=?"; String[] whereVal = {String.valueOf(playlistId)}; @@ -147,7 +147,6 @@ public class PlaylistsUtil { Cursor c = context.getContentResolver().query( MediaStore.Audio.Playlists.Members.getContentUri("external", playlistId), new String[]{BaseColumns._ID}, MUSIC_ONLY_SELECTION, null, null); - if (c != null) { int count = 0; if (c.moveToFirst()) { @@ -156,7 +155,6 @@ public class PlaylistsUtil { c.close(); return count; } - return 0; } @@ -165,7 +163,7 @@ public class PlaylistsUtil { playlistId, from, to); } - public static void renamePlaylist(final Context context, final int id, final String newName) { + public static void renamePlaylist(final Context context, final long id, final String newName) { ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Audio.PlaylistsColumns.NAME, newName); context.getContentResolver().update(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, @@ -175,7 +173,7 @@ public class PlaylistsUtil { App.bus.post(new DataBaseChangedEvent(DataBaseChangedEvent.PLAYLISTS_CHANGED)); } - public static String getNameForPlaylist(final Context context, final int id) { + public static String getNameForPlaylist(final Context context, final long id) { Cursor cursor = context.getContentResolver().query( MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Audio.PlaylistsColumns.NAME}, diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java index ef378a8a..1b13f77a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java @@ -1,10 +1,12 @@ package com.kabouzeid.gramophone.util; +import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.dialogs.ColorChooserDialog; public final class PreferenceUtils { @@ -19,7 +21,7 @@ public final class PreferenceUtils { public static final String ALBUM_SONG_SORT_ORDER = "album_song_sort_order"; public static final String SONG_SORT_ORDER = "song_sort_order"; public static final String ONLY_ON_WIFI = "auto_download_artist_images"; - public static final String DOWNLOAD_MISSING_ARTIST_IMAGES = "auto_download_artist_images"; + // public static final String DOWNLOAD_MISSING_ARTIST_IMAGES = "auto_download_artist_images"; public static final String COLORED_ALBUM_FOOTERS = "colored_album_footers"; public static final String COLORED_NAVIGATION_BAR_ALBUM = "colored_navigation_bar_album"; public static final String COLORED_NAVIGATION_BAR_ARTIST = "colored_navigation_bar_artist"; @@ -31,13 +33,15 @@ public final class PreferenceUtils { private static PreferenceUtils sInstance; + private final Context mContext; private final SharedPreferences mPreferences; public PreferenceUtils(final Context context) { + mContext = context; mPreferences = PreferenceManager.getDefaultSharedPreferences(context); } - public static final PreferenceUtils getInstance(final Context context) { + public static PreferenceUtils getInstance(final Context context) { if (sInstance == null) { sInstance = new PreferenceUtils(context.getApplicationContext()); } @@ -55,30 +59,52 @@ public final class PreferenceUtils { return R.style.Theme_MaterialMusic_Light; } - public void setGeneralTheme(int appTheme) { - int value = -1; - switch (appTheme) { - case R.style.Theme_MaterialMusic_Light: - value = 0; - break; - case R.style.Theme_MaterialMusic: - value = 1; - break; - } - if (value != 0 && value != 1) { - return; - } - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putString(GENERAL_THEME, String.valueOf(value)); - editor.apply(); + public int getThemeColorPrimary() { + return mPreferences.getInt("primary_color", mContext.getResources().getColor(R.color.indigo_500)); } - public void setDefaultStartPage(final int value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putString(DEFAULT_START_PAGE, String.valueOf(value)); - editor.apply(); + public int getThemeColorPrimaryDarker() { + return ColorChooserDialog.shiftColorDown(getThemeColorPrimary()); } + @SuppressLint("CommitPrefEdits") + public void setThemeColorPrimary(int color) { + mPreferences.edit().putInt("primary_color", color).commit(); + } + + public int getThemeColorAccent() { + return mPreferences.getInt("accent_color", mContext.getResources().getColor(R.color.pink_500)); + } + + @SuppressLint("CommitPrefEdits") + public void setThemeColorAccent(int color) { + mPreferences.edit().putInt("accent_color", color).commit(); + } + +// public void setGeneralTheme(int appTheme) { +// int value = -1; +// switch (appTheme) { +// case R.style.Theme_MaterialMusic_Light: +// value = 0; +// break; +// case R.style.Theme_MaterialMusic: +// value = 1; +// break; +// } +// if (value != 0 && value != 1) { +// return; +// } +// final SharedPreferences.Editor editor = mPreferences.edit(); +// editor.putString(GENERAL_THEME, String.valueOf(value)); +// editor.apply(); +// } +// +// public void setDefaultStartPage(final int value) { +// final SharedPreferences.Editor editor = mPreferences.edit(); +// editor.putString(DEFAULT_START_PAGE, String.valueOf(value)); +// editor.apply(); +// } + public final int getDefaultStartPage() { return Integer.parseInt(mPreferences.getString(DEFAULT_START_PAGE, "-1")); } @@ -97,81 +123,81 @@ public final class PreferenceUtils { return mPreferences.getBoolean(ONLY_ON_WIFI, false); } - public void setAutoDownloadOnlyOnWifi(final boolean value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(ONLY_ON_WIFI, value); - editor.apply(); - } +// public void setAutoDownloadOnlyOnWifi(final boolean value) { +// final SharedPreferences.Editor editor = mPreferences.edit(); +// editor.putBoolean(ONLY_ON_WIFI, value); +// editor.apply(); +// } public final boolean coloredAlbumFootersEnabled() { return mPreferences.getBoolean(COLORED_ALBUM_FOOTERS, true); } - public void setColoredAlbumFootersEnabled(final boolean value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(COLORED_ALBUM_FOOTERS, value); - editor.apply(); - } +// public void setColoredAlbumFootersEnabled(final boolean value) { +// final SharedPreferences.Editor editor = mPreferences.edit(); +// editor.putBoolean(COLORED_ALBUM_FOOTERS, value); +// editor.apply(); +// } public final boolean coloredNavigationBarAlbumEnabled() { return mPreferences.getBoolean(COLORED_NAVIGATION_BAR_ALBUM, true); } - public void setColoredNavigationBarAlbumEnabled(final boolean value) { + /*public void setColoredNavigationBarAlbumEnabled(final boolean value) { final SharedPreferences.Editor editor = mPreferences.edit(); editor.putBoolean(COLORED_NAVIGATION_BAR_ALBUM, value); editor.apply(); - } + }*/ public final boolean coloredNavigationBarArtistEnabled() { return mPreferences.getBoolean(COLORED_NAVIGATION_BAR_ARTIST, true); } - public void setColoredNavigationBarArtistEnabled(final boolean value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(COLORED_NAVIGATION_BAR_ARTIST, value); - editor.apply(); - } +// public void setColoredNavigationBarArtistEnabled(final boolean value) { +// final SharedPreferences.Editor editor = mPreferences.edit(); +// editor.putBoolean(COLORED_NAVIGATION_BAR_ARTIST, value); +// editor.apply(); +// } public final boolean coloredNavigationBarCurrentPlayingEnabled() { return mPreferences.getBoolean(COLORED_NAVIGATION_BAR_CURRENT_PLAYING, true); } - public void setColoredNavigationBarCurrentPlayingEnabled(final boolean value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(COLORED_NAVIGATION_BAR_CURRENT_PLAYING, value); - editor.apply(); - } +// public void setColoredNavigationBarCurrentPlayingEnabled(final boolean value) { +// final SharedPreferences.Editor editor = mPreferences.edit(); +// editor.putBoolean(COLORED_NAVIGATION_BAR_CURRENT_PLAYING, value); +// editor.apply(); +// } public final boolean playbackControllerBoxEnabled() { return mPreferences.getBoolean(PLAYBACK_CONTROLLER_BOX, false); } - public void setPlaybackControllerBoxEnabled(final boolean value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(PLAYBACK_CONTROLLER_BOX, value); - editor.apply(); - } +// public void setPlaybackControllerBoxEnabled(final boolean value) { +// final SharedPreferences.Editor editor = mPreferences.edit(); +// editor.putBoolean(PLAYBACK_CONTROLLER_BOX, value); +// editor.apply(); +// } public final boolean transparentToolbar() { return mPreferences.getBoolean(TRANSPARENT_TOOLBAR, false); } - public void setTransparentToolbar(final boolean value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(TRANSPARENT_TOOLBAR, value); - editor.apply(); - } +// public void setTransparentToolbar(final boolean value) { +// final SharedPreferences.Editor editor = mPreferences.edit(); +// editor.putBoolean(TRANSPARENT_TOOLBAR, value); +// editor.apply(); +// } - public final boolean downloadMissingArtistImages() { - return mPreferences.getBoolean(DOWNLOAD_MISSING_ARTIST_IMAGES, true); - } - - public void setDownloadMissingArtistImages(final boolean value) { - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(DOWNLOAD_MISSING_ARTIST_IMAGES, value); - editor.apply(); - } +// public final boolean downloadMissingArtistImages() { +// return mPreferences.getBoolean(DOWNLOAD_MISSING_ARTIST_IMAGES, true); +// } +// +// public void setDownloadMissingArtistImages(final boolean value) { +// final SharedPreferences.Editor editor = mPreferences.edit(); +// editor.putBoolean(DOWNLOAD_MISSING_ARTIST_IMAGES, value); +// editor.apply(); +// } private void setSortOrder(final String key, final String value) { final SharedPreferences.Editor editor = mPreferences.edit(); @@ -179,52 +205,52 @@ public final class PreferenceUtils { editor.apply(); } - public void setArtistSortOrder(final String value) { - setSortOrder(ARTIST_SORT_ORDER, value); - } - + // public void setArtistSortOrder(final String value) { +// setSortOrder(ARTIST_SORT_ORDER, value); +// } +// public final String getArtistSortOrder() { return mPreferences.getString(ARTIST_SORT_ORDER, SortOrder.ArtistSortOrder.ARTIST_A_Z); } - public void setArtistSongSortOrder(final String value) { - setSortOrder(ARTIST_SONG_SORT_ORDER, value); - } +// public void setArtistSongSortOrder(final String value) { +// setSortOrder(ARTIST_SONG_SORT_ORDER, value); +// } public final String getArtistSongSortOrder() { return mPreferences.getString(ARTIST_SONG_SORT_ORDER, SortOrder.ArtistSongSortOrder.SONG_A_Z); } - public void setArtistAlbumSortOrder(final String value) { - setSortOrder(ARTIST_ALBUM_SORT_ORDER, value); - } +// public void setArtistAlbumSortOrder(final String value) { +// setSortOrder(ARTIST_ALBUM_SORT_ORDER, value); +// } public final String getArtistAlbumSortOrder() { return mPreferences.getString(ARTIST_ALBUM_SORT_ORDER, SortOrder.ArtistAlbumSortOrder.ALBUM_A_Z); } - public void setAlbumSortOrder(final String value) { - setSortOrder(ALBUM_SORT_ORDER, value); - } +// public void setAlbumSortOrder(final String value) { +// setSortOrder(ALBUM_SORT_ORDER, value); +// } public final String getAlbumSortOrder() { return mPreferences.getString(ALBUM_SORT_ORDER, SortOrder.AlbumSortOrder.ALBUM_A_Z); } - public void setAlbumSongSortOrder(final String value) { - setSortOrder(ALBUM_SONG_SORT_ORDER, value); - } +// public void setAlbumSongSortOrder(final String value) { +// setSortOrder(ALBUM_SONG_SORT_ORDER, value); +// } public final String getAlbumSongSortOrder() { return mPreferences.getString(ALBUM_SONG_SORT_ORDER, SortOrder.AlbumSongSortOrder.SONG_TRACK_LIST); } - public void setSongSortOrder(final String value) { - setSortOrder(SONG_SORT_ORDER, value); - } +// public void setSongSortOrder(final String value) { +// setSortOrder(SONG_SORT_ORDER, value); +// } public final String getSongSortOrder() { return mPreferences.getString(SONG_SORT_ORDER, SortOrder.SongSortOrder.SONG_A_Z); diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/SortOrder.java b/app/src/main/java/com/kabouzeid/gramophone/util/SortOrder.java index 160581ff..4ce904a6 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/SortOrder.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/SortOrder.java @@ -29,127 +29,127 @@ public final class SortOrder { /** * Artist sort order entries. */ - public static interface ArtistSortOrder { + public interface ArtistSortOrder { /* Artist sort order A-Z */ - public final static String ARTIST_A_Z = MediaStore.Audio.Artists.DEFAULT_SORT_ORDER; + String ARTIST_A_Z = MediaStore.Audio.Artists.DEFAULT_SORT_ORDER; /* Artist sort order Z-A */ - public final static String ARTIST_Z_A = ARTIST_A_Z + " DESC"; + String ARTIST_Z_A = ARTIST_A_Z + " DESC"; /* Artist sort order number of songs */ - public final static String ARTIST_NUMBER_OF_SONGS = MediaStore.Audio.Artists.NUMBER_OF_TRACKS + String ARTIST_NUMBER_OF_SONGS = MediaStore.Audio.Artists.NUMBER_OF_TRACKS + " DESC"; /* Artist sort order number of albums */ - public final static String ARTIST_NUMBER_OF_ALBUMS = MediaStore.Audio.Artists.NUMBER_OF_ALBUMS + String ARTIST_NUMBER_OF_ALBUMS = MediaStore.Audio.Artists.NUMBER_OF_ALBUMS + " DESC"; } /** * Album sort order entries. */ - public static interface AlbumSortOrder { + public interface AlbumSortOrder { /* Album sort order A-Z */ - public final static String ALBUM_A_Z = MediaStore.Audio.Albums.DEFAULT_SORT_ORDER; + String ALBUM_A_Z = MediaStore.Audio.Albums.DEFAULT_SORT_ORDER; /* Album sort order Z-A */ - public final static String ALBUM_Z_A = ALBUM_A_Z + " DESC"; + String ALBUM_Z_A = ALBUM_A_Z + " DESC"; /* Album sort order songs */ - public final static String ALBUM_NUMBER_OF_SONGS = MediaStore.Audio.Albums.NUMBER_OF_SONGS + String ALBUM_NUMBER_OF_SONGS = MediaStore.Audio.Albums.NUMBER_OF_SONGS + " DESC"; /* Album sort order artist */ - public final static String ALBUM_ARTIST = MediaStore.Audio.Albums.ARTIST; + String ALBUM_ARTIST = MediaStore.Audio.Albums.ARTIST; /* Album sort order year */ - public final static String ALBUM_YEAR = MediaStore.Audio.Albums.FIRST_YEAR + " DESC"; + String ALBUM_YEAR = MediaStore.Audio.Albums.FIRST_YEAR + " DESC"; } /** * Song sort order entries. */ - public static interface SongSortOrder { + public interface SongSortOrder { /* Song sort order A-Z */ - public final static String SONG_A_Z = MediaStore.Audio.Media.DEFAULT_SORT_ORDER; + String SONG_A_Z = MediaStore.Audio.Media.DEFAULT_SORT_ORDER; /* Song sort order Z-A */ - public final static String SONG_Z_A = SONG_A_Z + " DESC"; + String SONG_Z_A = SONG_A_Z + " DESC"; /* Song sort order artist */ - public final static String SONG_ARTIST = MediaStore.Audio.Media.ARTIST; + String SONG_ARTIST = MediaStore.Audio.Media.ARTIST; /* Song sort order album */ - public final static String SONG_ALBUM = MediaStore.Audio.Media.ALBUM; + String SONG_ALBUM = MediaStore.Audio.Media.ALBUM; /* Song sort order year */ - public final static String SONG_YEAR = MediaStore.Audio.Media.YEAR + " DESC"; + String SONG_YEAR = MediaStore.Audio.Media.YEAR + " DESC"; /* Song sort order duration */ - public final static String SONG_DURATION = MediaStore.Audio.Media.DURATION + " DESC"; + String SONG_DURATION = MediaStore.Audio.Media.DURATION + " DESC"; /* Song sort order date */ - public final static String SONG_DATE = MediaStore.Audio.Media.DATE_ADDED + " DESC"; + String SONG_DATE = MediaStore.Audio.Media.DATE_ADDED + " DESC"; } /** * Album song sort order entries. */ - public static interface AlbumSongSortOrder { + public interface AlbumSongSortOrder { /* Album song sort order A-Z */ - public final static String SONG_A_Z = MediaStore.Audio.Media.DEFAULT_SORT_ORDER; + String SONG_A_Z = MediaStore.Audio.Media.DEFAULT_SORT_ORDER; /* Album song sort order Z-A */ - public final static String SONG_Z_A = SONG_A_Z + " DESC"; + String SONG_Z_A = SONG_A_Z + " DESC"; /* Album song sort order track list */ - public final static String SONG_TRACK_LIST = MediaStore.Audio.Media.TRACK + ", " + String SONG_TRACK_LIST = MediaStore.Audio.Media.TRACK + ", " + MediaStore.Audio.Media.DEFAULT_SORT_ORDER; /* Album song sort order duration */ - public final static String SONG_DURATION = SongSortOrder.SONG_DURATION; + String SONG_DURATION = SongSortOrder.SONG_DURATION; } /** * Artist song sort order entries. */ - public static interface ArtistSongSortOrder { + public interface ArtistSongSortOrder { /* Artist song sort order A-Z */ - public final static String SONG_A_Z = MediaStore.Audio.Media.DEFAULT_SORT_ORDER; + String SONG_A_Z = MediaStore.Audio.Media.DEFAULT_SORT_ORDER; /* Artist song sort order Z-A */ - public final static String SONG_Z_A = SONG_A_Z + " DESC"; + String SONG_Z_A = SONG_A_Z + " DESC"; /* Artist song sort order album */ - public final static String SONG_ALBUM = MediaStore.Audio.Media.ALBUM; + String SONG_ALBUM = MediaStore.Audio.Media.ALBUM; /* Artist song sort order year */ - public final static String SONG_YEAR = MediaStore.Audio.Media.YEAR + " DESC"; + String SONG_YEAR = MediaStore.Audio.Media.YEAR + " DESC"; /* Artist song sort order duration */ - public final static String SONG_DURATION = MediaStore.Audio.Media.DURATION + " DESC"; + String SONG_DURATION = MediaStore.Audio.Media.DURATION + " DESC"; /* Artist song sort order date */ - public final static String SONG_DATE = MediaStore.Audio.Media.DATE_ADDED + " DESC"; + String SONG_DATE = MediaStore.Audio.Media.DATE_ADDED + " DESC"; } /** * Artist album sort order entries. */ - public static interface ArtistAlbumSortOrder { + public interface ArtistAlbumSortOrder { /* Artist album sort order A-Z */ - public final static String ALBUM_A_Z = MediaStore.Audio.Albums.DEFAULT_SORT_ORDER; + String ALBUM_A_Z = MediaStore.Audio.Albums.DEFAULT_SORT_ORDER; /* Artist album sort order Z-A */ - public final static String ALBUM_Z_A = ALBUM_A_Z + " DESC"; + String ALBUM_Z_A = ALBUM_A_Z + " DESC"; /* Artist album sort order songs */ - public final static String ALBUM_NUMBER_OF_SONGS = MediaStore.Audio.Artists.Albums.NUMBER_OF_SONGS + String ALBUM_NUMBER_OF_SONGS = MediaStore.Audio.Artists.Albums.NUMBER_OF_SONGS + " DESC"; /* Artist album sort order year */ - public final static String ALBUM_YEAR = MediaStore.Audio.Artists.Albums.FIRST_YEAR + String ALBUM_YEAR = MediaStore.Audio.Artists.Albums.FIRST_YEAR + " DESC"; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/Util.java b/app/src/main/java/com/kabouzeid/gramophone/util/Util.java index 1160baff..7c71f69d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/Util.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/Util.java @@ -4,18 +4,12 @@ import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.content.res.Configuration; -import android.content.res.Resources; import android.content.res.TypedArray; -import android.database.Cursor; -import android.graphics.Bitmap; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.net.Uri; import android.os.Build; -import android.provider.MediaStore; import android.support.annotation.DrawableRes; +import android.support.v4.content.ContextCompat; import android.util.TypedValue; import android.view.View; import android.view.Window; @@ -25,31 +19,30 @@ import android.view.inputmethod.InputMethodManager; import com.kabouzeid.gramophone.R; /** - * Created by karim on 12.12.14. + * @author Karim Abou Zeid (kabouzeid) */ public class Util { - private static int albumArtSize = 600; - public static int resolveDrawable(Context context, int drawable) { - TypedArray a = context.obtainStyledAttributes(new int[]{drawable}); - int resId = a.getResourceId(0, 0); - a.recycle(); - return resId; - } +// public static int resolveDrawable(Context context, int drawable) { +// TypedArray a = context.obtainStyledAttributes(new int[]{drawable}); +// int resId = a.getResourceId(0, 0); +// a.recycle(); +// return resId; +// } - public static int resolveColor(Context context, int color) { - TypedArray a = context.obtainStyledAttributes(new int[]{color}); - int resId = a.getColor(0, 0); - a.recycle(); - return resId; - } +// public static int resolveColor(Context context, int color) { +// TypedArray a = context.obtainStyledAttributes(new int[]{color}); +// int resId = a.getColor(0, 0); +// a.recycle(); +// return resId; +// } - public static boolean isWindowTranslucent(Context context) { - TypedArray a = context.obtainStyledAttributes(new int[]{android.R.attr.windowTranslucentStatus}); - boolean result = a.getBoolean(0, false); - a.recycle(); - return result; - } +// public static boolean isWindowTranslucent(Context context) { +// TypedArray a = context.obtainStyledAttributes(new int[]{android.R.attr.windowTranslucentStatus}); +// boolean result = a.getBoolean(0, false); +// a.recycle(); +// return result; +// } public static int getActionBarSize(Context context) { TypedValue typedValue = new TypedValue(); @@ -113,44 +106,43 @@ public class Util { WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); } - public static final boolean isOnline(final Context context) { - if (context == null) { - return false; - } - - boolean state = false; - final boolean onlyOnWifi = PreferenceUtils.getInstance(context).autoDownloadOnlyOnWifi(); - - /* Monitor network connections */ - final ConnectivityManager connectivityManager = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - - /* Wi-Fi connection */ - final NetworkInfo wifiNetwork = connectivityManager - .getNetworkInfo(ConnectivityManager.TYPE_WIFI); - if (wifiNetwork != null) { - state = wifiNetwork.isConnectedOrConnecting(); - } - - /* Mobile data connection */ - final NetworkInfo mbobileNetwork = connectivityManager - .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); - if (mbobileNetwork != null) { - if (!onlyOnWifi) { - state = mbobileNetwork.isConnectedOrConnecting(); - } - } - - /* Other networks */ - final NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); - if (activeNetwork != null) { - if (!onlyOnWifi) { - state = activeNetwork.isConnectedOrConnecting(); - } - } - - return state; - } +// public static boolean isOnline(final Context context) { +// if (context == null) +// return false; +// +// boolean state = false; +// final boolean onlyOnWifi = PreferenceUtils.getInstance(context).autoDownloadOnlyOnWifi(); +// +// /* Monitor network connections */ +// final ConnectivityManager connectivityManager = (ConnectivityManager) context +// .getSystemService(Context.CONNECTIVITY_SERVICE); +// +// /* Wi-Fi connection */ +// final NetworkInfo wifiNetwork = connectivityManager +// .getNetworkInfo(ConnectivityManager.TYPE_WIFI); +// if (wifiNetwork != null) { +// state = wifiNetwork.isConnectedOrConnecting(); +// } +// +// /* Mobile data connection */ +// final NetworkInfo mbobileNetwork = connectivityManager +// .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); +// if (mbobileNetwork != null) { +// if (!onlyOnWifi) { +// state = mbobileNetwork.isConnectedOrConnecting(); +// } +// } +// +// /* Other networks */ +// final NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo(); +// if (activeNetwork != null) { +// if (!onlyOnWifi) { +// state = activeNetwork.isConnectedOrConnecting(); +// } +// } +// +// return state; +// } public static String getFileSizeString(long sizeInBytes) { long fileSizeInKB = sizeInBytes / 1024; @@ -158,22 +150,23 @@ public class Util { return fileSizeInMB + " MB"; } - public static String getFilePathFromContentProviderUri(Context context, Uri uri) { - String path = ""; - String[] projection = {MediaStore.MediaColumns.DATA}; - Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); - if (cursor == null) return null; - int column_index = cursor.getColumnIndexOrThrow(projection[0]); - if (cursor.moveToFirst()) { - path = cursor.getString(column_index); - } - cursor.close(); - return path; - } - - private static Bitmap getScaledBitmap(final Bitmap bitmap) { - return Bitmap.createScaledBitmap(bitmap, albumArtSize, albumArtSize, false); - } +// public static String getFilePathFromContentProviderUri(Context context, Uri uri) { +// String path = ""; +// String[] projection = {MediaStore.MediaColumns.DATA}; +// Cursor cursor = context.getContentResolver().query(uri, projection, null, null, null); +// if (cursor == null) return null; +// int column_index = cursor.getColumnIndexOrThrow(projection[0]); +// if (cursor.moveToFirst()) { +// path = cursor.getString(column_index); +// } +// cursor.close(); +// return path; +// } +// +// private static Bitmap getScaledBitmap(final Bitmap bitmap) { +// int albumArtSize = 600; +// return Bitmap.createScaledBitmap(bitmap, albumArtSize, albumArtSize, false); +// } public static void hideSoftKeyboard(Activity activity) { if (activity != null) { @@ -201,11 +194,11 @@ public class Util { return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; } - public static Drawable getTintedDrawable(Resources res, @DrawableRes int drawableResId, int color) { - Drawable drawable = res.getDrawable(drawableResId); + public static Drawable getTintedDrawable(Context context, @DrawableRes int drawableResId, int color) { + Drawable drawable = ContextCompat.getDrawable(context, drawableResId); if (drawable != null) { drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); } return drawable; } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java index 1385b306..de78166e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java @@ -13,7 +13,7 @@ import android.widget.ListView; import android.widget.TextView; /** - * Created by karim on 06.12.14. + * @author Karim Abou Zeid (kabouzeid) */ public class ViewUtil { public final static int DEFAULT_COLOR_ANIMATION_DURATION = 1000; @@ -89,6 +89,7 @@ public class ViewUtil { @Override public void onGlobalLayout() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { + //noinspection deprecation view.getViewTreeObserver().removeGlobalOnLayoutListener(this); } else { view.getViewTreeObserver().removeOnGlobalLayoutListener(this); diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/CircleView.java b/app/src/main/java/com/kabouzeid/gramophone/views/CircleView.java new file mode 100644 index 00000000..9e4064f7 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/views/CircleView.java @@ -0,0 +1,105 @@ +package com.kabouzeid.gramophone.views; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +import com.kabouzeid.gramophone.R; + +public class CircleView extends FrameLayout { + + private final Bitmap mCheck; + private final Paint paint; + private final Paint paintBorder; + private final int borderWidth; + + public CircleView(Context context) { + this(context, null, 0); + } + + public CircleView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CircleView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + final int checkSize = (int) context.getResources().getDimension(R.dimen.circle_view_check); + mCheck = getResizedBitmap(BitmapFactory.decodeResource(context.getResources(), + R.drawable.ic_check), checkSize, checkSize); + borderWidth = (int) getResources().getDimension(R.dimen.circle_view_border); + + paint = new Paint(); + paint.setAntiAlias(true); + + paintBorder = new Paint(); + paintBorder.setAntiAlias(true); + paintBorder.setColor(Color.BLACK); + + setWillNotDraw(false); + } + + private static Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { + int width = bm.getWidth(); + int height = bm.getHeight(); + float scaleWidth = ((float) newWidth) / width; + float scaleHeight = ((float) newHeight) / height; + Matrix matrix = new Matrix(); + matrix.postScale(scaleWidth, scaleHeight); + Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); + bm.recycle(); + return resizedBitmap; + } + + @Override + public void setBackgroundColor(int color) { + paint.setColor(color); + requestLayout(); + invalidate(); + } + + public void setBorderColor(int color) { + paintBorder.setColor(color); + requestLayout(); + invalidate(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY) { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = width; + if (heightMode == MeasureSpec.AT_MOST) { + height = Math.min(height, MeasureSpec.getSize(heightMeasureSpec)); + } + setMeasuredDimension(width, height); + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + int canvasSize = canvas.getWidth(); + if (canvas.getHeight() < canvasSize) + canvasSize = canvas.getHeight(); + + int circleCenter = (canvasSize - (borderWidth * 2)) / 2; + canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) + borderWidth - 4.0f, paintBorder); + canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, ((canvasSize - (borderWidth * 2)) / 2) - 4.0f, paint); + + if (isActivated()) { + final int offset = (canvasSize / 2) - (mCheck.getWidth() / 2); + canvas.drawBitmap(mCheck, offset, offset, null); + } + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/DynamicCheckBox.java b/app/src/main/java/com/kabouzeid/gramophone/views/DynamicCheckBox.java new file mode 100644 index 00000000..3c9029cc --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/views/DynamicCheckBox.java @@ -0,0 +1,34 @@ +package com.kabouzeid.gramophone.views; + +import android.content.Context; +import android.support.v7.internal.widget.TintCheckBox; +import android.util.AttributeSet; + +import com.afollestad.materialdialogs.ThemeSingleton; +import com.afollestad.materialdialogs.internal.MDTintHelper; + +/** + * @author Aidan Follestad (afollestad) + */ +public class DynamicCheckBox extends TintCheckBox { + + public DynamicCheckBox(Context context) { + super(context); + init(); + } + + public DynamicCheckBox(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public DynamicCheckBox(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + final int color = ThemeSingleton.get().positiveColor; + MDTintHelper.setTint(this, color); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_check.png b/app/src/main/res/drawable-hdpi/ic_check.png new file mode 100755 index 0000000000000000000000000000000000000000..e8ff6cbcc0022d69cdd348f40ca30a06348c266e GIT binary patch literal 1085 zcmeAS@N?(olHy`uVBq!ia0y~yVDJNB4mJh`hQ3t_vJ4C?ES@foAr*0NXIr1X;vmvi z9=Jy#D={}w->mFgQ*RR&msW>H($WXA2kRfO>aXZ%QqsC{BO>Fm{Dw>OAMguU>$kqH zPEq=tsy?&WPi?yAIrhWbchB@xJHIdg-egYe`8Vfx9f&bK#delwP7n**xdWP<8tpS5 z@ywajP&7jm2iNO?Socx4nlA!xFW1=Z4?cSJKxGO;F7rJ*x7+RCq~9_zhVK$z0?EMQEllD9FE-lJTW+GW?(?&WOnw9)sC+!S+_7f(%-Y=#qF|759ZkB zGn_JX+cD`=AJe_+SJsgQOBE6dX4kqbf6VZ`cGCl`rUiWWqH}Db9cHWS@DONuAh_jn z!?(-#Ei_k~ZGEnCQ1i`C#sz*qzs-@^F~v*!LGQg)>-=^f*Rky2UizF<<85?oRF725 zDg_Qk8QmRbZ!CXh&r#x-_G(LntBuuB%{QLcw;XJ7*DjlE*tGt!j7gQ-hUuIO0tI>wt*X^t+c0BlC}S?Knje2Rzv0wn>nlXeYWOGmU*)al5jwqU#v84YJ)LEn(%S7e zyp5UtAx2=&kwTTysFJ5)%$?ltq^#mxyII+9ezSS7*TZyXlKr`P+ds~mJ@4e}EjKK6 z4<1~yJ^6z4mbDuX=CT|UXl__)@v7zI`y=*2LgI0g4oGAPY&d9HA@npbAtrOuwk`z@ zyTtSzDxTACy_WDx6Yu-PmCOA&L4MXBw^_lV6 z+S@02Uiq5Ka*nla$+^d8ss&1;au)R-tjs(eE3smB@Fn+(jg#{?*>YO2`)@K3nDsfK zS;5mX=({fGdxJl*U#kwU3yd>5D#{+t;%4?OC+7IkeTt5Ar@IPl$qP-KJALV;u413O zt3rELwKg8So@p4qmFt{#=%3ccH%$wISF`1Kb2HDs`0sy-;kUJXmDR7iK3^(hkE>t% zEBDF-#jneD+*wfY?Dot@7L!k|>~9RNi^i4xrabt^6c@HK?z)qH5(5JRgQu&X%Q~lo FCID3x^}_%F literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_drawer.png b/app/src/main/res/drawable-hdpi/ic_drawer.png deleted file mode 100644 index c59f601ca31dae344d0dc95912713ce54a8fbefe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2829 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoI14-?iy0WWg+Z8+Vb&Z8 z1_mzwOlRkSfQjkW+Vq$V4?QMNR>)4#kBxMFS5Cy1KGRpIFer+}GF8BO0i~)5Udz{fXkDzUIXp zU8jCOtX`abZO`{-Xa8-zZufl6=ee8DvmfB#ndV^}XxhND(n(J6LG$q=#~wb>b7d=7!LT(K42iz{-6Jq)65vgh8D&HB@->Y zIT}P59IE=9mN7WEF*eMdp%%=rfQ2F9baK*Th5%iL1oir7ml+!7{+LO86pfAMAE#ESTfwuWiapzPxD~du$|$+IRWlX3>-WR27w)| znhY$}3<)Qcl`9xpW-^GleG0evsJ%|$xfTOM#mr4MJ5?-Q8>2aN3)#cN_2e|pd5UX` zm?bhL&T`N@R5?@9sL_P~!RIp!3=1ZT3O;E5{I}v9-@0?>%=)(R#p}M>&-Py_De3XQ zr{`A}I503gEUCNrPe*^VRD(5JL+-yts_$4b;Q;wm;6nz~Hi=QEP*v^p}GYItSQf4zk`k$o(h5ti?&?$RQ^IC$5wR znW6;EHBC+$ZD%*gY9;7jaga4R5SY<6xqwgaQ0NXm+XDVyi5&9|YV2v`WN|#fA)Kgq ztAjDAD?+)CLwsiI5524k8#^I(fR~~ zQPZEcJ?@568aD;nUg6p5ymN)QREygp?h7d;hO_#`7Ra3h?;vuCx`Q)vX>`m;JQ*;!xPqaRn z`{eKw<0sNj6hB3C%}sJBT=FCMkw(y|EHBBY0#8kzvZc;2atvKOE9mZug&~5b{ZUS9 z7j6q$AK1P^*rarp<=JL2Pw%B`7frn^l_8$-J#+nwl3jv#r^@+FzYu=u^h@^_(_b)u zDd*vB6Ky`;k**;*TY_C8U9wza{S2RFl9#(BkB1nT8@`_Ld?x?Q{Ll!kZCW*=6HjqX z^_r?SRa#3wWaX-5tM0Ah4*eW@I;4MPTyX6=w@~BY$16FnOj{kgYHq;mVCmrWmDVfT zSEaAW53yfT7x}l7E%LC>VSnc(feSXqKi+dpfje1pbA^s#Ht*`T(nixGY8%hqtSQsl zJ>#$J?rz&vD;HWi8+#dtZw~rACC#4w@r=SBb4vU;pKC0i{<*H}p2&O6N1D>hOni14 zrp9Einl^n}#A=V#fveqL?=@TZcKO_8dtG-&{%+)RJnp3)qwb#Ge~xwT^WdAocb9W5 z7xT5X`npbURrXTpg}YtK_vbBtH)GzuxQ2N?`OEKB?tT7CrdI!N$lu&w%fGtwM6hk< zQDM8yb56qMsA*xojjaCh+aCj+V-GtxFHM}9IQ?PE#GMyy7GHJib>r{JJQnj<<#Fz@ z++&N?*whr&ynSE!zMB=~yK|Z5GHV}epW|oGoLzMG+Dy~gwuaY@p3i|aQRNZ$$qQnT}wZ_ z;p4WG+g5Iu-0<`U+wFDRa<|ncrYDJ~Z$G;3@Vm)-C)e((?fq-Z&f9*IZ?$ZcY+dn| zA`z=Ft9!G~&3R{Ed-Th+m-^`u=LOE+Fn+vE__XGc%(=m{FT1CUr|&Fo{@l^s>D_c% zZ@Qh{Z0TcnPwai-Rr0kk_F>hfuXAT_o_*-;ireeonZ3(=*M4XI8I$>%^CFFlFC0GM z{2=h@MSJe~Qw_53uc`BQ_HRtz`dnE*S$|^q+Upy(FD+m7J@LJ`-8Z|U`H$@$+nC=o zx)&LL#{9tc6WdSwAI_f_-+JGbFfd-#Ydz*y$+h*x$6a>FL3>iWw)~OjxV<{rQY@6VGMxwFcC^xORa(@mXT`;W{4m z*7nx$Hv7JUjtHrXhSN>UFWzx3zVGtOWtz*q+3AM1Em6GT&vg%l?>N zTI89l5pyFvbG&6N^|aQR<>lEq&E}ym{zJB zHD0RobZ3kD$_aaXczy29wwfn4t4tx+$kuAFVe_Pk6AGPHDf&*{mi{XJSz6iYHL0ze z{vFNh-mWh&l+efI5{&8Kcp zFrV{&{{Oc^hlCzZ+P1XKJ6u;b;@RFcS(ck@3M+4OJr-rvZVO{uW3!`cn^x{s|J859 zr?0Eqt5)Tk-57W9RMWw&jM=ZbL%E)|*1o=T{cWs&gns1xt%<+d=1SX%c6O~3xh+0j zwEl+1orFOT=;tu4Iw!?wKr z`pxyW{`9jNw|6&hbKbdlzs-(4smo8EJ8NwpvLxh7$gdEycbD#NO}zdi@8Ub@>OJ2~ z-dw#Mz32O1yOaBFhcbrxUQN52`rGsO=I{3FI#<2?G3|G5>{`Fv!nennFERgRSLWMx zedm>{vX^W_g8Hv%zjo(4F2C>J-1p_Wyk@+iy>pH|QZ8_*eDd-;=l$<;yjHi$daBnv zWWOw5CYvs+pXD^`(=4~y!LxoxCq?h_KVx_C+N*n2f81}&^UpD{iLCVc9C9-A*2|{L zlhZ$)@0mMwZf%|3&pQdX7j3J4o_y|p7JvTxT>>Q!FS-8jer~a_1KrRSNSyZdEtD@QW)!(h%=ES4z)+>iz|hdl z!0_`w14F}028L1t28LG&3=CE?7#PI!C&eFiV_;yg@N{tu@i?CRmdKI;Vst02nwyvj6}9 diff --git a/app/src/main/res/drawable-hdpi/ic_drawer_about.png b/app/src/main/res/drawable-hdpi/ic_drawer_about.png new file mode 100755 index 0000000000000000000000000000000000000000..0a2cd5da59fa856f513cd5755eb92fcb0f3500bf GIT binary patch literal 726 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?&GmF~42f{RJHxxfKTzhl z{bNDy?vL{(Wtwc-D5cVxW)>tCCoPzLe$j@2mIw`%RGV*dsS6`kBtG6MdFYheS&^j% zl{z9$FIV5c`m*GG<(;3)X9sWp|G)nH`#JZY|C{&x-|dVW8QBv2|5-1vBrJ{PZp=&A z6!}ZofW?ND?ai-wk6UH9w=!2ZzCCcoMOD6m`#|P{;#0Fi7W5v7OsG1wOw~yFK;DC> zoLZg?nF78WQnxh<{|Rm2{t>Av&m?rFG$GdEruhTC4~J5oF>5z;Hkz6@@P-B`F6b6K z9kXpl)qBnPiH4gk8C1P zNIhlM`1M=tyNcZV$C>&YSw#c5zEswIo60E5%%^5|v*>}D!O1848CEy6e~S*=A#~%l zMZt-=-y1`|+;e&5!~Wr%*~G0?Hm&DnSD#_I$JP+CJdLrwdpZ9WsU4D?y^GK7nU~k2 zzJ7{a{&$n`9ow>Qn;ux3bcy{Hdzs3$DO!ftox0YCPyBn1*?M&Yn{L8uquQ-<;YTJ! z^%@zOEGhOBouE`7hsR=0H}Em2`)uCirZ-zyd1EE(-diCnTVL()$xe%Yb?Om+Lu#ji5cjS%egUhO z=NdLFJ+PQZqLZz8m*1`3SIhVd)Pyx=eA8^bc)k2QQ^fb`#(h2u5)yqfWoQ0sdUWyH z!mAsf-SS$HQ9O0ijgN~%^}OxsJQCkDJabxkQ*NX5FPk|Thn_G;ZH#}z5q;t+<0-pC zUXiC1`zVTuG*L3G3vwlCF kZ+Z5+?q;valev)3+SsY;^m5w|1_lNOPgg&ebxsLQ0D2Qjd;kCd literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_drawer_settings.png b/app/src/main/res/drawable-hdpi/ic_drawer_settings.png new file mode 100755 index 0000000000000000000000000000000000000000..777147427c71ae67ab45d0d0095ecf54e9f3fd90 GIT binary patch literal 591 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?iFvv>hD5mEy>aujZ=l5S zkLR;JI0OH%@0g&n`GdX2qL_l#9R^E$c8UZV#R#n15#aJuKH%AeDG%)zaA-JzTScV}SkG@@u>bY=3S;i!n_Wu; z6%yDZOYLqK>ak`>#U=hyh_t@3&-ulh+MC-~IW6C~*ttnhFMY#iPK}m7EElh>d>!n$ z;Gwo_e&g)!XwCrhZe=yA%8JlTjk??Ihk0d1*Vb%gtt#H=8Zy)Mx$GgsKUu=1?|)jw ztnCn+H8Zfvw>0MCuY1=rvTWCdTAIDRqFu22&`Z5(>aUb@ria~FcVzB<))M~HZp<39 z!>3JMu{ry@zVQA`-k@E0!v1D?#jy$d#lEx4e!9(NpmlwL+KM-N zU5vA@hFUdj`hDZVvdwzopr0I~=T AdjJ3c literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_more_vert_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_more_vert_black_24dp.png deleted file mode 100644 index f22e713986b5478cbc9202a340449c101ab48c48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4i*Lm25-&)VFm^Ug=CK)Uj~LMH3o);76yi2 z3=9knFBlj~4Hy_+B``2p&0t^R-3sRAXRZ OVDNPHb6Mw<&;$Sj;X!Wz diff --git a/app/src/main/res/drawable-hdpi/ic_my_library_music_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_my_library_music_white_24dp.png deleted file mode 100644 index 69091e549afd033899a6e2a0ac19ce0609939b8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 330 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4i*Lm25-&)VFm^Ug=CK)Uj~LMH3o);76yi2 z3=9knFBlj~4Hy_+B``2p&0t^Ixga-HiTG=fLM<>NG@_K#^afsDk;lJP}-&={z$8Pe)ZrE#h ze3IFxRegRI31WW9S{|k%*-^UfC1>j=DaPCMF)jOD_~iz3FY~9*3o<-^8h1oFKAm~W f!T!g^T}-oY)SZ5H&&id6fq}u()z4*}Q$iB}tB81G diff --git a/app/src/main/res/drawable-hdpi/ic_pause_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_pause_white_24dp.png deleted file mode 100644 index b4bdbb558816223029dd7cb3ada0af2c70b0b0e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4i*Lm25-&)VFm^Ug=CK)Uj~LMH3o);76yi2 z3=9knFBlj~4Hy_+B``2p&0t^YT+!%a=GQ!-RiaZs-ZbONg1}}sUMbUz l2Rw_S9@J4i*Lm25-&)VFm^Ug=CK)Uj~LMH3o);76yi2 z3=9knFBlj~4Hy_+B``2p&0t^#U&~PMjtQx#~Yn z6U3hQtMs4w=l$&5&UB`OmJeJ1acSvhJa*4=U@(?vXL@l`hC@t?ok`+^EJv7>5Hpj+ z2duIF@Wu;*L+wv|j9{w)n;({@UoD g`|aN{FObbO*?xTDk)>Z57#J8lUHx3vIVCg!00~rBB>(^b diff --git a/app/src/main/res/drawable-hdpi/ic_queue_music_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_queue_music_black_24dp.png deleted file mode 100644 index 7f9e0a77d9a7fdc733f58efc0e06fbee55688e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4i*Lm25-&)VFm^Ug=CK)Uj~LMH3o);76yi2 z3=9knFBlj~4Hy_+B``2p&0t^AxdSrVDUrZ(SG2x4B?7`4!|y4izwv0};v zjvmt%HtRN9p8E|SSX0?tjs6@>Wb|a?G^{!FGH8;6lAQizmMlY_Rm$fVu<$e|oiygK z?Xff9m@vEQkmSDuy+02NczHT)NxO0K11m?lK}2s@;bCS51`P$4jDTQ;6$}gv44$rj JF6*2UngDhaOgI1l diff --git a/app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_settings_white_24dp.png deleted file mode 100644 index f9a8915fd2dc378d35756de89784556e6fdc7db9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 561 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4i*Lm25-&)VFm^Ug=CK)Uj~LMH3o);76yi2 z3=9knFBlj~4Hy_+B``2p&0t^&?>%v5uH*%8fzq_%hkL#^7C*E79>d-@ z-?Go1ZI@HeoZ1WBELGdMKV6#U;A`{EA#si2HEoS!YK`YMcgM0$Ie7CV+fAh;rpgMY ztU1P~Wl~ED&+~ka31F8icPDv0ztbM=JzCm93$Tx=@b=NnmXZ{=EUV` zC(JlcFHl~)#!D#vcrd3{)Y*kRTm_2{9#JWFFXyX;0wUde8$U$_1P18LaLjI6(-wa4$C687Uli2Yr=53mVqChU zrn^>D#h#;&0k?+Cp)Izd!uE>rCi6Nz3$Ws_dzpamLV-Fny_Uz3}AOX^ng z)|-d-eDAGPU9$V1tm7rKeRnSLPvj{2%n@?Z$al^pvB~OgbByg8jr1lf9$sU7<7=qf z!6m!B?4^Ca?CMh!y|7~MUbBRkAj~^74&$PrmPyX0-cg!l}NbQx$BI8ecn}aXjT<{pJu?)F`{oBz)RauRxK- z%bfI;S!U!m+;P-nI9hky{e6SQ8Df~&$EcxPy7nXb6UpqZexB7RPeQjq*! z2BtH1YBkI=Cx>*($5^wSF_!k0JHe(_sSrJ5Nn^!1o4{$2pHgoJFl1Ry{&VaWo7zs* z>tbq}3i1Xg8Gbf-GI1DK@41+=H}dlZF^0~%JH1m6-$_pTJn7^{xwji$F{DiP=jvbx ze!XZi+bb@&na&0~dJaaPuyp$8_La|-|GZtpJ=2tH?&l=T!@gy4FBLyw^+bBpbM95y zGdejAKG1596h5)np|xQp{R%oXCKeS=*m_fED;7MylpTy7snVCh-E-n4XwBOWK;_}5gI&0KQU zb_qu(zsnZC5C3}-j{IKcx#8uvCiWHDzU~L#xHT$@vd#?Wu@vP!Ch0LbI507a(R0C~ z!&}&d7PMK^Z~wc%(X%L8_O(`ew!)S=Hm{&Q}(>^?2L2e~fGPO1ONB T{&jkW+Vq$V4?QMNR>)4#kBxMFS5Cy1KGRpIFer+}GF8BO0i~)5Udz{fXkDzUIXp zU8jCOtX`abZO`{-Xa8-zZufl6=ee8DvmfB#ndV^}XxhND(n(J6LG$q=#~wb>b7d=7!LT(K42iz{-6Jq)65vgh8D&HB@->Y zIT}P59IE=9mN7WEF*eMdp%%=rfQ2F9baK*Th5%iL1oir7ml+!7{+LO86pfAMAE#ESTfwuWiapzPxD~du$|$+IRWlX3>-WR27w)| znhY$}3<)Qcl`9xpW-^GleG0evsJ%|$xfTOM#mr4MJ5?-Q8>2aN3)#cN_2e|pd5UX` zm?bhL&T`N@R5?@9sL_P~!RIp!3=1ZT3O;E5{I}v9-@0?>%=)(R#p}M>&-Py_De3XQ zr{`A}I503gEUCNrPe*^VRD(5JL+-yts_$4b;Q;wm;6nz~Hi=QEP*v^p}GYItSQf4zk`k$o(h5ti?&?$RQ^IC$5wR znW6;EHBC+$ZD%*gY9;7jaga4R5SY<6xqwgaQ0NXm+XDVyi5&9|YV2v`WN|#fA)Kgq ztAjDAD?+)CLwsiI5524k8#^I(fR~~ zQPZEcJ?@568aD;nUg6p5ymN)QREygp?h7d;hO_#`7Ra3h?;vuCx`Q)vX>`m;JQ*;!xPqaRn z`{eKw<0sNj6hB3C%}sJBT=FCMkw(y|EHBBY0#8kzvZc;2atvKOE9mZug&~5b{ZUS9 z7j6q$AK1P^*rarp<=JL2Pw%B`7frn^l_8$-J#+nwl3jv#r^@+FzYu=u^h@^_(_b)u zDd*vB6Ky`;k**;*TY_C8U9wza{S2RFl9#(BkB1nT8@`_Ld?x?Q{Ll!kZCW*=6HjqX z^_r?SRa#3wWaX-5tM0Ah4*eW@I;4MPTyX6=w@~BY$16FnOj{kgYHq;mVCmrWmDVfT zSEaAW53yfT7x}l7E%LC>VSnc(feSXqKi+dpfje1pbA^s#Ht*`T(nixGY8%hqtSQsl zJ>#$J?rz&vD;HWi8+#dtZw~rACC#4w@r=SBb4vU;pKC0i{<*H}p2&O6N1D>hOni14 zrp9Einl^n}#A=V#fveqL?=@TZcKO_8dtG-&{%+)RJnp3)qwb#Ge~xwT^WdAocb9W5 z7xT5X`npbURrXTpg}YtK_vbBtH)GzuxQ2N?`OEKB?tT7CrdI!N$lu&w%fGtwM6hk< zQDM8yb56qMsA*xojjaCh+aCj+V-GtxFHM}9IQ?PE#GMyy7GHJib>r{JJQnj<<#Fz@ z++&N?*whr&ynSE!zMB=~yK|Z5GHV}epW|oGoLzMG+Dy~gwuaY@p3i|aQRNZ$$qQnT}wZ_ z;p4WG+g5Iu-0<`U+wFDRa<|ncrYDJ~Z$G;3@Vm)-C)e((?fq-Z&f9*IZ?$ZcY+dn| zA`z=Ft9!G~&3R{Ed-Th+m-^`u=LOE+Fn+vE__XGc%(=m{FT1CUr|&Fo{@l^s>D_c% zZ@Qh{Z0TcnPwai-Rr0kk_F>hfuXAT_o_*-;ireeonZ3(=*M4XI8I$>%^CFFlFC0GM z{2=h@MSJe~Qw_53uc`BQ_HRtz`dnE*S$|^q+Upy(FD+m7J@LJ`-8Z|U`H$@$+nC=o zx)&LL#{9tc6WdSwAI_f_-+JGbFfd-#Ydz*y$+h*x$6a>FL3>iWw)~OjxV<{rQY@6VGMxwFcC^xORa(@mXT`;W{4m z*7nx$Hv7JUjtHrXhSN>UFWzx3zVGtOWtz*q+3AM1Em6GT&vg%l?>N zTI89l5pyFvbG&6N^|aQR<>lEq&E}ym{zJB zHD0RobZ3kD$_aaXczy29wwfn4t4tx+$kuAFVe_Pk6AGPHDf&*{mi{XJSz6iYHL0ze z{vFNh-mWh&l+efI5{&8Kcp zFrV{&{{Oc^hlCzZ+P1XKJ6u;b;@RFcS(ck@3M+4OJr-rvZVO{uW3!`cn^x{s|J859 zr?0Eqt5)Tk-57W9RMWw&jM=ZbL%E)|*1o=T{cWs&gns1xt%<+d=1SX%c6O~3xh+0j zwEl+1orFOT=;tu4Iw!?wKr z`pxyW{`9jNw|6&hbKbdlzs-(4smo8EJ8NwpvLxh7$gdEycbD#NO}zdi@8Ub@>OJ2~ z-dw#Mz32O1yOaBFhcbrxUQN52`rGsO=I{3FI#<2?G3|G5>{`Fv!nennFERgRSLWMx zedm>{vX^W_g8Hv%zjo(4F2C>J-1p_Wyk@+iy>pH|QZ8_*eDd-;=l$<;yjHi$daBnv zWWOw5CYvs+pXD^`(=4~y!LxoxCq?h_KVx_C+N*n2f81}&^UpD{iLCVc9C9-A*2|{L zlhZ$)@0mMwZf%|3&pQdX7j3J4o_y|p7JvTxT>>Q!FS-8jer~a_1KrRSNSyZdEtD@QW)!(h%=ES4z)+>iz|hdl z!0_`w14F}028L1t28LG&3=CE?7#PI!C&eFiV_;y=_jGX#u{fRlm^Jv0T#Q)Yq{CBV!uL0Vfx+s@-gxEC18NKm3=E#GelF{r5}E)Q C*F3fW diff --git a/app/src/main/res/drawable-mdpi/ic_drawer_about.png b/app/src/main/res/drawable-mdpi/ic_drawer_about.png new file mode 100755 index 0000000000000000000000000000000000000000..f6782627e82a3420440667b3ae15790ddd921be2 GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoyF6VSLp;2a*exc^~;+*SO{ZtKPKyxw4is*9yh6>pV(a z^gHp-fpi(|-|+=9mw(K=q4O~C&wA#0kG#$wsngw{+*$JQk>olvM)`tO><`SHo^xbK z@(azDJ!8UXZ+MfjLx@LHe)^I9P98U6_7@b`H{4#j^4ufcMUys7W%}h&vMc14^c?xZ z+aZhWJp1(iM|%}yu_*W!MbG?p;`cn|%$eIvZ|!Kf=Em)QbHxca?-N(HMY+4CPT<|0 zwLa^NnZxr9-0sc&ueEL+l$*0_TeIEF$6@|e`(9uCpMSz$K{-e==VW*s0|Nttr>mdK II;Vst0Ba!0XaE2J literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_drawer_settings.png b/app/src/main/res/drawable-mdpi/ic_drawer_settings.png new file mode 100755 index 0000000000000000000000000000000000000000..b75269787c423143361c69e19f8392d35c6589a8 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJo%{^TlLp;3qUfrwb5-7s@ zAb-(Xi?Gw83mzgYQ*SZ92++}=D za{nLR$wjUAGz>%R1SY00RQNPu_etYpf@*Jmi@t%Cr^@R{aM)hOg&cg=8bKe-n1FsKeK7|_g}ZSt$WR>^1onG{Y>5b51Y;}NqwaA ak^9`!AjvQzH)aL~1_n=8KbLh*2~7aDQ>McJ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_more_vert_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_more_vert_black_24dp.png deleted file mode 100644 index 991ad6c6db5336e6cd64b373cc0efe08e7a09426..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4i*Lm2CurW#S9D#3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*O)8rk*a2Ar_~T6C~CtbUZXYtj$*c$aGKI5B?VY&g&nz);whWDD|gt+5UtN lvb;+#21xZSbn#_iaQ>+}!F(N~Ap-*ggQu&X%Q~loCIF@uHOl}1 diff --git a/app/src/main/res/drawable-mdpi/ic_my_library_music_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_my_library_music_white_24dp.png deleted file mode 100644 index e40b417c04752aa1d3c86ae99c98944f89346f96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4i*Lm2CurW#S9D#3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*O)8b)GJcAr`0iUWw;wP~bU``11T*rI#FvbN9d4x#!6G>0Dmd)Ld`Re#b29 z*M8djJ0H&)4?#}N38xvaiDWEn`u&Tu?<{{q!IJ+6J)AqYH@m%<&9Q3lo()Z9>~lqZ zDzdDe-O*dv_#5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*O)8YMw5RAr_~T|D1P_N=TCUB^41+u|Xi=$U%9vd2&|`Tucr6j_7bPNCvX# VU%&i|kAZ=K!PC{xWt~$(696xdEY$!2 diff --git a/app/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_play_arrow_white_24dp.png deleted file mode 100644 index 8d1e433a5632a27efa3d68fddf1a88416e14ba77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 257 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4i*Lm2CurW#S9D#3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*O)8m7Xq+Ar_~T|D1P_N=TCEle%W;@$l+LdD(ye|39ohR)6e2&kaR0UWI}m z`_(d~{{8>|bN@qoX-z4I2e<08FPZ%L|Ns5}FaK+nWH2-?|IaM=N#!_mqPnm0QBRf1 zU(f$n1vP#BP|y2F`Q73FB|(#p?fM_IL!?>ZvB#N343|ohn;m|n2r)1)FnGH9xvX5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*O)8ex5FlAr_~T6C_xVH2=3ySS6z>#c|VbQ?cha=BH9G-m?olNSJZ#11Cr4 zHG|$O5Pdv!Lz`)?? L>gTe~DWM4flZrt) diff --git a/app/src/main/res/drawable-mdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_settings_white_24dp.png deleted file mode 100644 index fdcf657fadf9e5191bde2ac712d34664973044d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4i*Lm2CurW#S9D#3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*J~221XfA7sn8b(_5$5doc$Jw8xiSUYY57B)G%LPm%HBp#>f08w>=j1zjfT zwlqX=Byrg`ighh$HM_PcqE%qZ90kE}``Oz!Z}u-SUtoMU|Jm&0e;!Jn$;kW1v_klH znB9YzhBCVcfer2R8T+f(MWnQu$uqgkF*qx9{Z60 + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/list_ripple_selector_dark.xml b/app/src/main/res/drawable-v21/list_ripple_selector_dark.xml new file mode 100644 index 00000000..538c3e83 --- /dev/null +++ b/app/src/main/res/drawable-v21/list_ripple_selector_dark.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/notification_selector.xml b/app/src/main/res/drawable-v21/notification_selector.xml index ada911a3..b8dfa68e 100644 --- a/app/src/main/res/drawable-v21/notification_selector.xml +++ b/app/src/main/res/drawable-v21/notification_selector.xml @@ -1,7 +1,7 @@ + android:color="@color/grey_500"> - + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/rect_ripple_selector.xml b/app/src/main/res/drawable-v21/rect_ripple_selector.xml index aab8a0b6..38c78380 100644 --- a/app/src/main/res/drawable-v21/rect_ripple_selector.xml +++ b/app/src/main/res/drawable-v21/rect_ripple_selector.xml @@ -1,9 +1,6 @@ + android:color="?android:colorControlHighlight"> - - + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/rect_ripple_selector_dark.xml b/app/src/main/res/drawable-v21/rect_ripple_selector_dark.xml index 7d597b4c..8ad440dd 100644 --- a/app/src/main/res/drawable-v21/rect_ripple_selector_dark.xml +++ b/app/src/main/res/drawable-v21/rect_ripple_selector_dark.xml @@ -1,9 +1,6 @@ + android:color="#333333"> - - + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/rect_selector.xml b/app/src/main/res/drawable-v21/rect_selector.xml deleted file mode 100644 index b60d1e48..00000000 --- a/app/src/main/res/drawable-v21/rect_selector.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/rect_selector_dark.xml b/app/src/main/res/drawable-v21/rect_selector_dark.xml deleted file mode 100644 index 70f5f273..00000000 --- a/app/src/main/res/drawable-v21/rect_selector_dark.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/round_ripple_selector.xml b/app/src/main/res/drawable-v21/round_ripple_selector.xml index 622a85b9..f5688ca1 100644 --- a/app/src/main/res/drawable-v21/round_ripple_selector.xml +++ b/app/src/main/res/drawable-v21/round_ripple_selector.xml @@ -1,9 +1,7 @@ - - + - - + android:drawable="@drawable/round_ripple_selector_mask" /> \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/round_ripple_selector_dark.xml b/app/src/main/res/drawable-v21/round_ripple_selector_dark.xml index 8e87f190..ec08d4ab 100644 --- a/app/src/main/res/drawable-v21/round_ripple_selector_dark.xml +++ b/app/src/main/res/drawable-v21/round_ripple_selector_dark.xml @@ -1,9 +1,6 @@ + android:color="?android:colorControlHighlight"> - - + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/round_ripple_selector_mask.xml b/app/src/main/res/drawable-v21/round_ripple_selector_mask.xml new file mode 100644 index 00000000..696455fc --- /dev/null +++ b/app/src/main/res/drawable-v21/round_ripple_selector_mask.xml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/round_selector.xml b/app/src/main/res/drawable-v21/round_selector.xml deleted file mode 100644 index d1809684..00000000 --- a/app/src/main/res/drawable-v21/round_selector.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v21/round_selector_dark.xml b/app/src/main/res/drawable-v21/round_selector_dark.xml deleted file mode 100644 index fc2932f9..00000000 --- a/app/src/main/res/drawable-v21/round_selector_dark.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/ic_check.png b/app/src/main/res/drawable-xhdpi/ic_check.png new file mode 100755 index 0000000000000000000000000000000000000000..bd66325cad3483f33b6af344e08c0b078948a4e1 GIT binary patch literal 1324 zcmeAS@N?(olHy`uVBq!ia0y~yV8{Sr4mJh`23eV{3mF(#K6|=2hE&A8onzfC;waKu z-s2)H=qN0#?C8Uy94K7hIFU_HN@s=+SCX2W(xT3pT}=xfF`Eb+x#97@t8t;!u6dW_ zR=j=dez)q*zRRUzU2{`c<%Q1A_xrxq`tI(C$NibCV#~shA6+Xr;UhmIqu_)>)*k(S zJ|%_6ToUnevMvtCL=E=YSame?XeZQEmIyFPh9CIx>4gH5(Yl6@PcJ&Mq{J{jKE1ek z3S(|=?%ZQj*u}e#{+_UsQ^RGcPpy=Nzd)Y-EnkN!OR-rE$3#wjv3nrnyuv?&eb$8i zAAVaY?3JC>)L_IY!NqK${_&sj7Ui{de3uqX=2&5{;F#rl>jygNawS5HqAVs4=6qYT z*H3AIQv=hS%dDBlO*0aK8>fN809{Bl;UrC{}g}HXG?~8{W6Zray&rSap!PFJ7*>*`waYff@hGVT7 zPi2@+F|1fp%%LF|kojC7fN4SBq2(%3>D#V}H+VL=-1>ig&b~wG9!u`!^fov>k$yQj zQMhW~-t&^tVzMU70zTI*Dy~yFvn*bbW6rdxEdmRTEYhQYs-^g;aW-oCK9ynOVlY`+ z%#mTESWtdHMYo2nMy;$Qangl_v#zO`ut+d&4Y{Oozop@!=D8ik94A1Sx#jY$$Ui?h zbYD-;ofItTZEMTLaE^1&SHax)mIaFrrMvvurOnw;%(cjN>x((B{0n=F<6I9Fmf!E- zo?jBMfT{Cbr(O-4UVilUSKk~Z=LpCCP+1_z8g|n1YHV}ZS<8zJ1q;LtZoHMwd%(To zzTvj3a?Pgm56?NjcG)H8s*ZJz78krZzA@zL&szOuS9`yYbJl|$zAqMb@VEVtYwECM zYiD83n)7)><7S>;Z2EVUh1C?-ZYp+JZXxp`m1oEGrp-NxmpoU$o0H&RaY6e@Lu0qo_e`YO-zx01JzwRM&=Xh~ zw5T|Qd%mF+-@9fhkF>c{4qC2iJ^!X5#$mPJtlh)Yg zX6e@Wv1u%yEbv-m)=z7@K+VJAB8QoCM2cms{{<)d z2y`cJveH;QStaW1CCi(ec1%2?m^xpCDRbL7O}-VDcbAGqv@3|#S7<#E4%+2EF?i1Y z3>ChWtk?8-)24dyJL>VBC=T*!ylUU3HD_^ASGJ|*S2=d^byCk)FrS*x6#jIMCqw0g zCGnvl&*z+EaJ5+J_1uTc+#9|tk*qR5WaFfC;Qq-3AeIU6>^WZeiob%VDR=G%aXM_3hbDK zxR%|W+ptAc{G7Xk)4?sfg(qx#bm%9ChsKPua;8gRF&6TSoUE7M`8nL`;(o5IurT4) iT~3ea!iP2WjQ@;`+IReFX=7kuVDNPHb6Mw<&;$TuTt)%_ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_drawer.png b/app/src/main/res/drawable-xhdpi/ic_drawer.png deleted file mode 100644 index a5fa74def4b40d7eb6826da05bd5e12b836cb999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2836 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}oCO|{#S9GG!XV7ZFl&wk z0|S?Trn7TEKt_H^esM;Afr6*AvqC{pep+TuDg#5st+~PJA;B-jY`@?8;^f`YFvUAR zNR&e%$f>(QWTKjuBBy{?hvLGUqJakmU0qqEPb}zQ?(1vl5e?Mg>EgP<{zP$6U-ROQ zu2a7sRxi%Jw&(k^v;VeUw|lQz`~GlIyvbvLx3(rf_nY4%M1;3f6T0AWQd-kD9X5C zB7=f(YKIF$hBd>Q^I=`C3=swlB5B@7EE#U-G8lMT#JFBV&*2Bohp{DjnN#sh3w(sdU6`)JjJy| z%o3RrXF2E{s+=il)M�PV*|l=S%D z)AOqf92giLmegJRr=!1Fs==DAA@|=R)pslzaoh_^zjvo?;&<4}u;Asb@XrOHuyI{D zVdu@8PoF%w;dR6*I`LF^?Z5Ox@dv{H=KQR)`SbnjgME)w8jWHb-C2G-ICSQV&r+H5 zlQ>(F?mX*v|FfO@{~y`QN=H1Cc1CE4JPs5p>~opb^Vw*rQm4}-&7-Q9{-->;uk)MP z?!GC*hAcbA>WR85Vw0J_d8-RVlpJ{Uoq^%g?)-ySG&qj}HTE=evN)dL5KdIQ z)xnt56`|b6AwIM9hvGpG7NKqxg_9j3flA&JO+5^QxN*)_l1-a!&&`e3ua#^+9GA!W47@5h1D7SxBBgz zj~g6#A;E5ZB*#GS*kPxQ7CM}hlTU9{TEnyYnAC=_HO#v^zb2pGSk5BU=z4(DjHTR3 zAyLlJBf=-b?}o<;1sN3+!CRc>oXjnOht!oOukhZYwoCBm5s4%t!}bUd9p!66{lfYJ z)g8`9%vFRsosHCYPGIufxFqC~&?UD^c|poAbym(c@sLuUeDYRG_9k}ADLM+;Ct9D( zeRBAT@e}DMil3sn<|a85F8LAsNF(S}mY3vHfu|-<*-~d1IfgEt6?AvS!Vp2z{wSxl z3%3QW4{To{Y*ISQ@@%u1r}xsei>6+d$`H@^p1J--$u7aWQ|0`oUkJZ+`lb7e=`WbS zl=JYmi8deaNY{{@Ex|64E?F+IeumF7$;;i6$3qOv4PVcAK9hfDerSZ&Hmw@biKn=x zdQDZEDy^j-vU1h3RrgkLhkgz{9n!xtF1U7`Tc~mHe>d_u9`{m@QFl-8KgT-vdGO8PyUV$j zi}~7GeO;%wDtoE)!rd*_s-Zv4yNvdDMa_T;rjSw=362#t!}?6!99TGea2*X~{}xO}JIWWUw(uB9K| z@NwJ8Z7a7+Zg_fw?e@BDx!Y zH{DKew)C;PC-y$^D*0L%`>^WL*SWJd&pz~a#qIU)%-&_bYrix9jLCe>d6CA&7Y?6r zeh~QdqCNNgsRr5i*VOqt`!}Xte?weiF{Ks~WZOrc( z-HVJrV}4-!iS4KT59iN|Z@uqaulzsdf7Sns49go-8Pl0N8yy>?nSTGMs!`nEXK!^o z_1mVKZykFU>~s`$>~C7z^z`6b#f%egCahKb{(Q!{iRUu;S_A4{T)V)Y_$;yea2=0& zYkO;Wn|)tFM}*Wx!|A5w7w~uqa%k{cmrdoEZ^s;PjneQ^$Wq(XB zE%MCOh`AA-Io>jsdRptu@^bdw|MT{9`=hy!xF1)G&(J>+TTr?1+@UY6%f(je3F%l( zbMWc#vzYS1Q9x^jSdZ!_;d0eJuF6BQhtiewFPdHKxZxb5CFl3aL(8{n(wm8UOe9?^Mp05k-A*loR+-^iPE^P#l9&$H9T$q+0Ijz(^k*ZKKu5}=2N#P zn9q4X|NmQ|LqZQHZCl#r9j+@I@oev!EXz$cg_XCt9*eSSw}r8-vDwkJO)K}R|LV8l z)7RDQRjcyNZj3v4s_EcX#_ZSJpLO=5U*2G_JbEWM>JG<72+!miM zT7N_1PQ_E{_WV=(XWp5zW##H4J5$c5T}pfT?4IttXufHyrazm`m&bea))wCTVO!pQ z{pNaGfBIRC+q;{$IqzJ&-)6_2)a577owc?PSrYOkt)mB z$?2cY_spF-x3*62=bePxi?&riPd;})i$DMUE`gGVmt6mMKeygveJhIR>@!u2w#o?{vP3ODqSM8(!-MR7pPJPya z@&%tS-f{oV*4ljj-^8!|{LZZXGy6}s@wUC5XJKb)`N+QL@5?{SozJJ7SDPpPZ_&Tg z>%_(M>wa8)ef`|U85b8$|1^E_{@j|Se_tJVExG>ou|vn?_MNOSHjMic_WSL@@;l|S z?-$?a_kU8OP_OYna3$jP7}zo^M^L^0kQd!rh&g3=PQ#X1sn?!oc9r!BEr4$H2fLc%Zz2H)T=zB(_H? R2@DJj44$rjF6*2UngAQMK|lZi diff --git a/app/src/main/res/drawable-xhdpi/ic_drawer_about.png b/app/src/main/res/drawable-xhdpi/ic_drawer_about.png new file mode 100755 index 0000000000000000000000000000000000000000..c21ab9039df0fcf53eea9d7bc34ca3f90e955639 GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F4fB zorAgh2iXry6%2Qn^q8(U&QE1uu%?00L3zUg!M=yej_wV%2PR7#HrckK;ogC?1jP&c zG78ea^IGuau*4nvrKOZ0w?X)YsI*Q)J?k2_zN0^S1s6=b$EwrI8Ng7@5W$*})-*rV zA^m}cf$fWpQU@#(^gb9qIj7{HT(8#jC)Z)|3ZKt61SMV=O-ajl>6r3cU(nduI8kuJ z{T(@WjM)v&2iD6>>e?=GgR#VjQ-*f3vISp94eoT8&0#WQ4nt2>?Zg*JNHc# z(-f`u(wlpy9dlIv$+GQ;?$!x2H(kE4Mslds97LgDe&RS z@n@VDUaU2>5OZmfU$#NLG179|@`jr$>zi#Iw>ssOZ@$4YS=FKU=H`xj%bKUZy0WA6 zY~m-os}DGpZtEXw40?a%dOpKumLB$XQge?Tva5Jx#WY`ejt|4Sr5_`i%ow7T<{WeQ zt7;+>AheV_ zyV%$MX9$_z*2X}C|{7fs)*mTXVPy6%gt0n=CJ1U)h4T#?0jx6oVVZqf^%iz&ixs|<7(t}@$L zCH~dmm$`jRSrqc`r#?FD9&* z${JF(Rl}*YcIWJ#jM(_~%deN;wJTWSs&O=rNlY^Teb&-bV)aR0lV9?$(fN5|yY=f+ z1|c$^j9RarJFa?u&E$rQjp^5BA6WYT>CCMw9-MmP#4j_IHA~NZEz_**l(lvB%#XM> W7`_c+oyfqzz~JfX=d#Wzp$P!TE3qj6 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_drawer_settings.png b/app/src/main/res/drawable-xhdpi/ic_drawer_settings.png new file mode 100755 index 0000000000000000000000000000000000000000..7ffb6dde372d4b452311472d4b5444d14a80b109 GIT binary patch literal 796 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F(Vbvgg}$n3Z8Z)d;XdM$2u^AUIVM?WN03@*s^ylp&wV2@DH zq)3783LmEA#(uYi#|{2&Hy1?sFnw-xcMJH`U~{qJh{^^|i+qymfF+XF`KpZrdw-ISEzvteGA+Ovo49K-X5r+g<^lt1j5vFIA#1HBEbH=fPRHv6#n zM4e=#?SYF-Pv;-lFzdkQEXC+U3jUSu9S2+h+vS+FUYTJ)s_ZSg-x!IuIZdRJ4mp$8^GlZ8I4~*4Er> zvH2*pA!qsT16B{5uNr9mTzEjy;iQU7nS8+!2NUg0;ubO&CaU){{%(wSElQoa!{6Ui zB}DHGQ(TCOfpCS~g^P10pUR2i)VO+D+BMl_MVw|p(1agy8&-zu>xTZ5W;&U-a0!3m zr9_jLF3Xx;mYrI9BxoPDk@mc$>djIm$6gnCI z%GHTiJG5or#c#Qyje6NRYZ?3)9%s*sy86R9_WF9&UfqX69;K5?H-6YEcHF|B(_`wj zMIEaXzp6Uh-Hr;m?!Wh%+uEaA+_$%#jn(eddRux@Zi^J($;kK2({@g(f8g=2Q}d_0 zU9Pe1r<1}9FK#=(W?HdOtlBfhKE88F1rr)lr$%Xh7Jrt!!cbqMsf~ewfx*+&&t;uc GLK6TfS!Ue; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_more_vert_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_more_vert_black_24dp.png deleted file mode 100644 index 0db5dc3bbed0a407a591aa850283e7bc2b306890..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4i*LmhQHi~JPZsB3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*J~228MJ`7srr@!*8b;ave|*V0mup_^C3mCfs1f*36~^$sO5;&V98$YpBrj zVr2}&cFVdQ&MBb@08KbgJOBUy diff --git a/app/src/main/res/drawable-xhdpi/ic_my_library_music_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_my_library_music_white_24dp.png deleted file mode 100644 index e8a980e61ebee99ca81d38380ed8512710b98655..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 421 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4i*LmhQHi~JPZsB3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*J~221Z#=7srr@!*6f+dL4EUIq>nn&fi1XPncSBLSF2PI69jpDSv^Ih<=dN zX1%2s^kOO+9;v!`F5JDNtL;R|C#%U41!>bK%)I~M+1cmdKI;Vst07Gu6&j0`b diff --git a/app/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_pause_white_24dp.png deleted file mode 100644 index 14b6d17d4a46396d02905e9886265f2beaee6b65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4i*LmhQHi~JPZsB3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*J~21_nz{7srr@!*8z{axo|fFgt$!@19*h_dy}YgTe~DWM4fJG3!u diff --git a/app/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_play_arrow_white_24dp.png deleted file mode 100644 index a55d19922f71c313b6613fd661d95a4ad6c2738a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4i*LmhQHi~JPZsB3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*J~228L~(E{-7)hu>b?$lGin;P&wNh9!&IITKnZC>|0@VKZX1osy>~eM9Wo zbeWfX4yfPsf1b_rHdChHK%-QHx$JHs13tDiA9jW{HaDg)u&B8;@iE-U_^H8YkXGd< z%dp|{Mh(UWRr7nR8Fqe*V>f!N%WU*Wmvz#|dyFoR_p)~!`K{jYG37$+#4i(>l_%?6 zo;q!PUdWd{C5xS`-Yj`+C6w|tKF#RFrLC%xDJLII6;0W?dhz=Ad=>%rADH<$`WPRn T>)c>qU|{fc^>bP0l+XkKjb&|$ diff --git a/app/src/main/res/drawable-xhdpi/ic_queue_music_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_queue_music_black_24dp.png deleted file mode 100644 index ab461b38ea1a28209e1370a1c31ad3f4bc0be77f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4i*LmhQHi~JPZsB3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*J~228M~AE{-7)hu==|<#R9)XuZE`PNT&lf#Y9<70)ScUF5xxWp3M%-)VP$ zPMZ0WnM3hO_8IfnZ)91|v#i_wxlYDjV29pJrgFyfUw;2j@aQTg=NyCaGlhw}~bHSWftO^epo- gmSJ@|p~!v0{M<^PBj;u@FfcH9y85}Sb4q9e0NWp3c>n+a diff --git a/app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_settings_white_24dp.png deleted file mode 100644 index 12e5d100dd80ca03315f8d15af6289c3db015327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 737 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4i*LmhQHi~JPZsB3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*J~22Bt_)7srr@!%t_N&lV08IIh0cuu<)*o657iuK}6-{~DU?H+)gJ+PqZ! z;C@FI+b!3c12(wwSABSLG}vHCeM`iOD#1M+E7r!Dq&a&om6)*N>~U|7yW2mPnV)2v za?X11&G%=@@6R?j&NpxS687s!z50vy5HbWkzcb$n*W}IG|C~*7UC>c~vmJ*R z^FA%K{O@vT{)1_!|A;3Z>77+vUGm(~&(3Sr>01Glm4mjiR<6wcuA~{ch4rTj@1hB8 z>RTj^RJewG3R0fIY4Gcmjf# zaJum>d3?0OI%p&6k+`7{!wtSIO)V(lkBNY{6C4y5_CO+`#ju4vxNCQn_~>+2LmJ@^&28lHTp{ z-*O$jR_>4q*mvrTvDYM(C0oTY|Aj+RP;Bd|KP_CsdHw@+k!r-2sIu57Bq3H zsb~4jv(ZL6(%W2CpNPG_NAA>8>8%?s@BN;(efrmDPWOv?|DFl>c$cp|vu($@-PcNW z3|%`8`7$tY6nVNhhE&A8oom~XYASNP zoHg1pLVE2Lw~c~<8w9p&ir}7j)NMmxqV&hz!bjY6VnoHc?F)26HUx^eR6AOCzg@Ft zOW+0}ZpUN7-|cpOp7VRsoF{W;Kl#U|XME=L$(=v%%l}lj{QPXL-BEEa3$21%hTy4lRa) zbw!hT9wZzHWo#&(Iy;4dop~J>!<^N3RG2L!3PKqk#5`4#JaDjq7$e{9n=C6UJ9pap z#ghUVVmhm&yF_o~O?|je`}%RFyVbWAGS3Oy$$OMD$NW?Qb4vN?ue)Q;bCt}`R$;K{ z&64h#nYOK4IA`}n_7`y%&y+B1SF9*%w>tQ3;gP##PH*Br?RIC~wZ8Zl>kgT%W>?D2 zyG?idH+#b0h?eaWErRWoNv>=8HqvnBq^ZfGCKWmz&MQSDa7 z#Jx;0rzYQUnC&ASdRzNIF2k}L0<7DNFFjk`dN)I-=Kt3X6C<{SH=LeYyy4sA-na>g zcjF5)x_5^+tX@%+A1k`?} zzGp0E2>)~>yyxvzH^w~Ij4dmBb3;NquJ^Q>&T%t+F2OFXyG~(=7gNDXueDds-EiyX z`Y7ee;J0{Iu+Qt(ie4Uu<$-4vm$f_Xabs(^ydq8J@rJb3K~Vd7lB=|iWT$`GERBT{iQruJVmpn*!4; zm>Y_AnQRN(?o@MbMtSbchbF5;k67GT5v>@f%zPj-B>0%b?TpFU+iF)b_;LE@%{WlD z_ecxB)8-q!V*8ct%583aV^|)lr<}LxqPgmmc|9AhEDOCSIDgifEwTruYDsjKM{Hgj z)^Xi~y+G=!P_mlz-vb$GuaCL;_PM&;kzVpRK|21_f8O6JA7}F1KJ(+n;+8PH3WS?62DfZ^S+3S_hm)yvZ%F%k@awl8m1NY8%UjD^eH(noRy1QM{FxJF$+r?$v zA7`;oF+J>?y)9hzqH|Y@y?^$u#Ip5#X17Wd;|@CPTI#o9ud?U6%PO;y+9EGY-p&wj zt>9(%G`^Fv_~9I1O0VmmvT%r{?TU-~!nSIBXt-CM)CKBlrP zVfemhNySc`vz-_3-dufn*4ouhd)hih9-Q+ye$Y?;f=b7clH~Owk6zpS)hJNx?Wo;a z!@c|R=h91Zub2MpYWaB4eS2#KFSq9b-wUzY_YcQ6&$+D9b;Kll{f&&f%jfdk;n^kL zo3`s2*S}-#@^{4_nQEjlns2_|-*c_x>@#YFCps~MjstWOi=?hI$7qLsZ26&*PKc%IJQ3wRC}B_O4{s`kavN z*4R1P1$^#m|3&}w=1y_iGs(03fy^7z5EZ>sUpr#L=6`Tf+^7CP=1r)kyGf5zO~|6d zykRpRmTfn=8n^b}ymbMy{4!CuH)d9;J*(>dK|5*3Ww05my^q0+61+q7^ z&7vmmQEMo^u{TTgu-n#Cx<^cz@372$YW=5p>0*KTt0SC#FKfs?5x4OoONEK=Eap76 zxuFN`mkGE2nBl~_-kkH!nYguF|GXz9E@m}Y+G56ihs#~V)+-GW1kMZbs(UHeM7m>Pc#6%G)-v!mI9|kDb!zO%wA< zR)-{5JeXo7@N5ag0ZUHbS=w9-GAh)qa53ue#(IVt)u>aSi{6wmFfcH9y85}Sb4q9e E0N_sem;e9( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_drawer.png b/app/src/main/res/drawable-xxhdpi/ic_drawer.png deleted file mode 100644 index 9c4685d6e046ce6c450c19426dce627a88718bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F7r+-HnulxKR+l+UEkXn&(dsdx8O z_FO(0ei_C$Olzhsdv@l9eM5Mod&BQWf8(bvo3FBE*gx=jppbAiW9=ihf1EaqG3;wP zl0D@^xfj$noVL#QyskCZIj+?1gO64AZJUhX2W$^kT9W&c>6{`oMhv$Mv zE_w5m6a392%+6J9KR9`cy5>Gt)ybL+wizcTh!$_Ty;M(IeqL1Gdx@k;M(-9U|63E$ zuw}N5tnvk8H|vRh_w|A+NBcc@)Wa>#m)_5(cXW@1&f}*%YSgOc8i?N%XE~^`!WDpQBv#R40Tu z7v-K`C7}^}LREFb-ldZy8sy&pJ9^1$g!mEr^z0_Ym-zZh$ zu`laNwk6xjlHb)GmLGN(t;()Rc4FAe@Fp*00n2WFg~tE03!B6nZHpK#y*<4B*wfT2 zwQaHHQtO_s*gVszp>@ldwBLE&zieJS$m8DT6W8^9%{mKv&G$Rz{n1LzySa+Hp*~RF zL7Zv&vNJ)MIrq)hXB{wPeYTflhmNR1>dI4L|GlgBuYSDaobT<@^uu?ow-xT5@>Kh_ z|0f02!gXu6iY9dFR#$FINWJJ4SIVO0xGD5xhLFQ4UNddO>b9PK>jJxvAG8jJe2VBw zc`de*;V;XYSg&RlOD5N+fp<^tK2f!&;N+CGs{~XkCrq;TW}Dk^@=U z_&xe(O^JOsA!sdEnq9+^J?COgHFqbdE%llblPwkQv~A^+s6`p^hdQE+o-ADDRrhSR zLdayX`Co4>pH`^)WY+rHB`sgyt!z=;nj*5(VoK4p)z71jMLreVT{TVV+B4SGhNeHd z&GbDSy?=Y3aER9l;atKdnqNP0(lxeKcFxgEA!{4G*rK981eITwk_%bOnx8UfYv*Ow zAZ`9#vKFSPXOBH`oczga3#0$39L5X9v7Xzjq&M_vU-htKT4m<2YwlIwPQLw~Qyx1m z=KQDcFUZm-bz-)it3;#8+y2NcYrf1-y;q9g(wtX5=-3FY_{h(_Vz=#fO(#)@sc~Vm__=p{ zxSXw6JIl#;X4UM4cBx;jciZ_c{Fh}K^zv<6)zbL5NPAzwml>DM&rI_4pKmH^BE`Vf nV8vj zmd|PQ2{__xS{QTc{$c9zxZ)f1+RQPX z*}@2Oh4{X&M}A04$c3o*qO##e z&$`VIf)6|v&7E;In8S+mLYOV@4Te2THG(fciaZc|VEBN^c-Ofm_J-w+=8g8s+w@q) z7_KwOGkpIHk^FB zPWYQS&$j=9AB9S)EME2Nym%7+V6DS7#RsVmqWBlE+~jYxW=Nd0{S5OtjSZif7X&D){` zW;G_Oo#r>gn7M;Fq*z}>tT$cJ`AzymjfGEL_=ST%56nGKd*FkbLyPGPn+FBzzfL*^-w?3Z)6H8|!5F&k9&os*9%ii+)4iIu$i&@TKlCdqFTSkOoiIT#ZSB%^&wes7^S+MxG-t88@9Cd>mE9|H?xhLx z7=3Rqp6-0~`66as?T_nN_H4bn^WT+x&{<&CE~RQWz4@w8QPHl&Eiz9RPYsmO;WVDQ=gP#QO!=as zLq5T;f42p%+ofB%Ql%p_ph~Q+5>%k{le%a@zxKXf#(%+&u| z^EP=wbhy%Lo}#}RK|db_G@lDU-{wERTbxJb>8I%&o;w>(J#gLiEAZixrIn{1>3lnt zVpD4x)}-DrPsvYIX%E+#6;{7G{;@y&7q^wgR{xPmSiaO%tz3U9{8ZH4)+b*3R?j#X<+1Mf2Hl5iBOkXu3ElIc{-el3 zF2|pS-Yt9o$Y?nQ)CHu^sQ>Ai*0SW!3UjA`Ix#s#jsF`RS{D4dF4ESzE8k_7U&nV| uL01Q3$BF(kI8U*J&VG8cS?SMT-ucFVJlCBTnZv-qz~JfX=d#Wzp$Pyn6;{0f literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_more_vert_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_more_vert_black_24dp.png deleted file mode 100644 index d32453dada806142f0c1d9ea4b10dee9fd078920..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84i*LmhW}5h&oD4BC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?ren^23ojgJU3+zbrJhE3 z^CZW7Z_|t}ZmCs{u`vOM>rUKMns2+s-cx$}i~YM6rmIby@ggbTeNy+uqc4(540lPy o_UO5J>bZ$8hKs0r{wnuxD+>HGfA;^=3=9kmp00i_>zopr06MO2G5`Po diff --git a/app/src/main/res/drawable-xxhdpi/ic_my_library_music_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_my_library_music_white_24dp.png deleted file mode 100644 index d11ac14e765ec25f68f6e4ceeea0964a3ba7e254..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 577 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84i*LmhW}5h&oD4BC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?Zd_Y%L*<4j z>r)ObmQ>E}Cc7oPPt)GctqYv+YUjaZhh2_x2VYA}$PGCAXc5~L)df+%*Y9PNoWLk~ z;Xg~LN1@L&b2bja|BZdFv{ zCLc|f)EQ!|sy6~TZl(B(JW)QpL&dOl3P0?&N>XT_#V8rj-h3r3%-cMYKWKKOnM0QGX*Q44w3|#TPwU)P_&M{cnMbj) f0`n`23+BOLKN%O-bjC6;Ffe$!`njxgN@xNA|LW{1 diff --git a/app/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_pause_white_24dp.png deleted file mode 100644 index 72dfa9fa6ca284c97ddf67b8f79d895c7415017e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84i*LmhW}5h&oD4BC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?x*=`5*@DvM`jx{d$O|_6efi+9XvIado>?N z!m_6;S(=VGoOfqu*>J&7tC7KNwb2Hq#89>}g~di2SS6=4ny%QvW8>hO`hZzWgW3MV zIinA(Z#9_n1Ii??Fr-d(lnro`yuzHT(>!Z|Z)!nCz@uZ4&nJ8Sy`n9?&T8ZQjLMg5 z`sVFE_i94ax}f9zzKr%S1kIEml&*7>WcYQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?kx;Tbp+kzvmBR{l$5x_GoJ)0Ez-@bLS>x3K{&Nvp!S35K?6!J4NiQJ05 z7P=&4r`Fc0RUyx$w_Hd)#aX43vG(^C<-Zme4jnXPb8VjelyS4rrB7F-*UT35spXRS%D}+D;OXk;vd$@?2>@r_f%5YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?ZL`Wq+Vtzc6D}qN$_xTxezU&;wh38 z5fKo0{vvBp_+pOD-7HN3T(bo3%5iV)&|9K8$wl1jvR+tP)U?k1^X}X_eP(84$)sEP z_s%8$`(t7Jx%U4|OS2r~)i;|Q92Y2DNQrjSU-Uxpu1$dCCW{og6@gqK>2fP#xk~Qa zT-YG;VshpJmNiPZbOQFNUf|m75Uty|Z3b&m6qD?{tOWtHBo@q)nQt!m=D}9g0RE*e zKfc7Cv%DAV-(eTf8U2e<)n(Uw@k`BFdy*FKju*LI`Jyg(3Aagqx!fh^If}Dc)-9F} z?^JHj+E-!oR^5yL#fJs&|$&T#`uM_1N0`YU8>@CB2nQYmbJk31j4XywPxh zUs@#d+k+`@wlH-iUeLI}E_R~vT$Z=r1vg&5Iae;6YbpCb*=WJhp6pKEV7E!_P0ZrT zQBwAuqRdA#m+qUb^2=9>FUlmuZHB(|CYxU(t*618?y#jL6O{AOHn zyO9|hu=Am1%%UR_YAaIe&&_r5PJg^%j`!1jksdKI<{rK^Gbi2Dny$gKG448l>IL1H z7oJ`YCl9GyaE($BE1T@F&iCeoG7b?grq5S?vlN-0a@fk$dbg2LR^Wu?)W#U5*1!Kb zF5H`Gma@q6?mC_;mQyENO;$gY`aa;0r=Z^NJfo6EuBDaNma>E>p8d-D%Arh4S9^=| z!`~5>?T`PxTDbm#Ql93NqhfD@<`m>8$$kCe%o&^zViDn}1o07~cN7r$PLb zfq&%lcjoO$@1o{^?rwBiv3R=Hraw0(=W?ZA)z|!%tiQ?9*Zw)PrN#WhaPCiGIhRj;hUU29CAExuqO3Oc9UvH7S#k29qk-i?!q fwJ}ZWg8q>|-(0OKURN_PFfe$!`njxgN@xNAc^9J@ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_more_vert_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_more_vert_black_24dp.png deleted file mode 100644 index 037b6f117c5bb6c04666de8f01a7ec279bbb8ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4i*Lm29JsRH#0CWC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW??TXS?B%%}R}|>4ry~6TYZy$c&W`R=vPG z>H73P@%kUsGBss685kHC{=Hoj=I=Y}OTgkw*FU(IcG+vM2z{9T=XTDY@2~c{ybwFy z-<4JK=I@SOP3@a6s4=-*{mEXT#(d{9zkw=q56g|a%905u>>Vca1U!{r5aLne<}a7m z^p*eR(c```E8=DTuWFvYf1%Uc9A(znKRy2~xwpQPGR+Ejn*5%b;lp3EW#XHp=f|BW zdw-ex<|1*W18!fOzU3!YDgF*>jnnAg?4ZxWP|y>1qNt`y@%CPS{gm#w4hHFq+&A~P pzHEKtEn2nE<{Z;r0Z_=r?qz65j$k>;82uRJD^FKHmvv4FO#m8WmgfKf diff --git a/app/src/main/res/drawable-xxxhdpi/ic_my_library_music_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_my_library_music_white_24dp.png deleted file mode 100644 index 7e68677daa9d991294054b7d99a560795f39dfd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 739 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4i*Lm29JsRH#0CWC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?MT$n3a&k6FddKI@@{x19e%qMN#=I?%=E7QvU-;A~t zYP;=bz`zVfq77=Y=Q<}I2tT85mht6_^7Y{3PZx`1mtUIrDtVuaW!R%azKX>Ybk)xk zJyveL7ILRuGVHQEpIoEb{i|AG8AZ>e8n<@^`yE+S&9yZo{p_@AuA?C$j7h83G2G&H zNzvZOSg|$mtxVZkLvKaq4{^*!3Fo3%cn(}^+;i)mQUU`T44s!$cqW{yw&FvRRqnPI zY!^d1wKF5{f8V6La_PId6Ye(7pZw6jDqU~2@@se3dmCNUCrIh0r0dzupDSeS&f2_0Ym=jm^X~Vfqmk-W9a`_O$ z9lOR4etD<)6_h@O#w~rf_H^Ipi_4v)X0gBCbk^MOC-apVY4f(V-{IF=-rOyJd#V9L zYQwr!`!`x2SgLiP)%w6htpf{p&&dAZ{PsuVg$K*CSi+n(n~Di12oe)*)3b;Hyf3_J%IcpB0x z)7H(-*wg*4QTaMY3|}>uEU&mjlvl>9T7AtWE5Gk`aqxd%-PO={@4HlE(${^-EK0xQ hIl(dB@L%eI+?2XCOxmejLJSNH44$rjF6*2UngIQ=JQx4~ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pause_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_pause_white_24dp.png deleted file mode 100755 index dd4bfdba5459117c0a954614cdab5177f1b40602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4i*Lm29JsRH#0CWC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?vd$@?2>{j7IvM}~ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_play_arrow_white_24dp.png deleted file mode 100755 index 7cc0084756bfcb034ebd471394ef3c59c518de00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 477 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4i*Lm29JsRH#0CWC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?;mkSN+-?eId@8naAJ&12XY~bw}ZYwLB3&3LYI=#LZCg;jp(PgK@fAS}enX zZd?CU2Avp-PghwP_E;8#voYLR{b&~J0W8!)=i`Sz+n^nPdooU079oHBq zJ&NM?=*Tuzuvurzu(0qgGe=Lhy+c4uHIvh$ThbdW*C{iY9WCWK(6*zGIiu&bN5irm zeQXi3*FQ37KhAPEr2gf!=Xc>r|2osv&h3({-SFJMe2PWURaw;~?UpYKt5Oa2F6Fs< z#hj&B#v$3@I71G{GY*EAi(OwHzB?h|8?#4z0Snt^b_J6eR~tSgTw_|Izia7yDHXQO zObUPRsM*fg+0c~mjIpa}ChLUyvYVBX2@Q;F5=ex@<6rDSt#Sf)&)B|VU|?YIboFyt I=akR{0P;+(@&Et; diff --git a/app/src/main/res/drawable-xxxhdpi/ic_queue_music_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_queue_music_black_24dp.png deleted file mode 100644 index 5d41485cafb92bf8a5843b5577a20dc936336fd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4i*Lm29JsRH#0CWC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?8|KA_6eZGaSg$9@u=gi4 zwihhevPnq$e+Z9|w)KI#DVr-L_v@#co&5djUfwrXCI$#-`0tVYe5TH)$(w7go4%gM z$Rgmtz_|K;9nTZ;{Tln=R~KvBFRdR;TB18RCmiHrZFBUxP`Ijf{*g|xtk%3=$$E>E`#+@W zGsoIi@6|ibbL2HU+tU>5IL@V|_r1QH+L^oOSmDycMoOD^&5XXOz0iF9Mek}R?)4Xo ztC{-a7N>t(WmR~?>Azg|R$ad{*6EF%XQwV*>%aWN{nDhZjeCnY>KE^OD)%R9w*4Xb z$p5_s3;S)4UJmEAxVrXQbl5!4dAHWTQm=BKZgqWTpQ^6ub)WB5g5aQNV7Hg9NcnU= Rk?$3V@9FC2vd$@?2>_Rky1M`X diff --git a/app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_settings_white_24dp.png deleted file mode 100644 index 97e9ca945ce91be7ac959990171271a2dd1a961e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1273 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4i*Lm29JsRH#0CWC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?d0Ic>3ElJD=OVJ8Sv*?p({_b2E)4Q^&5WqskSRO@nwMZ-mF@*S24B{q$6;Rm*c2cpaw%Q_jq?cn^dRN}#m*$nr)8TEE@ ze%LOtz}~`L>duGc7biZyW1N!3s8h(lAd36J-w-C92S)ZAyOZXZPy4)9%)wgJ?$)wR zlch^G8E`bD@A!A)g}~X6Ni#nj3%X@6(JapI!ch+P~`vC zj>k7n1ai&4uyyL}!*%O7vT8ip*M5`HFUWC<*1rQ`?>@%x{jU-dxKaaHigm z(Pn`Q{{xM6Cpl#srWXWG^I|l5Ss?Uale^3_&JE{oT@gr+IIr~Sq}psIubT&UGMF9Z zPi3%=l9Wu)zigwP###E&;1p|_HD|i9;=-@ef~h;>MV5(4GU|k7?3I%_u%9dVr~gu!Kj{Gs zflq@@n=zdTT-PYzVAaZXXP(n5*O)ApfMpk|bS)UBO5aUj*`R5fXX3TC=)6rf%Y{`j z%%ym`hbkBAwYlyKcwANmjWHf1S?So-tvKIBYNV@Jr6xhvzSIEdRao z68niq+-Ije*4p{#VgEw!;NQM*h_0Q$GK=YVbBs#s9{faFQmB|wjoriC~ z6LILR)0r~+LWN<`qsv<#ZGXAvDbIn|%hs|zpDR(9ccc5CFR%Xmy;yJC{r{?R|6r%VB`ixh1aei1Q@gUcn@zfCp?n{5Q9 + + \ No newline at end of file diff --git a/app/src/main/res/drawable/list_activated_dark.xml b/app/src/main/res/drawable/list_activated_dark.xml new file mode 100644 index 00000000..1c431df7 --- /dev/null +++ b/app/src/main/res/drawable/list_activated_dark.xml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/list_divider.xml b/app/src/main/res/drawable/list_divider.xml deleted file mode 100644 index aad60423..00000000 --- a/app/src/main/res/drawable/list_divider.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/list_item_activated.xml b/app/src/main/res/drawable/list_item_activated.xml deleted file mode 100755 index 1fd2fcde..00000000 --- a/app/src/main/res/drawable/list_item_activated.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/list_item_activated_dark.xml b/app/src/main/res/drawable/list_item_activated_dark.xml deleted file mode 100755 index c4018240..00000000 --- a/app/src/main/res/drawable/list_item_activated_dark.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/list_selector.xml b/app/src/main/res/drawable/list_selector.xml index b488c3b3..45ab4502 100755 --- a/app/src/main/res/drawable/list_selector.xml +++ b/app/src/main/res/drawable/list_selector.xml @@ -1,7 +1,5 @@ - - - - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/list_selector_dark.xml b/app/src/main/res/drawable/list_selector_dark.xml index 52b6c885..862b9ce8 100755 --- a/app/src/main/res/drawable/list_selector_dark.xml +++ b/app/src/main/res/drawable/list_selector_dark.xml @@ -1,7 +1,5 @@ - - - - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rect_selected.xml b/app/src/main/res/drawable/rect_selected.xml index e874d43b..105413e5 100644 --- a/app/src/main/res/drawable/rect_selected.xml +++ b/app/src/main/res/drawable/rect_selected.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/rect_selected_dark.xml b/app/src/main/res/drawable/rect_selected_dark.xml index 431ac349..ea26e583 100644 --- a/app/src/main/res/drawable/rect_selected_dark.xml +++ b/app/src/main/res/drawable/rect_selected_dark.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_selected.xml b/app/src/main/res/drawable/round_selected.xml index 190dd7df..1b25273c 100644 --- a/app/src/main/res/drawable/round_selected.xml +++ b/app/src/main/res/drawable/round_selected.xml @@ -1,5 +1,5 @@ - - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_selected_dark.xml b/app/src/main/res/drawable/round_selected_dark.xml index 33405edb..57f568c9 100644 --- a/app/src/main/res/drawable/round_selected_dark.xml +++ b/app/src/main/res/drawable/round_selected_dark.xml @@ -1,5 +1,5 @@ - - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_selector.xml b/app/src/main/res/drawable/round_selector.xml index b12bc490..a12a0b25 100644 --- a/app/src/main/res/drawable/round_selector.xml +++ b/app/src/main/res/drawable/round_selector.xml @@ -1,7 +1,4 @@ - - - + - - + \ No newline at end of file diff --git a/app/src/main/res/drawable/round_selector_dark.xml b/app/src/main/res/drawable/round_selector_dark.xml index 8eaa1e81..149dc119 100644 --- a/app/src/main/res/drawable/round_selector_dark.xml +++ b/app/src/main/res/drawable/round_selector_dark.xml @@ -1,7 +1,4 @@ - - - + - - + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_music_controller.xml b/app/src/main/res/layout-land/activity_music_controller.xml index e35c29ed..c714d219 100644 --- a/app/src/main/res/layout-land/activity_music_controller.xml +++ b/app/src/main/res/layout-land/activity_music_controller.xml @@ -1,14 +1,14 @@ - + + android:orientation="horizontal"> + android:transitionName="@string/transition_album_cover" + tools:ignore="ContentDescription,UnusedAttribute" /> + android:scaleType="centerCrop" + tools:ignore="ContentDescription" /> + android:background="@drawable/shadow_up" /> + android:orientation="horizontal" + tools:ignore="RtlHardcoded"> + android:textSize="16sp" + tools:ignore="RtlHardcoded" /> + android:textSize="16sp" + tools:ignore="RtlHardcoded" /> @@ -78,15 +83,15 @@ android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="?default_bar_color" - android:orientation="vertical" - > + android:orientation="vertical"> + android:transitionName="@string/transition_album_text" + tools:ignore="UnusedAttribute"> + android:textColor="?attr/title_text_color" /> + android:textColor="?attr/caption_text_color" /> @@ -112,10 +117,11 @@ android:id="@+id/media_controller_placeholder" android:layout_width="match_parent" android:layout_height="88dp" - android:layout_alignParentBottom="true" + android:layout_gravity="bottom" android:layout_margin="16dp" android:background="?attr/music_controller_container_color" - android:elevation="1dp"> + android:elevation="1dp" + tools:ignore="UnusedAttribute"> @@ -128,13 +134,13 @@ android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_margin="16dp" - android:background="?attr/music_controller_container_color"> + android:background="?attr/music_controller_container_color" + tools:ignore="ContentDescription"> + android:layout_centerInParent="true" /> + android:src="@drawable/ic_skip_previous_white_48dp" /> + android:src="@drawable/ic_skip_next_white_48dp" /> + android:src="@drawable/ic_repeat_grey600_48dp" /> + android:src="@drawable/ic_shuffle_grey600_48dp" /> @@ -194,8 +208,8 @@ android:elevation="1dp" android:padding="0dp" android:progressTint="@color/materialmusic_accent_color" - android:thumbTint="@color/materialmusic_accent_color_darker"/> - + android:thumbTint="@color/materialmusic_accent_color_darker" + tools:ignore="UnusedAttribute" /> @@ -204,20 +218,22 @@ + android:background="@android:color/transparent" + tools:ignore="ContentDescription" /> + android:background="@android:color/transparent" /> + - + diff --git a/app/src/main/res/layout-v21/notification_playing.xml b/app/src/main/res/layout-v21/notification_playing.xml index d2e06f2f..2baa5969 100644 --- a/app/src/main/res/layout-v21/notification_playing.xml +++ b/app/src/main/res/layout-v21/notification_playing.xml @@ -1,5 +1,4 @@ - - - + android:layout_height="64dp"> + + + android:layout_height="wrap_content" + android:layout_gravity="fill_vertical" + android:layout_weight="1" + android:gravity="center_vertical" + android:minHeight="@dimen/notification_big_icon_height" + android:orientation="vertical" + android:paddingBottom="@dimen/notification_info_container_padding_bottom" + android:paddingStart="@dimen/notification_info_container_padding_left"> - - - + android:singleLine="true" + android:textAppearance="@style/Theme.MaterialMusic.Notification.Title" /> - + - - - - - - - - - - - + - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-v21/notification_playing_expanded.xml b/app/src/main/res/layout-v21/notification_playing_expanded.xml index dff05784..ba3172c2 100644 --- a/app/src/main/res/layout-v21/notification_playing_expanded.xml +++ b/app/src/main/res/layout-v21/notification_playing_expanded.xml @@ -1,5 +1,4 @@ - - - + android:layout_height="128dp" + tools:ignore="ContentDescription"> + android:scaleType="centerCrop" /> + android:src="@drawable/ic_close_white_24dp" /> + android:textAppearance="@style/Theme.MaterialMusic.Notification.Title" /> + android:textAppearance="@style/Theme.MaterialMusic.Notification" /> + android:textAppearance="@style/Theme.MaterialMusic.Notification" /> + android:src="@drawable/ic_skip_previous_white_48dp" /> + android:src="@drawable/ic_play_arrow_white_48dp" /> + android:src="@drawable/ic_skip_next_white_48dp" /> + + android:layout_toEndOf="@+id/album_art" + android:background="@drawable/notification_template_divider_media" /> diff --git a/app/src/main/res/layout/activity_album_detail.xml b/app/src/main/res/layout/activity_album_detail.xml index 367a7b9d..4a21af2e 100644 --- a/app/src/main/res/layout/activity_album_detail.xml +++ b/app/src/main/res/layout/activity_album_detail.xml @@ -1,7 +1,7 @@ - + + android:transitionName="@string/transition_album_cover" + tools:ignore="ContentDescription,UnusedAttribute" /> + android:background="?android:attr/colorBackground" /> + android:scrollbars="none" /> + android:textColor="?attr/title_text_color" + tools:ignore="UnusedAttribute" /> + android:background="@android:color/transparent" /> @@ -62,19 +64,20 @@ android:id="@+id/statusBar" android:layout_width="match_parent" android:layout_height="@dimen/statusMargin" - android:background="@android:color/transparent"/> + android:background="@android:color/transparent" /> + android:background="@android:color/transparent" /> - + tools:ignore="RtlHardcoded" /> + + diff --git a/app/src/main/res/layout/activity_album_tag_editor.xml b/app/src/main/res/layout/activity_album_tag_editor.xml index 928b37bb..cdaef626 100644 --- a/app/src/main/res/layout/activity_album_tag_editor.xml +++ b/app/src/main/res/layout/activity_album_tag_editor.xml @@ -1,5 +1,5 @@ - + android:src="@drawable/default_album_art" /> + android:textColor="@color/white" /> @@ -67,7 +67,7 @@ android:fontFamily="sans-serif" android:singleLine="true" android:text="@string/album_artist" - android:textAppearance="@style/TextAppearance.AppCompat.Body2"/> + android:textAppearance="@style/TextAppearance.AppCompat.Body2" /> + android:textColor="?attr/title_text_color" /> + android:textAppearance="@style/TextAppearance.AppCompat.Body2" /> + android:textColor="?attr/title_text_color" /> + android:textAppearance="@style/TextAppearance.AppCompat.Body2" /> + android:textColor="?attr/title_text_color" /> @@ -146,16 +146,17 @@ + android:gravity="start|left|top" + android:background="#00000000" + tools:ignore="RtlHardcoded" /> + android:src="@drawable/ic_done_white_24dp" + tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/activity_artist_detail.xml b/app/src/main/res/layout/activity_artist_detail.xml index ee0f3e5c..b45f778c 100644 --- a/app/src/main/res/layout/activity_artist_detail.xml +++ b/app/src/main/res/layout/activity_artist_detail.xml @@ -1,7 +1,7 @@ - + + android:transitionName="@string/transition_artist_image" + tools:ignore="ContentDescription,UnusedAttribute" /> + android:background="?android:attr/colorBackground" /> + android:scrollbars="none" /> + android:textColor="?attr/title_text_color" + tools:ignore="UnusedAttribute" /> + android:background="@android:color/transparent" /> @@ -62,19 +64,22 @@ android:id="@+id/statusBar" android:layout_width="match_parent" android:layout_height="@dimen/statusMargin" - android:background="@android:color/transparent"/> + android:background="@android:color/transparent" + tools:ignore="ContentDescription" /> + android:background="@android:color/transparent" /> + - + tools:ignore="RtlHardcoded" /> + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index cda0740c..c94c9c6c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,13 +1,11 @@ - - + android:clipToPadding="false" /> + android:background="?attr/colorPrimary" + tools:ignore="ContentDescription" /> + android:textSize="20sp" + tools:ignore="RtlHardcoded" /> + + app:pstsTabPaddingLeftRight="8dp" + tools:ignore="NewApi,RtlSymmetry" /> + android:background="@drawable/shadow_down" /> + android:layout_gravity="end|right|bottom" + android:fitsSystemWindows="true" + tools:ignore="RtlHardcoded"> + android:layout_margin="16dp" /> @@ -95,7 +97,8 @@ android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent" android:layout_gravity="start" - tools:layout="@layout/fragment_navigation_drawer"/> + tools:layout="@layout/fragment_navigation_drawer" /> + diff --git a/app/src/main/res/layout/activity_music_controller.xml b/app/src/main/res/layout/activity_music_controller.xml index a27d13b8..d44efb9f 100644 --- a/app/src/main/res/layout/activity_music_controller.xml +++ b/app/src/main/res/layout/activity_music_controller.xml @@ -1,9 +1,9 @@ + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + tools:context="com.kabouzeid.gramophone.ui.activities.AlbumDetailActivity$PlaceholderFragment"> + android:transitionName="@string/transition_album_cover" + tools:ignore="UnusedAttribute" /> + + android:layout_height="@dimen/statusMargin" /> + + android:layout_height="?actionBarSize" /> + android:layout_alignBottom="@+id/dummy_toolbar" /> + android:layout_alignTop="@+id/progress_container" /> + android:textStyle="bold" + tools:ignore="RtlHardcoded" /> + android:textSize="16sp" + tools:ignore="RtlHardcoded" /> @@ -87,7 +92,8 @@ android:paddingLeft="72dp" android:paddingRight="72dp" android:paddingTop="16dp" - android:transitionName="@string/transition_album_text"> + android:transitionName="@string/transition_album_text" + tools:ignore="UnusedAttribute"> + android:textColor="?attr/title_text_color" /> + android:textColor="?attr/caption_text_color" /> @@ -116,7 +122,8 @@ android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_margin="16dp" - android:background="?music_controller_container_color"> + android:background="?music_controller_container_color" + tools:ignore="ContentDescription"> + android:src="@drawable/ic_skip_previous_white_48dp" /> + android:src="@drawable/ic_skip_next_white_48dp" /> + android:src="@drawable/ic_repeat_grey600_48dp" /> + android:src="@drawable/ic_shuffle_grey600_48dp" /> + android:layout_centerInParent="true" /> @@ -177,7 +192,8 @@ android:id="@+id/progress_slider" style="@style/MusicProgressSlider" android:layout_above="@+id/footer" - android:elevation="2dp"/> + android:elevation="2dp" + tools:ignore="UnusedAttribute" /> + android:background="@android:color/transparent" + tools:ignore="ContentDescription" /> + android:background="@android:color/transparent" /> + diff --git a/app/src/main/res/layout/activity_playlist_detail.xml b/app/src/main/res/layout/activity_playlist_detail.xml index eb3dc367..237e50b7 100644 --- a/app/src/main/res/layout/activity_playlist_detail.xml +++ b/app/src/main/res/layout/activity_playlist_detail.xml @@ -1,5 +1,5 @@ - @@ -11,7 +11,7 @@ + android:background="?colorPrimary" /> + android:scrollbars="vertical" /> + android:layout_gravity="right|bottom|end" + android:fitsSystemWindows="true" + tools:ignore="RtlHardcoded"> + android:layout_margin="16dp" /> - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_preferences.xml b/app/src/main/res/layout/activity_preferences.xml index 3dc083f4..b2bdfe69 100644 --- a/app/src/main/res/layout/activity_preferences.xml +++ b/app/src/main/res/layout/activity_preferences.xml @@ -8,10 +8,11 @@ + android:background="?colorPrimary" /> + android:layout_height="match_parent" /> + diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml index ef6025f1..0a11a8b0 100644 --- a/app/src/main/res/layout/activity_search.xml +++ b/app/src/main/res/layout/activity_search.xml @@ -1,5 +1,4 @@ - + app:elevation="@dimen/toolbar_elevation" /> + android:background="@drawable/shadow_down" /> + android:dividerHeight="0px" /> + diff --git a/app/src/main/res/layout/activity_song_tag_editor.xml b/app/src/main/res/layout/activity_song_tag_editor.xml index eca27e7f..700a8c9e 100644 --- a/app/src/main/res/layout/activity_song_tag_editor.xml +++ b/app/src/main/res/layout/activity_song_tag_editor.xml @@ -1,6 +1,5 @@ - + android:src="@drawable/default_album_art" /> + android:textColor="@color/white" /> + android:textColor="@color/white" /> @@ -81,7 +80,7 @@ android:fontFamily="sans-serif" android:singleLine="true" android:text="@string/artist" - android:textAppearance="@style/TextAppearance.AppCompat.Body2"/> + android:textAppearance="@style/TextAppearance.AppCompat.Body2" /> + android:textColor="?attr/title_text_color" /> + android:textAppearance="@style/TextAppearance.AppCompat.Body2" /> + android:textColor="?attr/title_text_color" /> + android:textAppearance="@style/TextAppearance.AppCompat.Body2" /> + android:textColor="?attr/title_text_color" /> + android:textAppearance="@style/TextAppearance.AppCompat.Body2" /> + android:textColor="?attr/title_text_color" /> @@ -187,16 +186,17 @@ + android:layout_gravity="start|left|top" + android:background="#00000000" + tools:ignore="RtlHardcoded" /> + android:src="@drawable/ic_done_white_24dp" + tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/artist_detail_header.xml b/app/src/main/res/layout/artist_detail_header.xml index d65138d2..8182109c 100644 --- a/app/src/main/res/layout/artist_detail_header.xml +++ b/app/src/main/res/layout/artist_detail_header.xml @@ -1,7 +1,7 @@ + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + android:scrollbars="none" /> + android:background="?separator_color" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_color_chooser.xml b/app/src/main/res/layout/dialog_color_chooser.xml new file mode 100644 index 00000000..7cce4698 --- /dev/null +++ b/app/src/main/res/layout/dialog_color_chooser.xml @@ -0,0 +1,13 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_empty_frame.xml b/app/src/main/res/layout/dialog_empty_frame.xml deleted file mode 100644 index a938862c..00000000 --- a/app/src/main/res/layout/dialog_empty_frame.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_file_details.xml b/app/src/main/res/layout/dialog_file_details.xml index 348e6899..8ee31e93 100644 --- a/app/src/main/res/layout/dialog_file_details.xml +++ b/app/src/main/res/layout/dialog_file_details.xml @@ -1,9 +1,10 @@ - + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="vertical" + tools:ignore="NewApi,RtlSymmetry"> - + android:textSize="16sp" /> - + android:textSize="16sp" /> - + android:textSize="16sp" /> - + android:textSize="16sp" /> - + android:textSize="16sp" /> - + android:textSize="16sp" /> + android:textSize="16sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_playlist.xml b/app/src/main/res/layout/dialog_playlist.xml index 45292f5e..c576f1d1 100644 --- a/app/src/main/res/layout/dialog_playlist.xml +++ b/app/src/main/res/layout/dialog_playlist.xml @@ -9,4 +9,4 @@ app:drag_start_mode="onLongPress" app:float_alpha="0.5" app:max_drag_scroll_speed="2" - app:use_default_controller="true"/> + app:use_default_controller="true" /> diff --git a/app/src/main/res/layout/fragment_album_view.xml b/app/src/main/res/layout/fragment_album_view.xml index 32c27895..47b18e91 100644 --- a/app/src/main/res/layout/fragment_album_view.xml +++ b/app/src/main/res/layout/fragment_album_view.xml @@ -10,7 +10,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - android:scrollbars="vertical"/> + android:scrollbars="vertical" /> + diff --git a/app/src/main/res/layout/fragment_artist_view.xml b/app/src/main/res/layout/fragment_artist_view.xml index 2050d5b9..aafbad23 100644 --- a/app/src/main/res/layout/fragment_artist_view.xml +++ b/app/src/main/res/layout/fragment_artist_view.xml @@ -10,5 +10,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" - android:scrollbars="vertical"/> + android:scrollbars="vertical" /> + diff --git a/app/src/main/res/layout/fragment_drawer.xml b/app/src/main/res/layout/fragment_drawer.xml deleted file mode 100644 index ce354664..00000000 --- a/app/src/main/res/layout/fragment_drawer.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/app/src/main/res/layout/fragment_navigation_drawer.xml b/app/src/main/res/layout/fragment_navigation_drawer.xml index 47ef5bab..dcbd1fb9 100644 --- a/app/src/main/res/layout/fragment_navigation_drawer.xml +++ b/app/src/main/res/layout/fragment_navigation_drawer.xml @@ -1,5 +1,4 @@ - + android:src="@drawable/default_album_art" + tools:ignore="ContentDescription,UnusedAttribute" /> + android:background="@drawable/shadow_up" /> + android:textSize="14sp" /> + android:textSize="14sp" /> +