├── MODULE_LICENSE_APACHE2 ├── proguard.pro ├── graphics └── icon.xcf ├── src ├── mobile │ ├── res │ │ ├── values │ │ │ ├── values.xml │ │ │ ├── styles.xml │ │ │ ├── themes.xml │ │ │ └── ids.xml │ │ ├── values-w600dp-h400dp │ │ │ ├── values.xml │ │ │ └── styles.xml │ │ ├── drawable │ │ │ ├── appwidget_preview.png │ │ │ ├── appwidget_preview_w600dp.png │ │ │ ├── actionbar_background.xml │ │ │ ├── nowplaying_background.xml │ │ │ ├── appwidget_background.xml │ │ │ ├── list_selector_background_transition.xml │ │ │ ├── button_background.xml │ │ │ ├── playlist_tile.xml │ │ │ └── list_selector_background.xml │ │ ├── layout │ │ │ ├── create_playlist.xml │ │ │ ├── rename_playlist.xml │ │ │ ├── audio_player.xml │ │ │ ├── track_list_item.xml │ │ │ ├── playlist_shortcut.xml │ │ │ ├── edit_track_list_item.xml │ │ │ ├── music_browser_activity.xml │ │ │ ├── about.xml │ │ │ ├── audio_player_port.xml │ │ │ ├── audio_player_land.xml │ │ │ ├── nowplaying.xml │ │ │ ├── player_header.xml │ │ │ ├── appwidget.xml │ │ │ ├── player_footer.xml │ │ │ └── narrow_player_footer.xml │ │ ├── layout-h400dp │ │ │ └── audio_player.xml │ │ ├── layout-w800dp │ │ │ ├── audio_player.xml │ │ │ └── narrow_player_footer.xml │ │ ├── menu │ │ │ ├── browser_menu.xml │ │ │ └── player_menu.xml │ │ ├── xml │ │ │ ├── appwidget_info.xml │ │ │ ├── searchable.xml │ │ │ └── preferences.xml │ │ ├── xml-w600dp-h400dp │ │ │ └── appwidget_info.xml │ │ ├── menu-w800dp │ │ │ └── player_menu.xml │ │ ├── menu-h400dp │ │ │ └── player_menu.xml │ │ ├── menu-w600dp-h400dp │ │ │ └── browser_menu.xml │ │ ├── xml-v19 │ │ │ └── preferences.xml │ │ ├── layout-w600dp-h400dp │ │ │ ├── music_browser_activity.xml │ │ │ ├── appwidget.xml │ │ │ └── narrow_player_footer.xml │ │ └── layout-w500dp │ │ │ └── music_browser_activity.xml │ └── java │ │ └── nu │ │ └── staldal │ │ └── djdplayer │ │ └── mobile │ │ ├── NarrowPlayerFooterFragment.java │ │ ├── PlaylistShortcutActivity.java │ │ ├── CategoryFragment.java │ │ ├── RescanActivity.java │ │ ├── SimpleCursorAdapterWithContextMenu.java │ │ ├── BrowserFragment.java │ │ ├── MediaButtonIntentReceiver.java │ │ └── MetadataCategoryListAdapter.java ├── main │ ├── res │ │ ├── drawable-hdpi │ │ │ ├── app_icon.png │ │ │ ├── ic_menu_add.png │ │ │ ├── ic_menu_eq.png │ │ │ ├── ic_menu_share.png │ │ │ ├── ic_menu_zoom.png │ │ │ ├── ic_context_menu.png │ │ │ ├── ic_menu_delete.png │ │ │ ├── ic_menu_search.png │ │ │ ├── ic_menu_shuffle.png │ │ │ ├── ic_menu_unzoom.png │ │ │ ├── ic_mp_song_list.png │ │ │ ├── ic_section_menu.png │ │ │ ├── ic_menu_interleave.png │ │ │ ├── ic_menu_play_clip.png │ │ │ ├── ic_menu_uniqueify.png │ │ │ ├── ic_mp_artist_list.png │ │ │ ├── ic_menu_info_details.png │ │ │ ├── ic_menu_preferences.png │ │ │ ├── ic_mp_artist_playback.png │ │ │ ├── ic_mp_genre_playback.png │ │ │ ├── ic_mp_repeat_all_btn.png │ │ │ ├── ic_mp_repeat_off_btn.png │ │ │ ├── ic_mp_repeat_once_btn.png │ │ │ ├── ic_mp_song_playback.png │ │ │ ├── playlist_tile_drag.9.png │ │ │ ├── ic_menu_clear_playlist.png │ │ │ ├── playlist_tile_normal.9.png │ │ │ ├── playlist_tile_pressed.9.png │ │ │ ├── stat_notify_musicplayer.png │ │ │ ├── albumart_mp_unknown_list.png │ │ │ ├── ic_mp_repeat_stopafter_btn.png │ │ │ ├── playlist_tile_longpress.9.png │ │ │ ├── playlist_tile_selected.9.png │ │ │ ├── indicator_ic_mp_playing_list.png │ │ │ ├── indicator_ic_mp_crossfading_list.png │ │ │ └── ic_launcher_shortcut_music_playlist.png │ │ ├── drawable-mdpi │ │ │ ├── app_icon.png │ │ │ ├── ic_menu_add.png │ │ │ ├── ic_menu_eq.png │ │ │ ├── ic_menu_share.png │ │ │ ├── ic_menu_zoom.png │ │ │ ├── ic_context_menu.png │ │ │ ├── ic_menu_delete.png │ │ │ ├── ic_menu_search.png │ │ │ ├── ic_menu_shuffle.png │ │ │ ├── ic_menu_unzoom.png │ │ │ ├── ic_mp_song_list.png │ │ │ ├── ic_section_menu.png │ │ │ ├── ic_menu_interleave.png │ │ │ ├── ic_menu_play_clip.png │ │ │ ├── ic_menu_uniqueify.png │ │ │ ├── ic_mp_artist_list.png │ │ │ ├── ic_menu_info_details.png │ │ │ ├── ic_menu_preferences.png │ │ │ ├── ic_mp_artist_playback.png │ │ │ ├── ic_mp_genre_playback.png │ │ │ ├── ic_mp_repeat_all_btn.png │ │ │ ├── ic_mp_repeat_off_btn.png │ │ │ ├── ic_mp_repeat_once_btn.png │ │ │ ├── ic_mp_song_playback.png │ │ │ ├── playlist_tile_drag.9.png │ │ │ ├── ic_menu_clear_playlist.png │ │ │ ├── playlist_tile_normal.9.png │ │ │ ├── playlist_tile_pressed.9.png │ │ │ ├── stat_notify_musicplayer.png │ │ │ ├── albumart_mp_unknown_list.png │ │ │ ├── ic_mp_repeat_stopafter_btn.png │ │ │ ├── playlist_tile_longpress.9.png │ │ │ ├── playlist_tile_selected.9.png │ │ │ ├── indicator_ic_mp_playing_list.png │ │ │ ├── indicator_ic_mp_crossfading_list.png │ │ │ └── ic_launcher_shortcut_music_playlist.png │ │ ├── drawable-xhdpi │ │ │ ├── app_icon.png │ │ │ ├── ic_menu_eq.png │ │ │ ├── ic_menu_add.png │ │ │ ├── ic_menu_zoom.png │ │ │ ├── ic_context_menu.png │ │ │ ├── ic_menu_delete.png │ │ │ ├── ic_menu_search.png │ │ │ ├── ic_menu_share.png │ │ │ ├── ic_menu_shuffle.png │ │ │ ├── ic_menu_unzoom.png │ │ │ ├── ic_section_menu.png │ │ │ ├── ic_menu_info_details.png │ │ │ ├── ic_menu_preferences.png │ │ │ ├── ic_mp_repeat_all_btn.png │ │ │ ├── ic_mp_repeat_off_btn.png │ │ │ ├── ic_mp_repeat_once_btn.png │ │ │ └── ic_mp_repeat_stopafter_btn.png │ │ ├── drawable-xxhdpi │ │ │ └── app_icon.png │ │ ├── values │ │ │ ├── colors.xml │ │ │ ├── strings2.xml │ │ │ ├── dimens.xml │ │ │ └── arrays.xml │ │ └── layout │ │ │ └── select_music_folder.xml │ ├── java │ │ └── nu │ │ │ └── staldal │ │ │ ├── ui │ │ │ └── WithSectionMenu.java │ │ │ └── djdplayer │ │ │ ├── FragmentServiceConnection.java │ │ │ ├── IdAndName.java │ │ │ ├── AboutActivity.java │ │ │ ├── SettingsFragment.java │ │ │ ├── MusicAlphabetIndexer.java │ │ │ ├── ShufflePlaylistTask.java │ │ │ ├── SettingsActivity.java │ │ │ └── provider │ │ │ └── CursorWithCountColumn.java │ └── AndroidManifest.xml ├── tv │ ├── res │ │ ├── drawable-xhdpi │ │ │ └── app_banner.png │ │ ├── values │ │ │ ├── strings2.xml │ │ │ ├── dimens.xml │ │ │ ├── colors.xml │ │ │ ├── values.xml │ │ │ └── styles.xml │ │ ├── layout │ │ │ ├── tv_browser_activity.xml │ │ │ ├── tv_play_queue_fragment.xml │ │ │ ├── tv_category_details_activity.xml │ │ │ ├── tv_playback_activity.xml │ │ │ ├── action_card_view.xml │ │ │ ├── about.xml │ │ │ ├── song_list_row.xml │ │ │ ├── text_card_view.xml │ │ │ └── nowplaying.xml │ │ ├── drawable │ │ │ └── song_list_row_background.xml │ │ └── xml │ │ │ └── preferences.xml │ ├── java │ │ └── nu │ │ │ └── staldal │ │ │ ├── djdplayer │ │ │ └── tv │ │ │ │ ├── SettingsItem.java │ │ │ │ ├── FolderItem.java │ │ │ │ ├── CategoryItem.java │ │ │ │ ├── SongItem.java │ │ │ │ ├── ActionCardPresenter.java │ │ │ │ ├── CategoryCardPresenter.java │ │ │ │ ├── TvMediaPlaybackService.java │ │ │ │ ├── SongRowPresenter.java │ │ │ │ ├── BrowserActivity.java │ │ │ │ └── PlaybackActivity.java │ │ │ └── leanback │ │ │ ├── ClickableItemBridgeAdapter.java │ │ │ ├── ActionCardView.java │ │ │ └── TextCardView.java │ └── AndroidManifest.xml └── test │ └── java │ └── nu │ └── staldal │ └── djdplayer │ └── tests │ └── ID3UtilsTest.java ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── LICENSE ├── lint.xml ├── README ├── gradlew.bat └── HISTORY /MODULE_LICENSE_APACHE2: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /proguard.pro: -------------------------------------------------------------------------------- 1 | # For RetroLambda 2 | -dontwarn java.lang.invoke.* -------------------------------------------------------------------------------- /graphics/icon.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/graphics/icon.xcf -------------------------------------------------------------------------------- /src/mobile/res/values/values.xml: -------------------------------------------------------------------------------- 1 | 2 | false 3 | -------------------------------------------------------------------------------- /src/mobile/res/values-w600dp-h400dp/values.xml: -------------------------------------------------------------------------------- 1 | 2 | true 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/app_icon.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/app_icon.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_add.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_eq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_eq.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_add.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_eq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_eq.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/app_icon.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_menu_eq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_menu_eq.png -------------------------------------------------------------------------------- /src/main/res/drawable-xxhdpi/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xxhdpi/app_icon.png -------------------------------------------------------------------------------- /src/tv/res/drawable-xhdpi/app_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/tv/res/drawable-xhdpi/app_banner.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_share.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_zoom.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_share.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_zoom.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_menu_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_menu_add.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_menu_zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_menu_zoom.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_context_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_context_menu.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_delete.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_search.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_shuffle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_shuffle.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_unzoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_unzoom.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_mp_song_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_mp_song_list.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_section_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_section_menu.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_context_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_context_menu.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_delete.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_search.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_shuffle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_shuffle.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_unzoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_unzoom.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_mp_song_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_mp_song_list.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_section_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_section_menu.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_context_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_context_menu.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_menu_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_menu_delete.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_menu_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_menu_search.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_menu_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_menu_share.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_menu_shuffle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_menu_shuffle.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_menu_unzoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_menu_unzoom.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_section_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_section_menu.png -------------------------------------------------------------------------------- /src/mobile/res/drawable/appwidget_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/mobile/res/drawable/appwidget_preview.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | gen/* 2 | out/* 3 | bin/* 4 | build/* 5 | local.properties 6 | gradle.properties 7 | tests/gen/* 8 | .idea 9 | *.iml 10 | .gradle 11 | -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_interleave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_interleave.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_play_clip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_play_clip.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_uniqueify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_uniqueify.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_mp_artist_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_mp_artist_list.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_interleave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_interleave.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_play_clip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_play_clip.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_uniqueify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_uniqueify.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_mp_artist_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_mp_artist_list.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_info_details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_info_details.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_preferences.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_mp_artist_playback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_mp_artist_playback.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_mp_genre_playback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_mp_genre_playback.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_mp_repeat_all_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_mp_repeat_all_btn.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_mp_repeat_off_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_mp_repeat_off_btn.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_mp_repeat_once_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_mp_repeat_once_btn.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_mp_song_playback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_mp_song_playback.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/playlist_tile_drag.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/playlist_tile_drag.9.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_info_details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_info_details.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_preferences.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_mp_artist_playback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_mp_artist_playback.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_mp_genre_playback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_mp_genre_playback.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_mp_repeat_all_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_mp_repeat_all_btn.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_mp_repeat_off_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_mp_repeat_off_btn.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_mp_repeat_once_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_mp_repeat_once_btn.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_mp_song_playback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_mp_song_playback.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/playlist_tile_drag.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/playlist_tile_drag.9.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_menu_info_details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_menu_info_details.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_menu_preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_menu_preferences.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_mp_repeat_all_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_mp_repeat_all_btn.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_mp_repeat_off_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_mp_repeat_off_btn.png -------------------------------------------------------------------------------- /src/mobile/res/drawable/appwidget_preview_w600dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/mobile/res/drawable/appwidget_preview_w600dp.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_menu_clear_playlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_menu_clear_playlist.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/playlist_tile_normal.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/playlist_tile_normal.9.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/playlist_tile_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/playlist_tile_pressed.9.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/stat_notify_musicplayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/stat_notify_musicplayer.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_menu_clear_playlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_menu_clear_playlist.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/playlist_tile_normal.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/playlist_tile_normal.9.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/playlist_tile_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/playlist_tile_pressed.9.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/stat_notify_musicplayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/stat_notify_musicplayer.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_mp_repeat_once_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_mp_repeat_once_btn.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/albumart_mp_unknown_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/albumart_mp_unknown_list.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_mp_repeat_stopafter_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_mp_repeat_stopafter_btn.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/playlist_tile_longpress.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/playlist_tile_longpress.9.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/playlist_tile_selected.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/playlist_tile_selected.9.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/albumart_mp_unknown_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/albumart_mp_unknown_list.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_mp_repeat_stopafter_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_mp_repeat_stopafter_btn.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/playlist_tile_longpress.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/playlist_tile_longpress.9.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/playlist_tile_selected.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/playlist_tile_selected.9.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/indicator_ic_mp_playing_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/indicator_ic_mp_playing_list.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/indicator_ic_mp_playing_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/indicator_ic_mp_playing_list.png -------------------------------------------------------------------------------- /src/main/res/drawable-xhdpi/ic_mp_repeat_stopafter_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-xhdpi/ic_mp_repeat_stopafter_btn.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/indicator_ic_mp_crossfading_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/indicator_ic_mp_crossfading_list.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/indicator_ic_mp_crossfading_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/indicator_ic_mp_crossfading_list.png -------------------------------------------------------------------------------- /src/main/res/drawable-hdpi/ic_launcher_shortcut_music_playlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-hdpi/ic_launcher_shortcut_music_playlist.png -------------------------------------------------------------------------------- /src/main/res/drawable-mdpi/ic_launcher_shortcut_music_playlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikaelstaldal/DJDPlayer/HEAD/src/main/res/drawable-mdpi/ic_launcher_shortcut_music_playlist.png -------------------------------------------------------------------------------- /src/tv/res/values/strings2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | " / " 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #6633b5e5 4 | #ff5a5a5a 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2005-2008, The Android Open Source Project 2 | Copyright (c) 2012-2016, Mikael Ståldal 3 | 4 | Licensed under the Apache License, Version 2.0, see the NOTICE file; 5 | you may not use this project except in compliance with the License. 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Aug 01 10:55:02 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.5.1-all.zip 7 | -------------------------------------------------------------------------------- /lint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/mobile/res/drawable/actionbar_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | -------------------------------------------------------------------------------- /src/mobile/res/drawable/nowplaying_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | -------------------------------------------------------------------------------- /src/tv/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 150dp 4 | 50dp 5 | 6 | 48dp 7 | 27dp 8 | 9 | -------------------------------------------------------------------------------- /src/tv/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #384248 4 | #4C555A 5 | #EEEEEE 6 | #9EA2A5 7 | -------------------------------------------------------------------------------- /src/mobile/res/drawable/appwidget_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 10 | -------------------------------------------------------------------------------- /src/tv/res/layout/tv_browser_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /src/tv/res/layout/tv_play_queue_fragment.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /src/main/res/layout/select_music_folder.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 17 | 18 | -------------------------------------------------------------------------------- /src/mobile/res/layout/create_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/mobile/res/layout/rename_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/tv/res/values/values.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/mobile/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 9 | 10 | 12 | 13 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /src/mobile/res/values-w600dp-h400dp/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 9 | 10 | 12 | 13 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /src/main/java/nu/staldal/ui/WithSectionMenu.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2014 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.ui; 17 | 18 | import android.view.View; 19 | 20 | public interface WithSectionMenu { 21 | void onCreateSectionMenu(View view); 22 | } 23 | -------------------------------------------------------------------------------- /src/mobile/res/layout/audio_player.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/mobile/res/layout-h400dp/audio_player.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/mobile/res/layout-w800dp/audio_player.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/main/java/nu/staldal/djdplayer/FragmentServiceConnection.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2014 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer; 17 | 18 | public interface FragmentServiceConnection { 19 | void onServiceConnected(MediaPlayback service); 20 | 21 | void onServiceDisconnected(); 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/nu/staldal/djdplayer/IdAndName.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer; 17 | 18 | public class IdAndName { 19 | public final long id; 20 | public final String name; 21 | 22 | public IdAndName(long id, String name) { 23 | this.id = id; 24 | this.name = name; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/tv/res/layout/tv_category_details_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/res/values/strings2.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | 22 | , 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/mobile/java/nu/staldal/djdplayer/mobile/NarrowPlayerFooterFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2014 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.mobile; 17 | 18 | import nu.staldal.djdplayer.R; 19 | 20 | public class NarrowPlayerFooterFragment extends PlayerFooterFragment { 21 | 22 | @Override 23 | protected int getLayoutId() { 24 | return R.layout.narrow_player_footer; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/mobile/res/drawable/list_selector_background_transition.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 18 | 19 | 66dip 20 | 21 | 132dip 22 | 23 | -------------------------------------------------------------------------------- /src/mobile/res/menu/browser_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 15 | 16 | 21 | 22 | 27 | 28 | -------------------------------------------------------------------------------- /src/main/java/nu/staldal/djdplayer/AboutActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2014 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer; 17 | 18 | import android.app.Activity; 19 | import android.os.Bundle; 20 | 21 | public class AboutActivity extends Activity { 22 | @Override 23 | public void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.about); 26 | } 27 | } -------------------------------------------------------------------------------- /src/tv/res/drawable/song_list_row_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 18 | 20 | 21 | 23 | 24 | -------------------------------------------------------------------------------- /src/tv/java/nu/staldal/djdplayer/tv/SettingsItem.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.tv; 17 | 18 | public class SettingsItem { 19 | public final long id; 20 | public final String name; 21 | 22 | public SettingsItem(long id, String name) { 23 | this.id = id; 24 | this.name = name; 25 | } 26 | 27 | @Override 28 | public String toString() { 29 | return name; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/nu/staldal/djdplayer/SettingsFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2014 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer; 17 | 18 | import android.os.Bundle; 19 | import android.preference.PreferenceFragment; 20 | 21 | public class SettingsFragment extends PreferenceFragment { 22 | @Override 23 | public void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | addPreferencesFromResource(R.xml.preferences); 26 | } 27 | } -------------------------------------------------------------------------------- /src/tv/res/xml/preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 18 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/mobile/res/xml/appwidget_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 26 | -------------------------------------------------------------------------------- /src/mobile/java/nu/staldal/djdplayer/mobile/PlaylistShortcutActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.mobile; 17 | 18 | import android.app.Activity; 19 | import android.os.Bundle; 20 | import nu.staldal.djdplayer.R; 21 | 22 | public class PlaylistShortcutActivity extends Activity { 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | 27 | setContentView(R.layout.playlist_shortcut); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/mobile/res/layout/track_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/mobile/res/xml-w600dp-h400dp/appwidget_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 25 | 26 | -------------------------------------------------------------------------------- /src/tv/res/layout/tv_playback_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 17 | 18 | 23 | 24 | -------------------------------------------------------------------------------- /src/mobile/res/layout/playlist_shortcut.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 21 | 22 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/mobile/res/drawable/button_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 18 | 19 | 21 | 22 | 25 | 26 | 28 | 29 | -------------------------------------------------------------------------------- /src/mobile/res/layout/edit_track_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/mobile/res/xml/searchable.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 28 | -------------------------------------------------------------------------------- /src/tv/java/nu/staldal/djdplayer/tv/FolderItem.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.tv; 17 | 18 | public class FolderItem extends CategoryItem { 19 | public final String path; 20 | 21 | public FolderItem(long id, String name, int count, String path) { 22 | super(id, name, count); 23 | this.path = path; 24 | } 25 | 26 | @Override 27 | public String toString() { 28 | return "FolderItem{" + 29 | "id=" + id + 30 | ", name='" + name + '\'' + 31 | ", count=" + count + 32 | ", path=" + path + 33 | '}'; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/tv/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 9 | 10 | 13 | 14 | 17 | 18 | 21 | 22 | 25 | 26 | 32 | -------------------------------------------------------------------------------- /src/tv/java/nu/staldal/djdplayer/tv/CategoryItem.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.tv; 17 | 18 | public class CategoryItem { 19 | public final long id; 20 | public final String name; 21 | public final int count; 22 | 23 | public CategoryItem(long id, String name, int count) { 24 | this.id = id; 25 | this.name = name; 26 | this.count = count; 27 | } 28 | 29 | @Override 30 | public String toString() { 31 | return "CategoryItem{" + 32 | "id=" + id + 33 | ", name='" + name + '\'' + 34 | ", count=" + count + 35 | '}'; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/mobile/res/drawable/playlist_tile.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | 28 | 29 | -------------------------------------------------------------------------------- /src/mobile/java/nu/staldal/djdplayer/mobile/CategoryFragment.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package nu.staldal.djdplayer.mobile; 18 | 19 | import android.os.Bundle; 20 | import android.view.LayoutInflater; 21 | import android.view.View; 22 | import android.view.ViewGroup; 23 | import android.widget.ListView; 24 | 25 | public abstract class CategoryFragment extends BrowserFragment { 26 | @Override 27 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 28 | ListView listView = new ListView(getActivity()); 29 | listView.setId(android.R.id.list); 30 | listView.setFastScrollEnabled(true); 31 | listView.setTextFilterEnabled(true); 32 | 33 | registerForContextMenu(listView); 34 | 35 | return listView; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/test/java/nu/staldal/djdplayer/tests/ID3UtilsTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012-2017 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.tests; 17 | 18 | import static org.junit.Assert.assertEquals; 19 | import static org.junit.Assert.assertNull; 20 | 21 | import nu.staldal.djdplayer.provider.ID3Utils; 22 | import org.junit.Test; 23 | 24 | public class ID3UtilsTest { 25 | 26 | @Test 27 | public void decodeGenre() { 28 | assertNull(ID3Utils.decodeGenre(null)); 29 | assertEquals("", ID3Utils.decodeGenre("")); 30 | assertEquals("f", ID3Utils.decodeGenre("f")); 31 | assertEquals("fo", ID3Utils.decodeGenre("fo")); 32 | assertEquals("foo", ID3Utils.decodeGenre("foo")); 33 | assertEquals("(foo)", ID3Utils.decodeGenre("(foo)")); 34 | assertEquals("Salsa", ID3Utils.decodeGenre("(143)")); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/mobile/java/nu/staldal/djdplayer/mobile/RescanActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012-2014 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.mobile; 17 | 18 | import android.app.Activity; 19 | import android.content.Intent; 20 | import android.net.Uri; 21 | import android.os.Environment; 22 | import android.util.Log; 23 | import nu.staldal.djdplayer.MusicUtils; 24 | 25 | public class RescanActivity extends Activity { 26 | private static final String LOGTAG = "RescanActivity"; 27 | 28 | @Override 29 | protected void onStart() { 30 | super.onStart(); 31 | if (MusicUtils.android44OrLater()) { 32 | Log.w(LOGTAG, "Cannot rescan music on Android 4.4 or later"); 33 | } else { 34 | Log.i(LOGTAG, "Rescanning music"); 35 | sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(Environment.getExternalStorageDirectory()))); 36 | } 37 | finish(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/tv/java/nu/staldal/djdplayer/tv/SongItem.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015-2016 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.tv; 17 | 18 | public class SongItem { 19 | public final int position; 20 | public final long id; 21 | public final String title; 22 | public final String artist; 23 | public final int duration; 24 | 25 | public SongItem(int position, long id, String title, String artist, int duration) { 26 | this.position = position; 27 | this.id = id; 28 | this.title = title; 29 | this.artist = artist; 30 | this.duration = duration; 31 | } 32 | 33 | @Override 34 | public String toString() { 35 | return "SongItem{" + 36 | "artist='" + artist + '\'' + 37 | ", id=" + id + 38 | ", title='" + title + '\'' + 39 | ", duration=" + duration + 40 | ", position=" + position + 41 | '}'; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/nu/staldal/djdplayer/MusicAlphabetIndexer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2008 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package nu.staldal.djdplayer; 18 | 19 | import android.database.Cursor; 20 | import android.provider.MediaStore; 21 | import android.widget.AlphabetIndexer; 22 | 23 | /** 24 | * Handles comparisons in a different way because the Album, Song and Artist name 25 | * are stripped of some prefixes such as "a", "an", "the" and some symbols. 26 | * 27 | */ 28 | public class MusicAlphabetIndexer extends AlphabetIndexer { 29 | 30 | public MusicAlphabetIndexer(Cursor cursor, int sortedColumnIndex, CharSequence alphabet) { 31 | super(cursor, sortedColumnIndex, alphabet); 32 | } 33 | 34 | @Override 35 | protected int compare(String word, String letter) { 36 | String wordKey = MediaStore.Audio.keyFor(word); 37 | String letterKey = MediaStore.Audio.keyFor(letter); 38 | if (wordKey.startsWith(letter)) { 39 | return 0; 40 | } else { 41 | return wordKey.compareTo(letterKey); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/mobile/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | 19 | 20 | 24 | 25 | 28 | 29 | 32 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | DJD Player is a music player and organizer app for Android, adapted for the needs of DJs playing music at parties and dancing events. 2 | 3 | It is based on the standard Music Player from The Android Open Source Project (which comes pre-installed on many Android phones). 4 | 5 | Enhancements over the standard Music Player: 6 | 7 | * Genre support: 8 | - genre browsing tab 9 | - show genre of currently playing song 10 | 11 | * Do not pretend that album is a proper subcategory of artist (one album can contain songs from different artists) 12 | 13 | * Show number of songs for all categories (artist, album, genre), folders and playlists 14 | 15 | * Jump directly to list of songs for artist/genre from currently playing song view 16 | 17 | * Integrate current playing song and play queue view 18 | 19 | * Always show currently playing song footer in lists, with play/pause and next button 20 | 21 | * Improved play queue 22 | 23 | * Improved shuffling 24 | 25 | * Possible to force rescan of music library 26 | 27 | * Application settings 28 | 29 | * Delete from playlist by slide 30 | 31 | * Track info screen 32 | 33 | * Browse by folder 34 | 35 | * Search for song, artist and album 36 | 37 | * Shuffle stored playlist 38 | 39 | * Interleave category/folder/playlist with play queue 40 | 41 | * Export playlist to M3U file in Music folder 42 | 43 | * Possibility to stop after current song 44 | 45 | * Remote control in lock screen 46 | 47 | * Pause button in system notification 48 | 49 | * Two column layout for tablets 50 | 51 | * Context menu button in list items 52 | 53 | * Share songs and playlists 54 | 55 | * Transfer playlist between two devices via Bluetooth or WiFi Direct 56 | 57 | * Cross-fade between songs 58 | -------------------------------------------------------------------------------- /src/mobile/java/nu/staldal/djdplayer/mobile/SimpleCursorAdapterWithContextMenu.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2014 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.mobile; 17 | 18 | import android.content.Context; 19 | import android.database.Cursor; 20 | import android.view.View; 21 | import android.view.ViewGroup; 22 | import android.widget.SimpleCursorAdapter; 23 | import nu.staldal.djdplayer.R; 24 | 25 | public class SimpleCursorAdapterWithContextMenu extends SimpleCursorAdapter { 26 | 27 | public SimpleCursorAdapterWithContextMenu(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { 28 | super(context, layout, c, from, to, flags); 29 | } 30 | 31 | @Override 32 | public View newView(Context context, Cursor cursor, ViewGroup parent) { 33 | View v = super.newView(context, cursor, parent); 34 | v.findViewById(R.id.context_menu).setOnClickListener(new View.OnClickListener() { 35 | @Override 36 | public void onClick(View v) { 37 | v.showContextMenu(); 38 | } 39 | }); 40 | return v; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/tv/java/nu/staldal/djdplayer/tv/ActionCardPresenter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.tv; 17 | 18 | import android.support.v17.leanback.widget.Presenter; 19 | import android.view.ViewGroup; 20 | import nu.staldal.djdplayer.R; 21 | import nu.staldal.leanback.ActionCardView; 22 | 23 | public class ActionCardPresenter extends Presenter { 24 | 25 | @Override 26 | public ViewHolder onCreateViewHolder(ViewGroup parent) { 27 | ActionCardView cardView = new ActionCardView(parent.getContext()); 28 | 29 | cardView.setBackgroundColor(parent.getResources().getColor(R.color.standard_background)); 30 | cardView.setFocusable(true); 31 | cardView.setFocusableInTouchMode(true); 32 | 33 | return new ViewHolder(cardView); 34 | } 35 | 36 | @Override 37 | public void onBindViewHolder(ViewHolder viewHolder, Object item) { 38 | ActionCardView cardView = (ActionCardView)viewHolder.view; 39 | cardView.setText(item.toString()); 40 | } 41 | 42 | @Override 43 | public void onUnbindViewHolder(ViewHolder viewHolder) { 44 | // nothing to do 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/mobile/res/layout/music_browser_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 22 | 23 | 28 | 29 | 35 | 36 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /src/mobile/res/layout/about.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 14 | 15 | 18 | 19 | 24 | 25 | 28 | 29 | 33 | 34 | 39 | 40 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/tv/res/layout/action_card_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 18 | 21 | 22 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/mobile/res/menu/player_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 16 | 17 | 23 | 24 | 25 | 26 | 31 | 32 | 37 | 38 | 39 | 40 | 45 | 46 | 51 | 52 | -------------------------------------------------------------------------------- /src/mobile/res/menu-w800dp/player_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 16 | 17 | 23 | 24 | 25 | 26 | 31 | 32 | 37 | 38 | 39 | 40 | 45 | 46 | 51 | 52 | -------------------------------------------------------------------------------- /src/main/java/nu/staldal/djdplayer/ShufflePlaylistTask.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer; 17 | 18 | import android.content.Context; 19 | import android.os.AsyncTask; 20 | import android.provider.MediaStore; 21 | import android.widget.Toast; 22 | 23 | import java.util.Random; 24 | 25 | public class ShufflePlaylistTask extends AsyncTask { 26 | @SuppressWarnings("unused") 27 | private static final String LOGTAG = "ShufflePlaylistTask"; 28 | 29 | private final Context context; 30 | 31 | public ShufflePlaylistTask(Context context) { 32 | this.context = context; 33 | } 34 | 35 | @Override 36 | protected Void doInBackground(Object... params) { 37 | Random random = new Random(); 38 | long playlistId = (Long)params[0]; 39 | long[] songs = (long[])params[1]; 40 | for (int i=0; i < songs.length; i++) { 41 | int randomPosition = random.nextInt(songs.length); 42 | MediaStore.Audio.Playlists.Members.moveItem(context.getContentResolver(), playlistId, i, randomPosition); 43 | } 44 | 45 | return null; 46 | } 47 | 48 | @Override 49 | protected void onPostExecute(Void aVoid) { 50 | Toast.makeText(context, R.string.playlist_shuffled, Toast.LENGTH_SHORT).show(); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/tv/java/nu/staldal/djdplayer/tv/CategoryCardPresenter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.tv; 17 | 18 | import android.support.v17.leanback.widget.Presenter; 19 | import android.view.ViewGroup; 20 | import nu.staldal.djdplayer.R; 21 | import nu.staldal.leanback.TextCardView; 22 | 23 | public class CategoryCardPresenter extends Presenter { 24 | 25 | @Override 26 | public ViewHolder onCreateViewHolder(ViewGroup parent) { 27 | TextCardView cardView = new TextCardView(parent.getContext()); 28 | 29 | cardView.setBackgroundColor(parent.getResources().getColor(R.color.standard_background)); 30 | cardView.setFocusable(true); 31 | cardView.setFocusableInTouchMode(true); 32 | 33 | return new ViewHolder(cardView); 34 | } 35 | 36 | @Override 37 | public void onBindViewHolder(ViewHolder viewHolder, Object o) { 38 | CategoryItem item = (CategoryItem) o; 39 | TextCardView cardView = (TextCardView) viewHolder.view; 40 | 41 | cardView.setTitleText(item.name); 42 | cardView.setContentText( 43 | viewHolder.view.getContext().getResources().getQuantityString(R.plurals.Nsongs, item.count, item.count)); 44 | } 45 | 46 | @Override 47 | public void onUnbindViewHolder(ViewHolder viewHolder) { 48 | // nothing to do 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/mobile/res/drawable/list_selector_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 18 | 19 | 21 | 22 | 23 | 26 | 28 | 29 | 31 | 33 | 34 | 36 | 37 | 39 | 40 | -------------------------------------------------------------------------------- /src/tv/res/layout/about.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 20 | 21 | 26 | 27 | 30 | 31 | 35 | 36 | 41 | 42 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 36 | 37 | 38 | 39 | 40 | 41 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/tv/java/nu/staldal/leanback/ClickableItemBridgeAdapter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.leanback; 17 | 18 | import android.support.v17.leanback.widget.ItemBridgeAdapter; 19 | import android.support.v17.leanback.widget.ObjectAdapter; 20 | import android.support.v17.leanback.widget.OnItemViewClickedListener; 21 | 22 | public class ClickableItemBridgeAdapter extends ItemBridgeAdapter { 23 | private final OnItemViewClickedListener clickedListener; 24 | 25 | public ClickableItemBridgeAdapter(ObjectAdapter adapter, OnItemViewClickedListener clickedListener) { 26 | super(adapter); 27 | this.clickedListener = clickedListener; 28 | } 29 | 30 | public final OnItemViewClickedListener getOnItemViewClickedListener() { 31 | return clickedListener; 32 | } 33 | 34 | @Override 35 | public void onBind(final ItemBridgeAdapter.ViewHolder itemViewHolder) { 36 | itemViewHolder.getViewHolder().view.setOnClickListener(view -> { 37 | if (clickedListener != null) { 38 | clickedListener.onItemClicked(itemViewHolder.getViewHolder(), itemViewHolder.getItem(), null, null); 39 | } 40 | }); 41 | } 42 | 43 | @Override 44 | public void onUnbind(ItemBridgeAdapter.ViewHolder viewHolder) { 45 | if (clickedListener != null) { 46 | viewHolder.getViewHolder().view.setOnClickListener(null); 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/tv/res/layout/song_list_row.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 22 | 23 | 30 | 31 | 39 | 40 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/mobile/res/menu-h400dp/player_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 17 | 18 | 23 | 24 | 30 | 31 | 32 | 33 | 38 | 39 | 44 | 45 | 46 | 47 | 52 | 53 | 58 | 59 | -------------------------------------------------------------------------------- /src/mobile/res/menu-w600dp-h400dp/browser_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 17 | 18 | 23 | 24 | 30 | 31 | 32 | 33 | 38 | 39 | 44 | 45 | 46 | 47 | 52 | 53 | 58 | 59 | -------------------------------------------------------------------------------- /src/tv/java/nu/staldal/djdplayer/tv/TvMediaPlaybackService.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015-2016 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package nu.staldal.djdplayer.tv; 18 | 19 | import android.app.PendingIntent; 20 | import android.content.Intent; 21 | import android.media.session.MediaSession; 22 | import nu.staldal.djdplayer.MediaPlaybackService; 23 | 24 | public class TvMediaPlaybackService extends MediaPlaybackService { 25 | 26 | @SuppressWarnings("unused") 27 | private static final String TAG = TvMediaPlaybackService.class.getSimpleName(); 28 | 29 | @Override 30 | protected void additionalCreate() { 31 | Intent intent = new Intent(this, PlaybackActivity.class); 32 | PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 33 | mSession.setSessionActivity(pendingIntent); 34 | 35 | mSession.setCallback(new MediaSession.Callback() { 36 | @Override 37 | public void onPlay() { 38 | play(); 39 | } 40 | 41 | @Override 42 | public void onPause() { 43 | pause(); 44 | } 45 | 46 | @Override 47 | public void onStop() { 48 | pause(); 49 | seek(0); 50 | } 51 | 52 | @Override 53 | public void onSkipToPrevious() { 54 | previousOrRestartCurrent(); 55 | } 56 | 57 | @Override 58 | public void onSkipToNext() { 59 | next(); 60 | } 61 | }); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/tv/java/nu/staldal/leanback/ActionCardView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2014 The Android Open Source Project 3 | * Copyright (C) 2015 Mikael Ståldal 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 6 | * in compliance with the License. You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software distributed under the License 11 | * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 12 | * or implied. See the License for the specific language governing permissions and limitations under 13 | * the License. 14 | */ 15 | package nu.staldal.leanback; 16 | 17 | import android.content.Context; 18 | import android.support.v17.leanback.widget.BaseCardView; 19 | import android.util.AttributeSet; 20 | import android.view.LayoutInflater; 21 | import android.view.View; 22 | import android.widget.TextView; 23 | import nu.staldal.djdplayer.R; 24 | 25 | /** 26 | * A static card view with an {@link TextView} 27 | */ 28 | public class ActionCardView extends BaseCardView { 29 | 30 | private final TextView mTextView; 31 | 32 | public ActionCardView(Context context) { 33 | this(context, null); 34 | } 35 | 36 | public ActionCardView(Context context, AttributeSet attrs) { 37 | this(context, attrs, R.attr.imageCardViewStyle); 38 | } 39 | 40 | public ActionCardView(Context context, AttributeSet attrs, int defStyle) { 41 | super(context, attrs, defStyle); 42 | 43 | LayoutInflater inflater = LayoutInflater.from(context); 44 | View v = inflater.inflate(R.layout.action_card_view, this); 45 | 46 | mTextView = (TextView) v.findViewById(R.id.text); 47 | } 48 | 49 | public void setText(CharSequence text) { 50 | if (mTextView == null) { 51 | return; 52 | } 53 | 54 | mTextView.setText(text); 55 | } 56 | 57 | public CharSequence getText() { 58 | if (mTextView == null) { 59 | return null; 60 | } 61 | 62 | return mTextView.getText(); 63 | } 64 | 65 | @Override 66 | public boolean hasOverlappingRendering() { 67 | return false; 68 | } 69 | 70 | } 71 | -------------------------------------------------------------------------------- /src/mobile/res/layout/audio_player_port.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 22 | 23 | 28 | 29 | 34 | 35 | 41 | 42 | 47 | 48 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /src/tv/java/nu/staldal/djdplayer/tv/SongRowPresenter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.tv; 17 | 18 | import android.support.v17.leanback.widget.Presenter; 19 | import android.view.LayoutInflater; 20 | import android.view.View; 21 | import android.view.ViewGroup; 22 | import android.widget.TextView; 23 | import nu.staldal.djdplayer.MusicUtils; 24 | import nu.staldal.djdplayer.R; 25 | 26 | public class SongRowPresenter extends Presenter { 27 | 28 | class ViewHolder extends Presenter.ViewHolder { 29 | final TextView title; 30 | final TextView artist; 31 | final TextView duration; 32 | 33 | public ViewHolder(View view) { 34 | super(view); 35 | title = (TextView)view.findViewById(R.id.title); 36 | artist = (TextView)view.findViewById(R.id.artist); 37 | duration = (TextView)view.findViewById(R.id.duration); 38 | } 39 | } 40 | 41 | @Override 42 | public ViewHolder onCreateViewHolder(ViewGroup parent) { 43 | LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 44 | View view = inflater.inflate(R.layout.song_list_row, parent, false); 45 | return new ViewHolder(view); 46 | } 47 | 48 | @Override 49 | public void onBindViewHolder(Presenter.ViewHolder vh, Object o) { 50 | ViewHolder viewHolder = (ViewHolder)vh; 51 | SongItem item = (SongItem)o; 52 | 53 | viewHolder.title.setText(item.title); 54 | viewHolder.artist.setText(item.artist); 55 | viewHolder.duration.setText(MusicUtils.formatDuration(viewHolder.view.getContext(), item.duration)); 56 | } 57 | 58 | @Override 59 | public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { 60 | // nothing to do 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/nu/staldal/djdplayer/SettingsActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2012-2016 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer; 17 | 18 | import android.app.Activity; 19 | import android.os.Bundle; 20 | 21 | public class SettingsActivity extends Activity { 22 | public static final String CLICK_ON_SONG = "clickonsong"; 23 | public static final String SHOW_ARTISTS_TAB = "show_artists_tab"; 24 | public static final String SHOW_ALBUMS_TAB = "show_albums_tab"; 25 | public static final String SHOW_GENRES_TAB = "show_genres_tab"; 26 | public static final String SHOW_FOLDERS_TAB = "show_folders_tab"; 27 | public static final String SHOW_PLAYLISTS_TAB = "show_playlists_tab"; 28 | public static final String MUSIC_FOLDER = "music_folder"; 29 | public static final String FADE_SECONDS = "fade_seconds"; 30 | public static final String CROSS_FADE = "cross_fade"; 31 | 32 | public static final String PLAYQUEUE = "queue"; 33 | public static final String CARDID = "cardid"; 34 | public static final String CURPOS = "curpos"; 35 | public static final String SEEKPOS = "seekpos"; 36 | public static final String REPEATMODE = "repeatmode"; 37 | public static final String NUMWEEKS = "numweeks"; 38 | public static final String ACTIVE_TAB = "ActiveTab"; 39 | 40 | // CLICK_ON_SONG values 41 | public static final String PLAY_NEXT = "PLAY_NEXT"; 42 | public static final String PLAY_NOW = "PLAY_NOW"; 43 | public static final String QUEUE = "QUEUE"; 44 | 45 | @Override 46 | public void onCreate(Bundle savedInstanceState) { 47 | super.onCreate(savedInstanceState); 48 | setTitle(R.string.settings); 49 | getFragmentManager().beginTransaction() 50 | .replace(android.R.id.content, new SettingsFragment()) 51 | .commit(); 52 | } 53 | } -------------------------------------------------------------------------------- /src/mobile/res/layout/audio_player_land.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 22 | 23 | 29 | 30 | 37 | 38 | 44 | 45 | 46 | 47 | 52 | 53 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /src/tv/res/layout/text_card_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 18 | 21 | 22 | 36 | 37 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/tv/res/layout/nowplaying.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 24 | 25 | 33 | 34 | 35 | 40 | 41 | 47 | 48 | 54 | 55 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Play next 6 | Play now 7 | Queue last 8 | 9 | 10 | PLAY_NEXT 11 | PLAY_NOW 12 | QUEUE 13 | 14 | 15 | 16 | None 17 | 1 second 18 | 2 seconds 19 | 3 seconds 20 | 4 seconds 21 | 5 seconds 22 | 6 seconds 23 | 7 seconds 24 | 8 seconds 25 | 9 seconds 26 | 10 seconds 27 | 11 seconds 28 | 12 seconds 29 | 13 seconds 30 | 14 seconds 31 | 15 seconds 32 | 16 seconds 33 | 17 seconds 34 | 18 seconds 35 | 19 seconds 36 | 20 seconds 37 | 21 seconds 38 | 22 seconds 39 | 23 seconds 40 | 24 seconds 41 | 25 seconds 42 | 26 seconds 43 | 27 seconds 44 | 28 seconds 45 | 29 seconds 46 | 30 seconds 47 | 48 | 49 | 0 50 | 1 51 | 2 52 | 3 53 | 4 54 | 5 55 | 6 56 | 7 57 | 8 58 | 9 59 | 10 60 | 11 61 | 12 62 | 13 63 | 14 64 | 15 65 | 16 66 | 17 67 | 18 68 | 19 69 | 20 70 | 21 71 | 22 72 | 23 73 | 24 74 | 25 75 | 26 76 | 27 77 | 28 78 | 29 79 | 30 80 | 81 | 82 | -------------------------------------------------------------------------------- /src/main/java/nu/staldal/djdplayer/provider/CursorWithCountColumn.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 Mikael Ståldal 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package nu.staldal.djdplayer.provider; 17 | 18 | import android.database.Cursor; 19 | import android.database.CursorWrapper; 20 | import android.provider.BaseColumns; 21 | 22 | public class CursorWithCountColumn extends CursorWrapper { 23 | final int[] counts; 24 | 25 | public CursorWithCountColumn(Cursor cursor, int[] counts) { 26 | super(cursor); 27 | this.counts = counts; 28 | } 29 | 30 | @Override 31 | public int getColumnCount() { 32 | return super.getColumnCount()+1; 33 | } 34 | 35 | @Override 36 | public int getColumnIndex(String columnName) { 37 | if (columnName.equals(BaseColumns._COUNT)) 38 | return super.getColumnCount(); 39 | else 40 | return super.getColumnIndex(columnName); 41 | } 42 | 43 | @Override 44 | public int getColumnIndexOrThrow(String columnName) { 45 | if (columnName.equals(BaseColumns._COUNT)) 46 | return super.getColumnCount(); 47 | else 48 | return super.getColumnIndexOrThrow(columnName); 49 | } 50 | 51 | @Override 52 | public String getColumnName(int columnIndex) { 53 | if (columnIndex == super.getColumnCount()) 54 | return BaseColumns._COUNT; 55 | else 56 | return super.getColumnName(columnIndex); 57 | } 58 | 59 | @Override 60 | public String[] getColumnNames() { 61 | String[] originalColumnNames = super.getColumnNames(); 62 | String[] ret = new String[originalColumnNames.length+1]; 63 | System.arraycopy(originalColumnNames, 0, ret, 0, originalColumnNames.length); 64 | ret[ret.length-1] = BaseColumns._COUNT; 65 | return ret; 66 | } 67 | 68 | @Override 69 | public int getInt(int columnIndex) { 70 | if (columnIndex == super.getColumnCount()) 71 | return counts[getPosition()]; 72 | else 73 | return super.getInt(columnIndex); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/tv/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 19 | 20 | 23 | 24 | 27 | 28 | 31 | 32 | 37 | 38 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 54 | 55 | 58 | 59 | 62 | 63 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /src/mobile/res/xml-v19/preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 16 | 20 | 24 | 28 | 32 | 33 | 34 | 40 | 44 | 45 | 46 | 47 | 50 | 51 | 52 | 53 | 54 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /src/mobile/res/xml/preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 16 | 20 | 24 | 28 | 32 | 33 | 34 | 40 | 44 | 45 | 46 | 47 | 50 | 51 | 52 | 53 | 54 | 57 | 58 | 59 | 60 | 61 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /HISTORY: -------------------------------------------------------------------------------- 1 | 1.1 2 | --- 3 | * Shuffle stored playlist 4 | * Interleave category/folder/playlist with play queue 5 | * Fix occasional crash 6 | 7 | 1.1.1 8 | ----- 9 | * Fix handling of special characters in folder names 10 | 11 | 1.2 12 | --- 13 | * Show current music folder when selecting a new 14 | * Automatically refresh folder view when changing music folder 15 | * New folder tab icon 16 | 17 | 1.3 18 | --- 19 | * Shuffle before play/queue/interleave/add to play list from category 20 | * Possible to interleave from options menu 21 | * Improve layout of playback view 22 | 23 | 1.4 24 | --- 25 | * Preference to change click on song behaviour 26 | * Export playlist to M3U file in Music folder 27 | * Command to clear duplicates from play queue and playlist 28 | * Enable Android 4.0 (Ice Cream Sandwich) UI enhancements 29 | 30 | 1.5 31 | --- 32 | * Improve system notification layout on Android 2.x 33 | * Enable more Android 4 UI enhancements, by using Holo theme 34 | * Possibility to stop after current song 35 | 36 | 1.6 37 | --- 38 | * Use Holo theme consistently on Android 4 39 | 40 | 1.7 41 | --- 42 | * Some changes to cater for tablets in landscape mode 43 | * Make it possible to run in AndroVM 44 | 45 | 1.8 46 | --- 47 | * Basic tablet support 48 | * Properly styled icon for playlist shortcuts 49 | * Avoid interference with other music players when switching tabs 50 | 51 | 1.9 52 | --- 53 | * Bug fixes 54 | * Layout improvements 55 | * Performance improvements 56 | 57 | 2.0 58 | --- 59 | * Integrate current playing song and play queue view 60 | * Use Action Bar and other Android 4 UI enhancements 61 | * Improved tablet support 62 | 63 | 2.1 64 | --- 65 | * Improve interleave menu 66 | * Don't zoom play queue in landscape mode 67 | * Improved app widget 68 | * Remote control in lock screen 69 | 70 | 2.2 71 | --- 72 | * Improved app widget 73 | * Pause button in system notification 74 | 75 | 2.3 76 | --- 77 | * Bug fixes 78 | * Play all next for categories 79 | * Improved music picking 80 | 81 | 2.4 82 | --- 83 | * Hide rescan music on Android 4.4, since it does not work there 84 | * Two column layout for tablets 85 | * Context menu button in lists 86 | 87 | 2.5 88 | --- 89 | * Improved tablet layout 90 | * Bug fixes 91 | 92 | 2.6 93 | --- 94 | * Improved layout 95 | * About 96 | * Bug fixes 97 | 98 | 2.6.1 99 | ----- 100 | * Bug fixes 101 | 102 | 2.6.2 103 | ----- 104 | * Bug fix 105 | 106 | 2.6.3 107 | ----- 108 | * Improved layout on phones without menu button, or with Android 4.4+ 109 | 110 | 2.7 111 | --- 112 | * Share playlist 113 | * Transfer playlist between two devices via Bluetooth or WiFi Direct 114 | 115 | 2.8 116 | --- 117 | * Cross-fade between songs 118 | 119 | 2.9 120 | --- 121 | * Bug fix in removing dups from playlist 122 | * Show filename of exported playlist 123 | * Add all songs in one playlist to another playlist 124 | * Add all songs in queue to a playlist 125 | 126 | 2.10 127 | ---- 128 | * Playback buttons in notification 129 | * Remote control in lock screen now works in Android 5 130 | 131 | 2.11 132 | ---- 133 | * ViewPager to swipe horizontally between tabs 134 | -------------------------------------------------------------------------------- /src/mobile/res/layout/nowplaying.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 28 | 29 | 37 | 38 | 46 | 47 | 55 | 56 | 57 | 61 | 62 | 68 | 69 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /src/mobile/res/layout-w600dp-h400dp/music_browser_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 22 | 23 | 28 | 29 | 35 | 36 | 40 | 41 | 46 | 47 | 52 | 53 | 57 | 58 | 64 | 65 | 69 | 70 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /src/mobile/res/layout-w500dp/music_browser_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 22 | 23 | 28 | 29 | 35 | 36 | 40 | 41 | 46 | 47 | 52 | 53 | 57 | 58 |