├── .gitignore ├── LICENSE ├── README.md ├── app ├── build.gradle ├── libs │ └── juniversalchardet-1.0.3.jar ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── ic_music-web.png │ ├── java │ └── com │ │ └── maxfour │ │ └── libreplayer │ │ ├── App.kt │ │ ├── Constants.kt │ │ ├── Result.kt │ │ ├── activities │ │ ├── AboutActivity.kt │ │ ├── AlbumDetailsActivity.kt │ │ ├── ArtistDetailActivity.kt │ │ ├── GenreDetailsActivity.kt │ │ ├── LockScreenActivity.kt │ │ ├── LyricsActivity.kt │ │ ├── MainActivity.kt │ │ ├── PlayingQueueActivity.kt │ │ ├── PlaylistDetailActivity.kt │ │ ├── SearchActivity.kt │ │ ├── SettingsActivity.kt │ │ ├── UserInfoActivity.kt │ │ ├── base │ │ │ ├── AbsBaseActivity.kt │ │ │ ├── AbsMusicServiceActivity.kt │ │ │ ├── AbsSlidingMusicPanelActivity.kt │ │ │ └── AbsThemeActivity.kt │ │ ├── saf │ │ │ └── SAFGuideActivity.java │ │ └── tageditor │ │ │ ├── AbsTagEditorActivity.kt │ │ │ ├── AlbumTagEditorActivity.kt │ │ │ ├── SongTagEditorActivity.kt │ │ │ └── WriteTagsAsyncTask.java │ │ ├── adapter │ │ ├── CategoryInfoAdapter.java │ │ ├── GenreAdapter.kt │ │ ├── HomeAdapter.kt │ │ ├── SearchAdapter.kt │ │ ├── SongFileAdapter.kt │ │ ├── album │ │ │ ├── AlbumAdapter.kt │ │ │ ├── AlbumCoverPagerAdapter.kt │ │ │ ├── AlbumFullWidthAdapter.kt │ │ │ └── HorizontalAlbumAdapter.kt │ │ ├── artist │ │ │ └── ArtistAdapter.kt │ │ ├── base │ │ │ ├── AbsMultiSelectAdapter.java │ │ │ └── MediaEntryViewHolder.java │ │ ├── playlist │ │ │ └── PlaylistAdapter.kt │ │ └── song │ │ │ ├── AbsOffsetSongAdapter.kt │ │ │ ├── OrderablePlaylistSongAdapter.kt │ │ │ ├── PlayingQueueAdapter.kt │ │ │ ├── PlaylistSongAdapter.kt │ │ │ ├── ShuffleButtonSongAdapter.kt │ │ │ ├── SimpleSongAdapter.kt │ │ │ └── SongAdapter.kt │ │ ├── appshortcuts │ │ ├── AppShortcutIconGenerator.kt │ │ ├── AppShortcutLauncherActivity.kt │ │ ├── DynamicShortcutManager.kt │ │ └── shortcuttype │ │ │ ├── BaseShortcutType.kt │ │ │ ├── LastAddedShortcutType.kt │ │ │ ├── SearchShortCutType.kt │ │ │ ├── ShuffleAllShortcutType.kt │ │ │ └── TopSongsShortcutType.kt │ │ ├── appwidgets │ │ ├── AppWidgetBig.kt │ │ ├── AppWidgetCard.kt │ │ ├── AppWidgetClassic.kt │ │ ├── AppWidgetSmall.kt │ │ ├── AppWidgetText.kt │ │ ├── BootReceiver.kt │ │ └── base │ │ │ └── BaseAppWidget.kt │ │ ├── dagger │ │ ├── MusicComponent.kt │ │ └── module │ │ │ ├── AppModule.kt │ │ │ └── PresenterModile.kt │ │ ├── deezer │ │ ├── DeezerApiService.kt │ │ └── DeezerResponse.kt │ │ ├── dialogs │ │ ├── AddToPlaylistDialog.kt │ │ ├── BlacklistFolderChooserDialog.kt │ │ ├── ClearSmartPlaylistDialog.kt │ │ ├── CreatePlaylistDialog.kt │ │ ├── DeletePlaylistDialog.kt │ │ ├── DeleteSongsAsyncTask.java │ │ ├── DeleteSongsDialog.kt │ │ ├── OptionsSheetDialogFragment.kt │ │ ├── RemoveFromPlaylistDialog.kt │ │ ├── RenamePlaylistDialog.kt │ │ ├── SleepTimerDialog.kt │ │ ├── SongDetailDialog.kt │ │ └── SongShareDialog.kt │ │ ├── extensions │ │ ├── ActivityEx.kt │ │ ├── ColorExt.kt │ │ ├── DrawableExt.kt │ │ ├── ListEx.kt │ │ └── ViewExtensions.kt │ │ ├── fragments │ │ ├── AlbumCoverStyle.kt │ │ ├── MiniPlayerFragment.kt │ │ ├── NowPlayingScreen.kt │ │ ├── VolumeFragment.kt │ │ ├── base │ │ │ ├── AbsLibraryPagerFragment.kt │ │ │ ├── AbsLibraryPagerRecyclerViewCustomGridSizeFragment.kt │ │ │ ├── AbsLibraryPagerRecyclerViewFragment.kt │ │ │ ├── AbsMainActivityFragment.kt │ │ │ ├── AbsMusicServiceFragment.kt │ │ │ ├── AbsPlayerControlsFragment.kt │ │ │ └── AbsPlayerFragment.kt │ │ ├── mainactivity │ │ │ ├── AlbumsFragment.kt │ │ │ ├── ArtistsFragment.kt │ │ │ ├── GenresFragment.kt │ │ │ ├── LibraryFragment.java │ │ │ ├── PlayingQueueFragment.kt │ │ │ ├── PlaylistsFragment.kt │ │ │ ├── SongsFragment.kt │ │ │ ├── folders │ │ │ │ └── FoldersFragment.java │ │ │ └── home │ │ │ │ └── BannerHomeFragment.kt │ │ ├── player │ │ │ ├── PlayerAlbumCoverFragment.kt │ │ │ ├── adaptive │ │ │ │ ├── AdaptiveFragment.kt │ │ │ │ └── AdaptivePlaybackControlsFragment.kt │ │ │ ├── blur │ │ │ │ ├── BlurPlaybackControlsFragment.kt │ │ │ │ └── BlurPlayerFragment.kt │ │ │ ├── card │ │ │ │ ├── CardFragment.kt │ │ │ │ └── CardPlaybackControlsFragment.kt │ │ │ ├── cardblur │ │ │ │ ├── CardBlurFragment.kt │ │ │ │ └── CardBlurPlaybackControlsFragment.kt │ │ │ ├── color │ │ │ │ ├── ColorFragment.kt │ │ │ │ └── ColorPlaybackControlsFragment.kt │ │ │ ├── fit │ │ │ │ ├── FitFragment.kt │ │ │ │ └── FitPlaybackControlsFragment.kt │ │ │ ├── flat │ │ │ │ ├── FlatPlaybackControlsFragment.kt │ │ │ │ └── FlatPlayerFragment.kt │ │ │ ├── full │ │ │ │ ├── FullPlaybackControlsFragment.kt │ │ │ │ └── FullPlayerFragment.kt │ │ │ ├── lockscreen │ │ │ │ └── LockScreenPlayerControlsFragment.kt │ │ │ ├── material │ │ │ │ ├── MaterialControlsFragment.kt │ │ │ │ └── MaterialFragment.kt │ │ │ ├── normal │ │ │ │ ├── PlayerFragment.kt │ │ │ │ └── PlayerPlaybackControlsFragment.kt │ │ │ ├── peak │ │ │ │ ├── PeakPlayerControlFragment.kt │ │ │ │ └── PeakPlayerFragment.kt │ │ │ ├── plain │ │ │ │ ├── PlainPlaybackControlsFragment.kt │ │ │ │ └── PlainPlayerFragment.kt │ │ │ ├── simple │ │ │ │ ├── SimplePlaybackControlsFragment.kt │ │ │ │ └── SimplePlayerFragment.kt │ │ │ └── tiny │ │ │ │ ├── TinyPlaybackControlsFragment.kt │ │ │ │ └── TinyPlayerFragment.kt │ │ └── settings │ │ │ ├── AbsSettingsFragment.kt │ │ │ ├── AudioSettings.kt │ │ │ ├── ImageSettingFragment.kt │ │ │ ├── MainSettingsFragment.kt │ │ │ ├── NotificationSettingsFragment.kt │ │ │ ├── NowPlayingSettingsFragment.kt │ │ │ ├── OtherSettingsFragment.kt │ │ │ ├── PersonalizeSettingsFragment.kt │ │ │ └── ThemeSettingsFragment.kt │ │ ├── glide │ │ ├── ArtistGlideRequest.java │ │ ├── BlurTransformation.kt │ │ ├── PlayerColoredTarget.kt │ │ ├── PlayerGlideModule.kt │ │ ├── SongGlideRequest.java │ │ ├── artistimage │ │ │ └── ArtistImageLoader.kt │ │ ├── audiocover │ │ │ ├── AudioFileCover.java │ │ │ ├── AudioFileCoverFetcher.java │ │ │ ├── AudioFileCoverLoader.java │ │ │ └── AudioFileCoverUtils.java │ │ └── palette │ │ │ ├── BitmapPaletteResource.java │ │ │ ├── BitmapPaletteTarget.java │ │ │ ├── BitmapPaletteTranscoder.java │ │ │ └── BitmapPaletteWrapper.java │ │ ├── helper │ │ ├── EqualizerHelper.kt │ │ ├── HorizontalAdapterHelper.kt │ │ ├── M3UConstants.java │ │ ├── M3UWriter.java │ │ ├── MusicPlayerRemote.kt │ │ ├── MusicProgressViewUpdateHelper.kt │ │ ├── PlayPauseButtonOnClickHandler.kt │ │ ├── SearchQueryHelper.kt │ │ ├── ShuffleHelper.kt │ │ ├── SortOrder.kt │ │ ├── StackBlur.java │ │ ├── StopWatch.kt │ │ └── menu │ │ │ ├── GenreMenuHelper.kt │ │ │ ├── PlaylistMenuHelper.kt │ │ │ ├── SongMenuHelper.kt │ │ │ └── SongsMenuHelper.kt │ │ ├── interfaces │ │ ├── CabHolder.kt │ │ ├── EqualizerInterface.kt │ │ ├── LoaderIds.kt │ │ ├── MainActivityFragmentCallbacks.kt │ │ ├── MusicServiceEventListener.kt │ │ └── PaletteColorHolder.kt │ │ ├── loaders │ │ ├── AlbumLoader.kt │ │ ├── ArtistLoader.kt │ │ ├── GenreLoader.kt │ │ ├── LastAddedSongsLoader.kt │ │ ├── PlaylistLoader.kt │ │ ├── PlaylistSongsLoader.kt │ │ ├── SearchLoader.kt │ │ ├── SongLoader.kt │ │ ├── SortedCursor.java │ │ ├── SortedLongCursor.java │ │ └── TopAndRecentlyPlayedSongsLoader.kt │ │ ├── lyrics │ │ ├── Lrc.java │ │ ├── LrcHelper.java │ │ └── LrcView.kt │ │ ├── misc │ │ ├── AppBarStateChangeListener.kt │ │ ├── AsyncSearchResultLoader.kt │ │ ├── CustomFragmentStatePagerAdapter.java │ │ ├── DialogAsyncTask.java │ │ ├── GenericFileProvider.java │ │ ├── LagTracker.java │ │ ├── SimpleAnimatorListener.kt │ │ ├── SimpleOnSeekbarChangeListener.kt │ │ ├── UpdateToastMediaScannerCompletionListener.java │ │ ├── WeakContextAsyncTask.kt │ │ └── WrappedAsyncTaskLoader.kt │ │ ├── model │ │ ├── AbsCustomPlaylist.java │ │ ├── Album.kt │ │ ├── Artist.kt │ │ ├── CategoryInfo.java │ │ ├── Genre.kt │ │ ├── Home.kt │ │ ├── Playlist.java │ │ ├── PlaylistSong.java │ │ ├── Song.kt │ │ ├── lyrics │ │ │ ├── AbsSynchronizedLyrics.java │ │ │ ├── Lyrics.java │ │ │ └── SynchronizedLyricsLRC.java │ │ └── smartplaylist │ │ │ ├── AbsSmartPlaylist.java │ │ │ ├── HistoryPlaylist.java │ │ │ ├── LastAddedPlaylist.java │ │ │ ├── MyTopSongsPlaylist.java │ │ │ └── ShuffleAllPlaylist.java │ │ ├── mvp │ │ ├── BaseView.kt │ │ ├── Presenter.kt │ │ ├── PresenterImpl.java │ │ └── presenter │ │ │ ├── AlbumDetailsPresenter.kt │ │ │ ├── AlbumPresenter.kt │ │ │ ├── ArtistDetailsPresenter.kt │ │ │ ├── ArtistPresenter.kt │ │ │ ├── GenreDetailsPresenter.kt │ │ │ ├── GenrePresenter.kt │ │ │ ├── HomePresenter.kt │ │ │ ├── PlaylistPresenter.kt │ │ │ ├── PlaylistSongsPresenter.kt │ │ │ ├── SearchPresenter.kt │ │ │ └── SongPresenter.kt │ │ ├── preferences │ │ ├── AlbumCoverStylePreferenceDialog.kt │ │ ├── BlacklistPreferenceDialog.kt │ │ ├── LibraryPreference.kt │ │ ├── MaterialListPreference.kt │ │ └── NowPlayingScreenPreferenceDialog.kt │ │ ├── providers │ │ ├── BlacklistStore.java │ │ ├── HistoryStore.java │ │ ├── MusicPlaybackQueueStore.java │ │ ├── RepositoryImpl.kt │ │ ├── SongPlayCountStore.java │ │ └── interfaces │ │ │ └── Repository.kt │ │ ├── rest │ │ ├── LastFMRestClient.java │ │ ├── model │ │ │ ├── LastFmAlbum.java │ │ │ ├── LastFmArtist.java │ │ │ └── LastFmTrack.java │ │ └── service │ │ │ └── LastFMService.kt │ │ ├── service │ │ ├── MediaButtonIntentReceiver.kt │ │ ├── MediaSessionCallback.kt │ │ ├── MediaStoreObserver.kt │ │ ├── MultiPlayer.java │ │ ├── MusicService.java │ │ ├── PlaybackHandler.java │ │ ├── QueueSaveHandler.kt │ │ ├── SongPlayCountHelper.kt │ │ ├── ThrottledSeekHandler.kt │ │ ├── WearBrowserService.java │ │ ├── notification │ │ │ ├── PlayingNotification.kt │ │ │ ├── PlayingNotificationImpl.kt │ │ │ └── PlayingNotificationOreo.kt │ │ └── playback │ │ │ └── Playback.kt │ │ ├── transform │ │ ├── CarousalPagerTransformer.kt │ │ ├── CascadingPageTransformer.kt │ │ ├── DepthTransformation.kt │ │ ├── HingeTransformation.kt │ │ ├── HorizontalFlipTransformation.kt │ │ ├── NormalPageTransformer.kt │ │ ├── ParallaxPagerTransformer.kt │ │ ├── VerticalFlipTransformation.kt │ │ └── VerticalStackTransformer.kt │ │ ├── util │ │ ├── ArtistSignatureUtil.java │ │ ├── CalendarUtil.java │ │ ├── Compressor.java │ │ ├── CustomArtistImageUtil.kt │ │ ├── DensityUtil.java │ │ ├── FileUtil.java │ │ ├── ImageSaver.kt │ │ ├── ImageUtil.java │ │ ├── LastFMUtil.java │ │ ├── LyricUtil.java │ │ ├── MusicUtil.java │ │ ├── NavigationUtil.java │ │ ├── PlayerColorUtil.java │ │ ├── PlayerUtil.java │ │ ├── PlaylistsUtil.java │ │ ├── PreferenceUtil.java │ │ ├── RingtoneManager.kt │ │ ├── RippleUtils.java │ │ ├── SAFUtil.java │ │ ├── SwipeAndDragHelper.java │ │ ├── TempUtils.java │ │ ├── ThemeManager.kt │ │ ├── ViewUtil.kt │ │ └── color │ │ │ └── MediaNotificationProcessor.java │ │ ├── views │ │ ├── BaselineGridTextView.java │ │ ├── BottomNavigationBarTinted.kt │ │ ├── BreadCrumbLayout.java │ │ ├── CircularImageView.java │ │ ├── ColorIconsImageView.kt │ │ ├── DrawableGradient.java │ │ ├── HeightFitSquareLayout.java │ │ ├── ListItemView.kt │ │ ├── LollipopFixedWebView.java │ │ ├── MetalRecyclerViewPager.kt │ │ ├── NetworkImageView.java │ │ ├── OptionMenuItemView.java │ │ ├── SettingListItemView.kt │ │ ├── StatusBarMarginFrameLayout.java │ │ ├── StatusBarView.java │ │ ├── VerticalTextView.java │ │ ├── WidthFitSquareCardView.kt │ │ └── WidthFitSquareLayout.java │ │ └── volume │ │ ├── AudioVolumeContentObserver.java │ │ ├── AudioVolumeObserver.java │ │ └── OnAudioVolumeChangedListener.java │ └── res │ ├── anim │ ├── item_animation_fall_down.xml │ ├── layout_animation_fall_down.xml │ ├── sliding_in_left.xml │ └── sliding_out_right.xml │ ├── drawable-hdpi │ ├── default_album_art.webp │ ├── default_artist_art.webp │ └── ic_notification.png │ ├── drawable-mdpi │ ├── default_album_art.webp │ ├── default_artist_art.webp │ └── ic_notification.png │ ├── drawable-v21 │ ├── notification_selector.xml │ ├── round_selector.xml │ ├── saf_guide_1.webp │ ├── saf_guide_2.webp │ ├── saf_guide_3.webp │ ├── widget_selector.xml │ └── widget_selector_light.xml │ ├── drawable-v24 │ └── ic_music_foreground.xml │ ├── drawable-v26 │ ├── saf_guide_1.webp │ ├── saf_guide_2.webp │ └── saf_guide_3.webp │ ├── drawable-xhdpi │ ├── default_album_art.webp │ ├── default_artist_art.webp │ └── ic_notification.png │ ├── drawable-xxhdpi │ ├── default_album_art.webp │ ├── default_artist_art.webp │ └── ic_notification.png │ ├── drawable-xxxhdpi │ ├── default_album_art.webp │ ├── default_artist_art.webp │ ├── ic_notification.png │ ├── ic_splash.png │ ├── np_adaptive.webp │ ├── np_blur.webp │ ├── np_blur_card.webp │ ├── np_card.webp │ ├── np_circle.webp │ ├── np_color.webp │ ├── np_fit.webp │ ├── np_flat.webp │ ├── np_full.webp │ ├── np_material.webp │ ├── np_normal.webp │ ├── np_peak.webp │ ├── np_plain.webp │ ├── np_simple.webp │ └── np_tiny.webp │ ├── drawable │ ├── bottom_navigation_item_background.xml │ ├── bottom_navigation_item_background_mask.xml │ ├── bottom_navigation_item_colors.xml │ ├── card.xml │ ├── circle_progress.xml │ ├── color_circle_gradient.xml │ ├── color_progress_seek.xml │ ├── ic_access_time_white_24dp.xml │ ├── ic_account_white_24dp.xml │ ├── ic_add_photo_white_24dp.xml │ ├── ic_album_white_24dp.xml │ ├── ic_app_shortcut_background.xml │ ├── ic_app_shortcut_last_added.xml │ ├── ic_app_shortcut_search.xml │ ├── ic_app_shortcut_shuffle_all.xml │ ├── ic_app_shortcut_top_songs.xml │ ├── ic_artist_selected_white_24dp.xml │ ├── ic_artist_white_24dp.xml │ ├── ic_audiotrack_white_24dp.xml │ ├── ic_blur_on_white_24dp.xml │ ├── ic_bookmark_music_white_24dp.xml │ ├── ic_cellphone_lock_white_24dp.xml │ ├── ic_cellphone_white_24dp.xml │ ├── ic_clear_all_black_24dp.xml │ ├── ic_close_white_24dp.xml │ ├── ic_color_lens_white_24dp.xml │ ├── ic_colorize_white_24dp.xml │ ├── ic_delete_white_24dp.xml │ ├── ic_drag_vertical_white_24dp.xml │ ├── ic_edit_white_24dp.xml │ ├── ic_equalizer_white_24dp.xml │ ├── ic_favorite_border_white_24dp.xml │ ├── ic_favorite_white_24dp.xml │ ├── ic_file_music_white_24dp.xml │ ├── ic_filter_song_white_24dp.xml │ ├── ic_folder_white_24dp.xml │ ├── ic_github_circle_white_24dp.xml │ ├── ic_grid_size_white_24dp.xml │ ├── ic_guitar_acoustic_white_24dp.xml │ ├── ic_guitar_white_24dp.xml │ ├── ic_hdr_strong_white_24dp.xml │ ├── ic_home_white_24dp.xml │ ├── ic_image_white_24dp.xml │ ├── ic_info_outline_white_24dp.xml │ ├── ic_keyboard_arrow_down_black_24dp.xml │ ├── ic_keyboard_arrow_right_white_24dp.xml │ ├── ic_keyboard_arrow_up_24dp.xml │ ├── ic_keyboard_backspace_black_24dp.xml │ ├── ic_keyboard_white_24dp.xml │ ├── ic_library_add_white_24dp.xml │ ├── ic_library_music_white_24dp.xml │ ├── ic_menu_white_24dp.xml │ ├── ic_mic_white_24dp.xml │ ├── ic_more_vert_white_24dp.xml │ ├── ic_music_note_off_white_24dp.xml │ ├── ic_notifications_active_white_24dp.xml │ ├── ic_pause_white_24dp.xml │ ├── ic_pause_white_48dp.xml │ ├── ic_pause_white_64dp.xml │ ├── ic_person_flat.xml │ ├── ic_play_arrow_white_24dp.xml │ ├── ic_play_arrow_white_32dp.xml │ ├── ic_play_arrow_white_48dp.xml │ ├── ic_play_arrow_white_64dp.xml │ ├── ic_play_circle_filled_white_24dp.xml │ ├── ic_playlist_add_white_24dp.xml │ ├── ic_playlist_play_white_24dp.xml │ ├── ic_queue_music_white_24dp.xml │ ├── ic_redo_white_24dp.xml │ ├── ic_repeat_one_white_24dp.xml │ ├── ic_repeat_white_24dp.xml │ ├── ic_repeat_white_circle_24dp.xml │ ├── ic_rounded_corner.xml │ ├── ic_save_white_24dp.xml │ ├── ic_scanner_white_24dp.xml │ ├── ic_select_all_white_24dp.xml │ ├── ic_settings_brigntness_white_24dp.xml │ ├── ic_settings_white_24dp.xml │ ├── ic_share_white_24dp.xml │ ├── ic_shuffle_off_circled.xml │ ├── ic_shuffle_on_circled.xml │ ├── ic_shuffle_white_24dp.xml │ ├── ic_skip_next_round_white_32dp.xml │ ├── ic_skip_next_white_24dp.xml │ ├── ic_skip_previous_round_white_32dp.xml │ ├── ic_skip_previous_white_24dp.xml │ ├── ic_sort_white_24dp.xml │ ├── ic_telegram_white.xml │ ├── ic_testing_white_24dp.xml │ ├── ic_theme_palette_white_24dp.xml │ ├── ic_trending_up_white_24dp.xml │ ├── ic_view_carousel_black_24dp.xml │ ├── ic_volume_down_white_24dp.xml │ ├── ic_volume_off_white_24dp.xml │ ├── ic_volume_up_white_24dp.xml │ ├── line_button.xml │ ├── material_design_default.webp │ ├── notification_selector.xml │ ├── option_menu_background.xml │ ├── progress_drawable_vertical.xml │ ├── rect_selector.xml │ ├── round_selected.xml │ ├── round_selector.xml │ ├── round_window.xml │ ├── shadow_down.xml │ ├── shadow_down_strong.xml │ ├── shadow_up.xml │ ├── shadow_up_edited.xml │ ├── shadow_up_full_theme.xml │ ├── shadow_up_home.xml │ ├── shadow_up_strong.xml │ ├── slider_thumb.xml │ ├── splash.xml │ ├── square_window.xml │ ├── switch_square.xml │ ├── switch_thumb_material.xml │ ├── tab_indicator.xml │ ├── widget_selector.xml │ ├── widget_selector_dark.xml │ └── widget_selector_light.xml │ ├── font │ ├── circular.xml │ ├── circular_std_black.otf │ ├── circular_std_book.otf │ └── circular_std_medium.otf │ ├── layout-land │ ├── activity_album.xml │ ├── activity_album_tag_editor.xml │ ├── activity_artist_details.xml │ ├── fragment_banner_home.xml │ ├── fragment_blur.xml │ ├── fragment_card_blur_player.xml │ ├── fragment_card_player.xml │ ├── fragment_color_player.xml │ ├── fragment_flat_player.xml │ ├── fragment_home.xml │ ├── fragment_material.xml │ ├── fragment_plain_player.xml │ ├── fragment_player.xml │ ├── fragment_simple_player.xml │ └── pager_item.xml │ ├── layout-sw600dp-land │ └── activity_settings.xml │ ├── layout-xlarge-land │ ├── activity_album.xml │ ├── activity_artist_details.xml │ ├── fragment_banner_home.xml │ ├── fragment_blur.xml │ ├── fragment_home.xml │ ├── fragment_player.xml │ ├── fragment_player_playback_controls.xml │ └── pager_item.xml │ ├── layout-xlarge │ ├── activity_about_content.xml │ ├── activity_album.xml │ ├── activity_artist_details.xml │ ├── activity_user_info.xml │ ├── fragment_album_card_cover.xml │ ├── fragment_banner_home.xml │ ├── fragment_blur.xml │ ├── fragment_home.xml │ ├── fragment_mini_player.xml │ ├── fragment_player.xml │ ├── item_artist.xml │ ├── item_image.xml │ └── pager_item.xml │ ├── layout │ ├── abs_playlists.xml │ ├── activity_about.xml │ ├── activity_about_content.xml │ ├── activity_album.xml │ ├── activity_album_content.xml │ ├── activity_album_tag_editor.xml │ ├── activity_artist_content.xml │ ├── activity_artist_details.xml │ ├── activity_lock_screen.xml │ ├── activity_lyrics.xml │ ├── activity_main_content.xml │ ├── activity_playing_queue.xml │ ├── activity_playlist_detail.xml │ ├── activity_search.xml │ ├── activity_settings.xml │ ├── activity_song_tag_editor.xml │ ├── activity_user_info.xml │ ├── app_widget_big.xml │ ├── app_widget_card.xml │ ├── app_widget_classic.xml │ ├── app_widget_small.xml │ ├── app_widget_text.xml │ ├── bread_crumb.xml │ ├── card_player_info.xml │ ├── card_version.xml │ ├── dialog_file_details.xml │ ├── dialog_playlist.xml │ ├── dialog_sleep_timer.xml │ ├── fragment_adaptive_player.xml │ ├── fragment_adaptive_player_playback_controls.xml │ ├── fragment_album_card_cover.xml │ ├── fragment_album_carousel_cover.xml │ ├── fragment_album_circle_cover.xml │ ├── fragment_album_cover.xml │ ├── fragment_album_flat_cover.xml │ ├── fragment_album_full_card_cover.xml │ ├── fragment_album_full_cover.xml │ ├── fragment_album_material_cover.xml │ ├── fragment_banner_home.xml │ ├── fragment_blur.xml │ ├── fragment_blur_player_playback_controls.xml │ ├── fragment_card_blur_player.xml │ ├── fragment_card_blur_player_playback_controls.xml │ ├── fragment_card_player.xml │ ├── fragment_card_player_playback_controls.xml │ ├── fragment_color_player.xml │ ├── fragment_color_player_playback_controls.xml │ ├── fragment_fit.xml │ ├── fragment_fit_playback_controls.xml │ ├── fragment_flat_player.xml │ ├── fragment_flat_player_playback_controls.xml │ ├── fragment_folder.xml │ ├── fragment_full.xml │ ├── fragment_full_player_controls.xml │ ├── fragment_home.xml │ ├── fragment_library.xml │ ├── fragment_lock_screen_playback_controls.xml │ ├── fragment_lyrics.xml │ ├── fragment_main_activity_recycler_view.xml │ ├── fragment_main_options.xml │ ├── fragment_main_settings.xml │ ├── fragment_material.xml │ ├── fragment_material_playback_controls.xml │ ├── fragment_mini_player.xml │ ├── fragment_peak_control_player.xml │ ├── fragment_peak_player.xml │ ├── fragment_plain_controls_fragment.xml │ ├── fragment_plain_player.xml │ ├── fragment_player.xml │ ├── fragment_player_album_cover.xml │ ├── fragment_player_playback_controls.xml │ ├── fragment_simple_controls_fragment.xml │ ├── fragment_simple_player.xml │ ├── fragment_simple_slide_large_image.xml │ ├── fragment_synced.xml │ ├── fragment_tiny_controls_fragment.xml │ ├── fragment_tiny_player.xml │ ├── fragment_volume.xml │ ├── home_content.xml │ ├── image.xml │ ├── item_album_card.xml │ ├── item_artist.xml │ ├── item_artist_square.xml │ ├── item_card.xml │ ├── item_card_color.xml │ ├── item_grid.xml │ ├── item_grid_circle.xml │ ├── item_image.xml │ ├── item_image_gradient.xml │ ├── item_list.xml │ ├── item_list_no_image.xml │ ├── item_list_quick_actions.xml │ ├── item_option_menu.xml │ ├── item_queue.xml │ ├── item_song.xml │ ├── layout_notification_collapsed.xml │ ├── layout_notification_expanded.xml │ ├── list_item_view.xml │ ├── list_item_view_no_title.xml │ ├── list_item_view_seekbar.xml │ ├── list_item_view_switch.xml │ ├── list_item_view_switch_no_title.xml │ ├── list_setting_item_view.xml │ ├── loading.xml │ ├── media_button.xml │ ├── metal_section_recycler_view.xml │ ├── pager_item.xml │ ├── preference_category_title.xml │ ├── preference_dialog_library_categories.xml │ ├── preference_dialog_library_categories_listitem.xml │ ├── preference_dialog_now_playing_screen.xml │ ├── preference_now_playing_screen_item.xml │ ├── section_recycler_view.xml │ ├── shadow_statusbar_toolbar.xml │ ├── sliding_music_panel_layout.xml │ ├── status_bar.xml │ └── sub_header.xml │ ├── menu │ ├── bottom_navigation_main.xml │ ├── menu_album_detail.xml │ ├── menu_artist_detail.xml │ ├── menu_cannot_delete_single_songs_playlist_songs_selection.xml │ ├── menu_folders.xml │ ├── menu_genre_detail.xml │ ├── menu_item_cannot_delete_single_songs_playlist_song.xml │ ├── menu_item_directory.xml │ ├── menu_item_file.xml │ ├── menu_item_playing_queue_song.xml │ ├── menu_item_playlist.xml │ ├── menu_item_playlist_song.xml │ ├── menu_item_smart_playlist.xml │ ├── menu_item_song.xml │ ├── menu_main.xml │ ├── menu_media_selection.xml │ ├── menu_player.xml │ ├── menu_playlist_detail.xml │ ├── menu_playlists_selection.xml │ ├── menu_playlists_songs_selection.xml │ ├── menu_search.xml │ └── menu_smart_playlist_detail.xml │ ├── mipmap-anydpi-v26 │ ├── ic_music.xml │ └── ic_music_round.xml │ ├── mipmap-hdpi │ ├── ic_music.png │ └── ic_music_round.png │ ├── mipmap-mdpi │ ├── ic_music.png │ └── ic_music_round.png │ ├── mipmap-xhdpi │ ├── ic_music.png │ └── ic_music_round.png │ ├── mipmap-xxhdpi │ ├── ic_music.png │ └── ic_music_round.png │ ├── mipmap-xxxhdpi │ ├── ic_music.png │ └── ic_music_round.png │ ├── values-land │ ├── dimens.xml │ └── integers.xml │ ├── values-large │ └── dimens.xml │ ├── values-night-v27 │ └── styles.xml │ ├── values-night │ └── styles.xml │ ├── values-ru │ └── strings.xml │ ├── values-sw600dp │ └── integers.xml │ ├── values-v21 │ └── styles.xml │ ├── values-v23 │ ├── dimens.xml │ └── styles.xml │ ├── values-v27 │ └── styles_parents.xml │ ├── values-xlarge │ └── dimens.xml │ ├── values │ ├── arrays.xml │ ├── attrs.xml │ ├── baseline_textview_attrs.xml │ ├── circular_image_view_attrs.xml │ ├── color_icon_view_attrs.xml │ ├── colors.xml │ ├── dimens.xml │ ├── donottranslate.xml │ ├── ids.xml │ ├── integers.xml │ ├── list_item_view.xml │ ├── list_setting_item_view.xml │ ├── lrc_view_attrs.xml │ ├── metal_recycler_view_attrs.xml │ ├── strings.xml │ ├── styles.xml │ ├── styles_parents.xml │ └── values.xml │ └── xml │ ├── app_widget_big_info.xml │ ├── app_widget_card_info.xml │ ├── app_widget_classic_info.xml │ ├── app_widget_small_info.xml │ ├── app_widget_text.xml │ ├── pref_advanced.xml │ ├── pref_audio.xml │ ├── pref_general.xml │ ├── pref_images.xml │ ├── pref_notification.xml │ ├── pref_now_playing_screen.xml │ ├── pref_ui.xml │ └── provider_paths.xml ├── appthemehelper ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── maxfour │ │ └── appthemehelper │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── maxfour │ │ │ └── appthemehelper │ │ │ ├── ATH.kt │ │ │ ├── ATHActivity.kt │ │ │ ├── ColorPalette.kt │ │ │ ├── ThemeStore.kt │ │ │ ├── ThemeStoreInterface.kt │ │ │ ├── ThemeStorePrefKeys.kt │ │ │ ├── common │ │ │ ├── ATHActionBarActivity.kt │ │ │ ├── ATHToolbarActivity.java │ │ │ ├── prefs │ │ │ │ ├── ATEColorPreference.kt │ │ │ │ ├── BorderCircleView.kt │ │ │ │ └── supportv7 │ │ │ │ │ ├── ATEColorPreference.kt │ │ │ │ │ ├── ATEDialogPreference.kt │ │ │ │ │ ├── ATEEditTextPreference.kt │ │ │ │ │ ├── ATEListPreference.java │ │ │ │ │ ├── ATEPreference.kt │ │ │ │ │ ├── ATEPreferenceCategory.kt │ │ │ │ │ ├── ATEPreferenceFragmentCompat.kt │ │ │ │ │ ├── ATESeekBarPreference.kt │ │ │ │ │ ├── ATESwitchPreference.kt │ │ │ │ │ └── dialogs │ │ │ │ │ ├── ATEListPreferenceDialogFragmentCompat.java │ │ │ │ │ └── ATEPreferenceDialogFragment.java │ │ │ └── views │ │ │ │ ├── ATEAccentTextView.kt │ │ │ │ ├── ATECheckBox.kt │ │ │ │ ├── ATEPrimaryTextView.kt │ │ │ │ ├── ATESecondaryTextView.kt │ │ │ │ └── ATESwitch.kt │ │ │ └── util │ │ │ ├── ATHUtil.kt │ │ │ ├── ColorUtil.kt │ │ │ ├── DrawableUtil.kt │ │ │ ├── MaterialUtil.kt │ │ │ ├── MaterialValueHelper.kt │ │ │ ├── NavigationViewUtil.kt │ │ │ ├── TabLayoutUtil.kt │ │ │ ├── TextInputLayoutUtil.kt │ │ │ ├── TintHelper.java │ │ │ ├── ToolbarContentTintHelper.java │ │ │ ├── VersionUtils.kt │ │ │ └── ViewUtil.kt │ └── res │ │ ├── drawable │ │ ├── ate_check.xml │ │ ├── ate_switch.xml │ │ ├── ic_toggle_switch.xml │ │ └── ic_toggle_switch_off.xml │ │ ├── layout │ │ ├── ate_preference_color.xml │ │ ├── ate_preference_custom.xml │ │ ├── ate_preference_custom_support.xml │ │ ├── ate_preference_list.xml │ │ └── ate_preference_switch_support.xml │ │ ├── values-large │ │ └── dimens.xml │ │ └── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── colors_material_design.xml │ │ ├── dimens.xml │ │ ├── ids.xml │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── maxfour │ └── appthemehelper │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── images └── Icon.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | #built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # files for the dex VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # generated files 12 | bin/ 13 | gen/ 14 | 15 | # Local configuration file (sdk path, etc) 16 | local.properties 17 | 18 | # Windows thumbnail db 19 | Thumbs.db 20 | 21 | # OSX files 22 | .DS_Store 23 | 24 | # Eclipse project files 25 | .classpath 26 | .project 27 | 28 | # Android Studio 29 | *.iml 30 | .idea 31 | #.idea/workspace.xml - remove # and delete .idea if it better suit your needs. 32 | .gradle 33 | build/ 34 | 35 | #NDK 36 | obj/ 37 | 38 | captures 39 | app/normal/release/ 40 | /models/ 41 | 42 | app/font/ 43 | app/src/debug/ 44 | app/src/font/ 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Libre Player 2 | 3 | [![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg?style=flat-square)](https://github.com/MaxFour/LibrePlayer/blob/master/LICENSE) 4 | [![API](https://img.shields.io/badge/API-21%2B-orange.svg?logo=android&style=flat-square)](https://android-arsenal.com/api?level=16) 5 | [![Telegram](https://img.shields.io/badge/Telegram-2CA5E0.svg?logo=telegram&style=flat-square)](https://t.me/max_four "Contact me in Telegram") 6 | [![Gmail](https://img.shields.io/badge/Gmail-666666.svg?logo=gmail&logoColor=D14836&style=flat-square)](mailto:mansurov.maksud@gmail.com "Write an email") 7 | 8 | Based on [Retro Music Player](https://github.com/h4h13/RetroMusicPlayer) 9 |

10 | 11 | Music icon by Icons8 12 | 13 | ### Donation 14 | 15 | WebMoney:
16 | $: Z776114750889
17 | ₽: R282056119931 18 | 19 | Yandex.Money: 20 | - 4100 1537 2205 898 21 | -------------------------------------------------------------------------------- /app/libs/juniversalchardet-1.0.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/libs/juniversalchardet-1.0.3.jar -------------------------------------------------------------------------------- /app/src/main/ic_music-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/ic_music-web.png -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/Result.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer 2 | 3 | sealed class Result { 4 | 5 | class Success(val data: T) : Result() 6 | 7 | class Error(val exception: Throwable) : Result() 8 | } -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/appshortcuts/shortcuttype/SearchShortCutType.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.appshortcuts.shortcuttype 2 | 3 | import android.annotation.TargetApi 4 | import android.content.Context 5 | import android.content.pm.ShortcutInfo 6 | import android.os.Build 7 | import com.maxfour.libreplayer.R 8 | import com.maxfour.libreplayer.appshortcuts.AppShortcutIconGenerator 9 | import com.maxfour.libreplayer.appshortcuts.AppShortcutLauncherActivity 10 | 11 | @TargetApi(Build.VERSION_CODES.N_MR1) 12 | class SearchShortCutType(context: Context) : BaseShortcutType(context) { 13 | companion object { 14 | 15 | val id: String 16 | get() = BaseShortcutType.ID_PREFIX + "search" 17 | } 18 | 19 | override val shortcutInfo: ShortcutInfo 20 | get() = ShortcutInfo.Builder( 21 | context, 22 | id 23 | ).setShortLabel(context.getString(R.string.action_search)).setLongLabel(context.getString(R.string.search_hint)).setIcon( 24 | AppShortcutIconGenerator.generateThemedIcon( 25 | context, 26 | R.drawable.ic_app_shortcut_search 27 | ) 28 | ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SEARCH)).build() 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/appshortcuts/shortcuttype/ShuffleAllShortcutType.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.appshortcuts.shortcuttype 2 | 3 | import android.annotation.TargetApi 4 | import android.content.Context 5 | import android.content.pm.ShortcutInfo 6 | import android.os.Build 7 | import com.maxfour.libreplayer.R 8 | import com.maxfour.libreplayer.appshortcuts.AppShortcutIconGenerator 9 | import com.maxfour.libreplayer.appshortcuts.AppShortcutLauncherActivity 10 | 11 | @TargetApi(Build.VERSION_CODES.N_MR1) 12 | class ShuffleAllShortcutType(context: Context) : BaseShortcutType(context) { 13 | 14 | override val shortcutInfo: ShortcutInfo 15 | get() = ShortcutInfo.Builder( 16 | context, id 17 | ).setShortLabel(context.getString(R.string.app_shortcut_shuffle_all_short)).setLongLabel( 18 | context.getString(R.string.app_shortcut_shuffle_all_long) 19 | ).setIcon( 20 | AppShortcutIconGenerator.generateThemedIcon( 21 | context, R.drawable.ic_app_shortcut_shuffle_all 22 | ) 23 | ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SHUFFLE_ALL)).build() 24 | 25 | companion object { 26 | 27 | val id: String 28 | get() = BaseShortcutType.ID_PREFIX + "shuffle_all" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/appshortcuts/shortcuttype/TopSongsShortcutType.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.appshortcuts.shortcuttype 2 | 3 | import android.annotation.TargetApi 4 | import android.content.Context 5 | import android.content.pm.ShortcutInfo 6 | import android.os.Build 7 | import com.maxfour.libreplayer.R 8 | import com.maxfour.libreplayer.appshortcuts.AppShortcutIconGenerator 9 | import com.maxfour.libreplayer.appshortcuts.AppShortcutLauncherActivity 10 | 11 | @TargetApi(Build.VERSION_CODES.N_MR1) 12 | class TopSongsShortcutType(context: Context) : BaseShortcutType(context) { 13 | 14 | override val shortcutInfo: ShortcutInfo 15 | get() = ShortcutInfo.Builder( 16 | context, id 17 | ).setShortLabel(context.getString(R.string.app_shortcut_top_songs_short)).setLongLabel( 18 | context.getString(R.string.app_shortcut_top_songs_long) 19 | ).setIcon( 20 | AppShortcutIconGenerator.generateThemedIcon( 21 | context, R.drawable.ic_app_shortcut_top_songs 22 | ) 23 | ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_TOP_SONGS)).build() 24 | 25 | companion object { 26 | 27 | val id: String 28 | get() = BaseShortcutType.ID_PREFIX + "top_songs" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/dagger/module/AppModule.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.dagger.module 2 | 3 | import android.app.Application 4 | import android.content.Context 5 | 6 | import dagger.Module 7 | import dagger.Provides 8 | import javax.inject.Singleton 9 | 10 | @Module 11 | class AppModule(private val application: Application) { 12 | 13 | @Provides 14 | @Singleton 15 | fun provideContext(): Context = application 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/deezer/DeezerResponse.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.deezer 2 | 3 | import com.google.gson.annotations.SerializedName 4 | 5 | data class Data( 6 | val id: String, 7 | val link: String, 8 | val name: String, 9 | @SerializedName("nb_album") 10 | val nbAlbum: Int, 11 | @SerializedName("nb_fan") 12 | val nbFan: Int, 13 | val picture: String, 14 | @SerializedName("picture_big") 15 | val pictureBig: String, 16 | @SerializedName("picture_medium") 17 | val pictureMedium: String, 18 | @SerializedName("picture_small") 19 | val pictureSmall: String, 20 | @SerializedName("picture_xl") 21 | val pictureXl: String, 22 | val radio: Boolean, 23 | val songlist: String, 24 | val type: String 25 | ) 26 | 27 | data class DeezerResponse( 28 | val data: List, 29 | val next: String, 30 | val total: Int 31 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/extensions/ActivityEx.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.extensions 2 | 3 | import android.content.res.ColorStateList 4 | import androidx.appcompat.app.AppCompatActivity 5 | import androidx.appcompat.widget.Toolbar 6 | import com.maxfour.appthemehelper.util.ATHUtil 7 | import com.maxfour.appthemehelper.util.ToolbarContentTintHelper 8 | import com.maxfour.libreplayer.R 9 | 10 | fun AppCompatActivity.applyToolbar(toolbar: Toolbar) { 11 | toolbar.apply { 12 | setNavigationOnClickListener { onBackPressed() } 13 | setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp) 14 | ToolbarContentTintHelper.colorBackButton(toolbar) 15 | backgroundTintList = ColorStateList.valueOf(ATHUtil.resolveColor(this@applyToolbar, R.attr.colorSurface)) 16 | } 17 | setSupportActionBar(toolbar) 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/extensions/ColorExt.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.extensions 2 | 3 | import android.content.Context 4 | import android.content.res.ColorStateList 5 | import android.graphics.Color 6 | import androidx.appcompat.widget.Toolbar 7 | import com.maxfour.appthemehelper.util.ATHUtil 8 | import com.maxfour.appthemehelper.util.ColorUtil 9 | import com.maxfour.libreplayer.R 10 | 11 | fun Int.ripAlpha(): Int { 12 | return ColorUtil.stripAlpha(this) 13 | } 14 | 15 | fun Any.surfaceColor(context: Context): Int { 16 | return ATHUtil.resolveColor(context, R.attr.colorSurface, Color.WHITE) 17 | } 18 | 19 | fun Toolbar.backgroundTintList() { 20 | val surfaceColor = ATHUtil.resolveColor(context, R.attr.colorSurface, Color.BLACK) 21 | val colorStateList = ColorStateList.valueOf(surfaceColor) 22 | backgroundTintList = colorStateList 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/extensions/DrawableExt.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.extensions 2 | 3 | import android.content.Context 4 | import android.graphics.Bitmap 5 | import android.graphics.BitmapFactory 6 | import android.graphics.drawable.BitmapDrawable 7 | import android.graphics.drawable.Drawable 8 | import androidx.annotation.DimenRes 9 | import androidx.annotation.DrawableRes 10 | 11 | fun Context.scaledDrawableResources(@DrawableRes id: Int, @DimenRes width: Int, @DimenRes height: Int): Drawable { 12 | val w = resources.getDimension(width).toInt() 13 | val h = resources.getDimension(height).toInt() 14 | return scaledDrawable(id, w, h) 15 | } 16 | 17 | fun Context.scaledDrawable(@DrawableRes id: Int, width: Int, height: Int): Drawable { 18 | val bmp = BitmapFactory.decodeResource(resources, id) 19 | val bmpScaled = Bitmap.createScaledBitmap(bmp, width, height, false) 20 | return BitmapDrawable(resources, bmpScaled) 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/extensions/ListEx.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.extensions 2 | 3 | import com.maxfour.libreplayer.helper.MusicPlayerRemote 4 | import com.maxfour.libreplayer.model.Song 5 | 6 | fun ArrayList.lastElement(): Boolean { 7 | println("${this.size} ${this.indexOf(MusicPlayerRemote.currentSong)}") 8 | return this.size - 1 == this.indexOf(MusicPlayerRemote.currentSong) 9 | } 10 | 11 | fun ArrayList.fistElement(): Boolean { 12 | return 0 == this.indexOf(MusicPlayerRemote.currentSong) 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/extensions/ViewExtensions.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.extensions 2 | 3 | import android.view.LayoutInflater 4 | import android.view.View 5 | import android.view.ViewGroup 6 | import android.widget.EditText 7 | import androidx.annotation.LayoutRes 8 | import com.maxfour.appthemehelper.ThemeStore 9 | import com.maxfour.appthemehelper.util.TintHelper 10 | 11 | @Suppress("UNCHECKED_CAST") 12 | fun ViewGroup.inflate(@LayoutRes layout: Int): T { 13 | return LayoutInflater.from(context).inflate(layout, this, false) as T 14 | } 15 | 16 | fun View.show() { 17 | visibility = View.VISIBLE 18 | } 19 | 20 | fun View.hide() { 21 | visibility = View.GONE 22 | } 23 | 24 | fun View.hidden() { 25 | visibility = View.INVISIBLE 26 | } 27 | 28 | fun View.showOrHide(show: Boolean) = if (show) show() else hide() 29 | 30 | fun EditText.appHandleColor(): EditText { 31 | TintHelper.colorHandles(this, ThemeStore.accentColor(context)) 32 | return this 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/fragments/AlbumCoverStyle.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.fragments 2 | 3 | import androidx.annotation.DrawableRes 4 | import androidx.annotation.StringRes 5 | import com.maxfour.libreplayer.R 6 | 7 | enum class AlbumCoverStyle(@param:StringRes @field:StringRes 8 | val titleRes: Int, 9 | @param:DrawableRes @field:DrawableRes 10 | val drawableResId: Int, val id: Int) { 11 | NORMAL(R.string.normal, R.drawable.np_normal, 0), 12 | FLAT(R.string.flat, R.drawable.np_flat, 1), 13 | CIRCLE(R.string.circular, R.drawable.np_circle, 2), 14 | MATERIAL(R.string.material, R.drawable.np_material, 3), 15 | CARD(R.string.card, R.drawable.np_blur_card, 4), 16 | FULL(R.string.full, R.drawable.np_full, 5), 17 | FULL_CARD(R.string.full_card, R.drawable.np_adaptive, 6) 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/fragments/base/AbsLibraryPagerFragment.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.fragments.base 2 | 3 | import android.os.Bundle 4 | import com.maxfour.libreplayer.fragments.mainactivity.LibraryFragment 5 | 6 | open class AbsLibraryPagerFragment : AbsMusicServiceFragment() { 7 | 8 | 9 | val libraryFragment: LibraryFragment 10 | get() = parentFragment as LibraryFragment 11 | 12 | override fun onActivityCreated(savedInstanceState: Bundle?) { 13 | super.onActivityCreated(savedInstanceState) 14 | setHasOptionsMenu(true) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/fragments/settings/ImageSettingFragment.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.fragments.settings 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import androidx.preference.Preference 6 | import com.maxfour.libreplayer.R 7 | 8 | class ImageSettingFragment : AbsSettingsFragment() { 9 | override fun invalidateSettings() { 10 | val autoDownloadImagesPolicy: Preference = findPreference("auto_download_images_policy")!! 11 | setSummary(autoDownloadImagesPolicy) 12 | autoDownloadImagesPolicy.setOnPreferenceChangeListener { _, o -> 13 | setSummary(autoDownloadImagesPolicy, o) 14 | true 15 | } 16 | 17 | } 18 | 19 | override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { 20 | addPreferencesFromResource(R.xml.pref_images) 21 | } 22 | 23 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 24 | super.onViewCreated(view, savedInstanceState) 25 | val preference: Preference? = findPreference("auto_download_images_policy") 26 | preference?.let { setSummary(it) } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/fragments/settings/OtherSettingsFragment.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.fragments.settings 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import androidx.preference.Preference 6 | 7 | import com.maxfour.libreplayer.R 8 | 9 | class OtherSettingsFragment : AbsSettingsFragment() { 10 | override fun invalidateSettings() { 11 | 12 | } 13 | 14 | override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { 15 | addPreferencesFromResource(R.xml.pref_advanced) 16 | } 17 | 18 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 19 | super.onViewCreated(view, savedInstanceState) 20 | val preference: Preference = findPreference("last_added_interval")!! 21 | setSummary(preference) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/glide/PlayerGlideModule.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.glide 2 | 3 | import android.content.Context 4 | import com.bumptech.glide.Glide 5 | import com.bumptech.glide.GlideBuilder 6 | import com.bumptech.glide.module.GlideModule 7 | import com.maxfour.libreplayer.glide.artistimage.ArtistImage 8 | import com.maxfour.libreplayer.glide.artistimage.Factory 9 | import com.maxfour.libreplayer.glide.audiocover.AudioFileCover 10 | import com.maxfour.libreplayer.glide.audiocover.AudioFileCoverLoader 11 | import java.io.InputStream 12 | 13 | class PlayerGlideModule : GlideModule { 14 | override fun applyOptions(context: Context, builder: GlideBuilder) { 15 | } 16 | 17 | override fun registerComponents(context: Context, glide: Glide) { 18 | glide.register(AudioFileCover::class.java, InputStream::class.java, AudioFileCoverLoader.Factory()) 19 | glide.register(ArtistImage::class.java, InputStream::class.java, Factory(context)) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/glide/audiocover/AudioFileCover.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.glide.audiocover; 2 | 3 | public class AudioFileCover { 4 | public final String filePath; 5 | 6 | public AudioFileCover(String filePath) { 7 | this.filePath = filePath; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/glide/audiocover/AudioFileCoverLoader.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.glide.audiocover; 2 | 3 | import android.content.Context; 4 | 5 | import com.bumptech.glide.load.data.DataFetcher; 6 | import com.bumptech.glide.load.model.GenericLoaderFactory; 7 | import com.bumptech.glide.load.model.ModelLoader; 8 | import com.bumptech.glide.load.model.ModelLoaderFactory; 9 | import com.bumptech.glide.load.model.stream.StreamModelLoader; 10 | 11 | import java.io.InputStream; 12 | 13 | public class AudioFileCoverLoader implements StreamModelLoader { 14 | 15 | @Override 16 | public DataFetcher getResourceFetcher(AudioFileCover model, int width, int height) { 17 | return new AudioFileCoverFetcher(model); 18 | } 19 | 20 | public static class Factory implements ModelLoaderFactory { 21 | @Override 22 | public ModelLoader build(Context context, GenericLoaderFactory factories) { 23 | return new AudioFileCoverLoader(); 24 | } 25 | 26 | @Override 27 | public void teardown() { 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/glide/palette/BitmapPaletteResource.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.glide.palette; 2 | 3 | import com.bumptech.glide.load.engine.Resource; 4 | import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; 5 | import com.bumptech.glide.util.Util; 6 | 7 | public class BitmapPaletteResource implements Resource { 8 | 9 | private final BitmapPaletteWrapper bitmapPaletteWrapper; 10 | private final BitmapPool bitmapPool; 11 | 12 | public BitmapPaletteResource(BitmapPaletteWrapper bitmapPaletteWrapper, BitmapPool bitmapPool) { 13 | this.bitmapPaletteWrapper = bitmapPaletteWrapper; 14 | this.bitmapPool = bitmapPool; 15 | } 16 | 17 | @Override 18 | public BitmapPaletteWrapper get() { 19 | return bitmapPaletteWrapper; 20 | } 21 | 22 | @Override 23 | public int getSize() { 24 | return Util.getBitmapByteSize(bitmapPaletteWrapper.getBitmap()); 25 | } 26 | 27 | @Override 28 | public void recycle() { 29 | if (!bitmapPool.put(bitmapPaletteWrapper.getBitmap())) { 30 | bitmapPaletteWrapper.getBitmap().recycle(); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/glide/palette/BitmapPaletteTarget.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.glide.palette; 2 | 3 | import android.widget.ImageView; 4 | 5 | import com.bumptech.glide.request.target.ImageViewTarget; 6 | 7 | public class BitmapPaletteTarget extends ImageViewTarget { 8 | public BitmapPaletteTarget(ImageView view) { 9 | super(view); 10 | } 11 | 12 | @Override 13 | protected void setResource(BitmapPaletteWrapper bitmapPaletteWrapper) { 14 | view.setImageBitmap(bitmapPaletteWrapper.getBitmap()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/glide/palette/BitmapPaletteWrapper.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.glide.palette; 2 | 3 | import android.graphics.Bitmap; 4 | 5 | import androidx.palette.graphics.Palette; 6 | 7 | public class BitmapPaletteWrapper { 8 | private final Bitmap mBitmap; 9 | private final Palette mPalette; 10 | 11 | public BitmapPaletteWrapper(Bitmap bitmap, Palette palette) { 12 | mBitmap = bitmap; 13 | mPalette = palette; 14 | } 15 | 16 | public Bitmap getBitmap() { 17 | return mBitmap; 18 | } 19 | 20 | public Palette getPalette() { 21 | return mPalette; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/helper/HorizontalAdapterHelper.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.helper 2 | 3 | import android.content.Context 4 | import android.view.ViewGroup 5 | import com.maxfour.libreplayer.R 6 | 7 | object HorizontalAdapterHelper { 8 | 9 | const val LAYOUT_RES = R.layout.item_image 10 | 11 | private const val TYPE_FIRST = 1 12 | private const val TYPE_MIDDLE = 2 13 | private const val TYPE_LAST = 3 14 | 15 | fun applyMarginToLayoutParams(context: Context, 16 | layoutParams: ViewGroup.MarginLayoutParams, viewType: Int) { 17 | val listMargin = context.resources 18 | .getDimensionPixelSize(R.dimen.now_playing_top_margin) 19 | if (viewType == TYPE_FIRST) { 20 | layoutParams.leftMargin = listMargin 21 | } else if (viewType == TYPE_LAST) { 22 | layoutParams.rightMargin = listMargin 23 | } 24 | } 25 | 26 | fun getItemViewtype(position: Int, itemCount: Int): Int { 27 | return when (position) { 28 | 0 -> TYPE_FIRST 29 | itemCount - 1 -> TYPE_LAST 30 | else -> TYPE_MIDDLE 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/helper/M3UConstants.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.helper; 2 | 3 | public interface M3UConstants { 4 | String EXTENSION = "m3u"; 5 | String HEADER = "#EXTM3U"; 6 | String ENTRY = "#EXTINF:"; 7 | String DURATION_SEPARATOR = ","; 8 | } -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/helper/PlayPauseButtonOnClickHandler.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.helper 2 | 3 | import android.view.View 4 | 5 | class PlayPauseButtonOnClickHandler : View.OnClickListener { 6 | override fun onClick(v: View) { 7 | if (MusicPlayerRemote.isPlaying) { 8 | MusicPlayerRemote.pauseSong() 9 | } else { 10 | MusicPlayerRemote.resumePlaying() 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/helper/ShuffleHelper.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.helper 2 | 3 | import com.maxfour.libreplayer.model.Song 4 | 5 | object ShuffleHelper { 6 | 7 | fun makeShuffleList(listToShuffle: MutableList, current: Int) { 8 | if (listToShuffle.isEmpty()) return 9 | if (current >= 0) { 10 | val song = listToShuffle.removeAt(current) 11 | listToShuffle.shuffle() 12 | listToShuffle.add(0, song) 13 | } else { 14 | listToShuffle.shuffle() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/interfaces/CabHolder.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.interfaces 2 | 3 | import com.afollestad.materialcab.MaterialCab 4 | 5 | interface CabHolder { 6 | 7 | fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/interfaces/EqualizerInterface.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.interfaces 2 | 3 | import android.media.audiofx.BassBoost 4 | import android.media.audiofx.Equalizer 5 | import android.media.audiofx.Virtualizer 6 | 7 | interface EqualizerInterface { 8 | val bandLevelLow: Int 9 | 10 | val bandLevelHigh: Int 11 | 12 | val numberOfBands: Int 13 | 14 | var isBassBoostEnabled: Boolean 15 | 16 | var bassBoostStrength: Int 17 | 18 | var isVirtualizerEnabled: Boolean 19 | 20 | var virtualizerStrength: Int 21 | 22 | val isRunning: Boolean 23 | 24 | val equalizer: Equalizer 25 | 26 | val bassBoost: BassBoost 27 | 28 | val virtualizer: Virtualizer 29 | 30 | fun getCenterFreq(band: Int): Int 31 | 32 | fun getBandLevel(band: Int): Int 33 | 34 | fun setBandLevel(band: Int, level: Int) 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/interfaces/LoaderIds.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.interfaces 2 | 3 | interface LoaderIds { 4 | companion object { 5 | val FOLDERS_FRAGMENT = 5 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/interfaces/MainActivityFragmentCallbacks.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.interfaces 2 | 3 | interface MainActivityFragmentCallbacks { 4 | fun handleBackPress(): Boolean 5 | 6 | //void selectedFragment(Fragment fragment); 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/interfaces/MusicServiceEventListener.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.interfaces 2 | 3 | interface MusicServiceEventListener { 4 | fun onServiceConnected() 5 | 6 | fun onServiceDisconnected() 7 | 8 | fun onQueueChanged() 9 | 10 | fun onPlayingMetaChanged() 11 | 12 | fun onPlayStateChanged() 13 | 14 | fun onRepeatModeChanged() 15 | 16 | fun onShuffleModeChanged() 17 | 18 | fun onMediaStoreChanged() 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/interfaces/PaletteColorHolder.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.interfaces 2 | 3 | import androidx.annotation.ColorInt 4 | 5 | interface PaletteColorHolder { 6 | 7 | @get:ColorInt 8 | val paletteColor: Int 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/lyrics/Lrc.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.lyrics; 2 | 3 | public class Lrc { 4 | private long time; 5 | private String text; 6 | 7 | public long getTime() { 8 | return time; 9 | } 10 | 11 | public void setTime(long time) { 12 | this.time = time; 13 | } 14 | 15 | public String getText() { 16 | return text; 17 | } 18 | 19 | public void setText(String text) { 20 | this.text = text; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/misc/GenericFileProvider.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.misc; 2 | 3 | import androidx.core.content.FileProvider; 4 | 5 | public class GenericFileProvider extends FileProvider { 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/misc/SimpleAnimatorListener.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.misc 2 | 3 | import android.animation.Animator 4 | 5 | 6 | abstract class SimpleAnimatorListener : Animator.AnimatorListener { 7 | override fun onAnimationStart(animation: Animator) { 8 | 9 | } 10 | 11 | override fun onAnimationEnd(animation: Animator) { 12 | 13 | } 14 | 15 | override fun onAnimationCancel(animation: Animator) { 16 | 17 | } 18 | 19 | override fun onAnimationRepeat(animation: Animator) { 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/misc/SimpleOnSeekbarChangeListener.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.misc 2 | 3 | import android.widget.SeekBar 4 | 5 | 6 | abstract class SimpleOnSeekbarChangeListener : SeekBar.OnSeekBarChangeListener { 7 | override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 8 | 9 | } 10 | 11 | override fun onStartTrackingTouch(seekBar: SeekBar) { 12 | 13 | } 14 | 15 | override fun onStopTrackingTouch(seekBar: SeekBar) { 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/misc/WeakContextAsyncTask.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.misc 2 | 3 | import android.content.Context 4 | import android.os.AsyncTask 5 | 6 | import java.lang.ref.WeakReference 7 | 8 | abstract class WeakContextAsyncTask(context: Context) : AsyncTask() { 9 | private val contextWeakReference: WeakReference = WeakReference(context) 10 | 11 | protected val context: Context? 12 | get() = contextWeakReference.get() 13 | 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/model/AbsCustomPlaylist.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.model; 2 | 3 | import android.content.Context; 4 | import android.os.Parcel; 5 | 6 | import androidx.annotation.NonNull; 7 | 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | import java.util.ArrayList; 11 | 12 | public abstract class AbsCustomPlaylist extends Playlist { 13 | public AbsCustomPlaylist(int id, String name) { 14 | super(id, name); 15 | } 16 | 17 | public AbsCustomPlaylist() { 18 | } 19 | 20 | public AbsCustomPlaylist(Parcel in) { 21 | super(in); 22 | } 23 | 24 | @NonNull 25 | public abstract ArrayList getSongs(@NotNull Context context); 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/model/Album.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.model 2 | 3 | import java.util.* 4 | 5 | 6 | class Album { 7 | val songs: ArrayList? 8 | 9 | val id: Int 10 | get() = safeGetFirstSong().albumId 11 | 12 | val title: String? 13 | get() = safeGetFirstSong().albumName 14 | 15 | val artistId: Int 16 | get() = safeGetFirstSong().artistId 17 | 18 | val artistName: String? 19 | get() = safeGetFirstSong().artistName 20 | 21 | val year: Int 22 | get() = safeGetFirstSong().year 23 | 24 | val dateModified: Long 25 | get() = safeGetFirstSong().dateModified 26 | 27 | val songCount: Int 28 | get() = songs!!.size 29 | 30 | constructor(songs: ArrayList) { 31 | this.songs = songs 32 | } 33 | 34 | constructor() { 35 | this.songs = ArrayList() 36 | } 37 | 38 | fun safeGetFirstSong(): Song { 39 | return if (songs!!.isEmpty()) Song.emptySong else songs[0] 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/model/Genre.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.android.parcel.Parcelize 5 | 6 | @Parcelize 7 | data class Genre(val id: Int = -1, val name: String, val songCount: Int) : Parcelable 8 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/model/Home.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.model 2 | 3 | import androidx.annotation.DrawableRes 4 | import androidx.annotation.StringRes 5 | import com.maxfour.libreplayer.adapter.HomeAdapter.Companion.HomeSection 6 | 7 | class Home(val priority: Int, 8 | @StringRes val title: Int, 9 | val arrayList: ArrayList<*>, 10 | @HomeSection 11 | val homeSection: Int, 12 | @DrawableRes 13 | val icon: Int) 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/model/Song.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.model 2 | 3 | import android.os.Parcelable 4 | import kotlinx.android.parcel.Parcelize 5 | 6 | @Parcelize 7 | open class Song( 8 | val id: Int, 9 | val title: String, 10 | val songNumber: Int, 11 | val year: Int, 12 | val duration: Long, 13 | val data: String, 14 | val dateModified: Long, 15 | val albumId: Int, 16 | val albumName: String, 17 | val artistId: Int, 18 | val artistName: String, 19 | val composer: String? 20 | ) : Parcelable { 21 | 22 | 23 | companion object { 24 | @JvmStatic 25 | val emptySong = Song( 26 | -1, 27 | "", 28 | -1, 29 | -1, 30 | -1, 31 | "", 32 | -1, 33 | -1, 34 | "", 35 | -1, 36 | "", 37 | "" 38 | ) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/mvp/BaseView.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.mvp 2 | 3 | interface BaseView { 4 | fun showEmptyView() 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/mvp/Presenter.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.mvp 2 | 3 | import androidx.annotation.CallSuper 4 | 5 | interface Presenter { 6 | @CallSuper 7 | fun attachView(view: T) 8 | 9 | @CallSuper 10 | fun detachView() 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/mvp/PresenterImpl.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.mvp; 2 | 3 | public abstract class PresenterImpl { 4 | protected T view; 5 | 6 | public void attachView(T view) { 7 | this.view = view; 8 | } 9 | 10 | public void detachView() { 11 | view = null; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/rest/service/LastFMService.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.rest.service 2 | 3 | import com.maxfour.libreplayer.rest.model.LastFmArtist 4 | import retrofit2.http.GET 5 | import retrofit2.http.Header 6 | import retrofit2.http.Query 7 | 8 | interface LastFMService { 9 | companion object { 10 | const val API_KEY = "c679c8d3efa84613dc7dcb2e8d42da4c" 11 | const val BASE_QUERY_PARAMETERS = "?format=json&autocorrect=1&api_key=$API_KEY" 12 | } 13 | 14 | @GET("$BASE_QUERY_PARAMETERS&method=artist.getinfo") 15 | suspend fun artistInfo(@Query("artist") artistName: String, 16 | @Query("lang") language: String?, 17 | @Header("Cache-Control") cacheControl: String? 18 | ): LastFmArtist 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/service/MediaStoreObserver.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.service 2 | 3 | import android.database.ContentObserver 4 | import android.os.Handler 5 | 6 | class MediaStoreObserver( 7 | private val musicService: MusicService, 8 | private val mHandler: Handler 9 | ) : ContentObserver(mHandler), Runnable { 10 | 11 | override fun onChange(selfChange: Boolean) { 12 | // if a change is detected, remove any scheduled callback 13 | // then post a new one. This is intended to prevent closely 14 | // spaced events from generating multiple refresh calls 15 | mHandler.removeCallbacks(this) 16 | mHandler.postDelayed(this, REFRESH_DELAY) 17 | } 18 | 19 | override fun run() { 20 | // actually call refresh when the delayed callback fires 21 | // do not send a sticky broadcast here 22 | musicService.handleAndSendChangeInternal(MusicService.MEDIA_STORE_CHANGED) 23 | } 24 | 25 | companion object { 26 | // milliseconds to delay before calling refresh to aggregate events 27 | private val REFRESH_DELAY: Long = 500 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/service/QueueSaveHandler.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.service 2 | 3 | import android.os.Handler 4 | import android.os.Looper 5 | import android.os.Message 6 | import com.maxfour.libreplayer.service.MusicService.SAVE_QUEUES 7 | import java.lang.ref.WeakReference 8 | 9 | internal class QueueSaveHandler( 10 | musicService: MusicService, 11 | looper: Looper 12 | ) : Handler(looper) { 13 | private val service: WeakReference = WeakReference(musicService) 14 | 15 | override fun handleMessage(msg: Message) { 16 | val service: MusicService? = service.get() 17 | if (msg.what == SAVE_QUEUES) { 18 | service?.saveQueuesImpl() 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/service/SongPlayCountHelper.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.service 2 | 3 | import com.maxfour.libreplayer.helper.StopWatch 4 | import com.maxfour.libreplayer.model.Song 5 | 6 | class SongPlayCountHelper { 7 | 8 | private val stopWatch = StopWatch() 9 | var song = Song.emptySong 10 | private set 11 | 12 | fun shouldBumpPlayCount(): Boolean { 13 | return song.duration * 0.5 < stopWatch.elapsedTime 14 | } 15 | 16 | fun notifySongChanged(song: Song) { 17 | synchronized(this) { 18 | stopWatch.reset() 19 | this.song = song 20 | } 21 | } 22 | 23 | fun notifyPlayStateChanged(isPlaying: Boolean) { 24 | synchronized(this) { 25 | if (isPlaying) { 26 | stopWatch.start() 27 | } else { 28 | stopWatch.pause() 29 | } 30 | } 31 | } 32 | 33 | companion object { 34 | val TAG: String = SongPlayCountHelper::class.java.simpleName 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/service/ThrottledSeekHandler.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.service 2 | 3 | import android.os.Handler 4 | 5 | import com.maxfour.libreplayer.service.MusicService.PLAY_STATE_CHANGED 6 | 7 | class ThrottledSeekHandler( 8 | private val musicService: MusicService, 9 | private val handler: Handler 10 | ) : Runnable { 11 | 12 | fun notifySeek() { 13 | musicService.updateMediaSessionPlaybackState() 14 | musicService.updateMediaSessionMetaData() 15 | handler.removeCallbacks(this) 16 | handler.postDelayed(this, THROTTLE) 17 | } 18 | 19 | override fun run() { 20 | musicService.savePositionInTrack() 21 | musicService.sendPublicIntent(PLAY_STATE_CHANGED) // for musixmatch synced lyrics 22 | } 23 | 24 | companion object { 25 | // milliseconds to throttle before calling run() to aggregate events 26 | private val THROTTLE: Long = 500 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/service/playback/Playback.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.service.playback 2 | 3 | interface Playback { 4 | 5 | val isInitialized: Boolean 6 | 7 | val isPlaying: Boolean 8 | 9 | val audioSessionId: Int 10 | 11 | fun setDataSource(path: String): Boolean 12 | 13 | fun setNextDataSource(path: String?) 14 | 15 | fun setCallbacks(callbacks: PlaybackCallbacks) 16 | 17 | fun start(): Boolean 18 | 19 | fun stop() 20 | 21 | fun release() 22 | 23 | fun pause(): Boolean 24 | 25 | fun duration(): Int 26 | 27 | fun position(): Int 28 | 29 | fun seek(whereto: Int): Int 30 | 31 | fun setVolume(vol: Float): Boolean 32 | 33 | fun setAudioSessionId(sessionId: Int): Boolean 34 | 35 | interface PlaybackCallbacks { 36 | fun onSongWentToNext() 37 | 38 | fun onSongEnded() 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/transform/DepthTransformation.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.transform 2 | 3 | import android.view.View 4 | import androidx.viewpager.widget.ViewPager 5 | 6 | class DepthTransformation : ViewPager.PageTransformer { 7 | override fun transformPage(page: View, position: Float) { 8 | if (position < -1) { // [-Infinity,-1) 9 | // This page is way off-screen to the left. 10 | page.alpha = 0f 11 | } else if (position <= 0) { // [-1,0] 12 | page.alpha = 1f 13 | page.translationX = 0f 14 | page.scaleX = 1f 15 | page.scaleY = 1f 16 | } else if (position <= 1) { // (0,1] 17 | page.translationX = -position * page.width 18 | page.alpha = 1 - Math.abs(position) 19 | page.scaleX = 1 - Math.abs(position) 20 | page.scaleY = 1 - Math.abs(position) 21 | } else { // (1,+Infinity] 22 | // This page is way off-screen to the right. 23 | page.alpha = 0f 24 | 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/transform/HingeTransformation.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.transform 2 | 3 | import android.view.View 4 | import androidx.viewpager.widget.ViewPager 5 | 6 | class HingeTransformation : ViewPager.PageTransformer { 7 | override fun transformPage(page: View, position: Float) { 8 | 9 | page.translationX = -position * page.width 10 | page.pivotX = 0f 11 | page.pivotY = 0f 12 | 13 | 14 | if (position < -1) { // [-Infinity,-1) 15 | // This page is way off-screen to the left. 16 | page.alpha = 0f 17 | 18 | } else if (position <= 0) { // [-1,0] 19 | page.rotation = 90 * Math.abs(position) 20 | page.alpha = 1 - Math.abs(position) 21 | 22 | } else if (position <= 1) { // (0,1] 23 | page.rotation = 0f 24 | page.alpha = 1f 25 | 26 | } else { // (1,+Infinity] 27 | // This page is way off-screen to the right. 28 | page.alpha = 0f 29 | 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/transform/VerticalStackTransformer.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.transform 2 | 3 | import android.view.View 4 | import androidx.viewpager.widget.ViewPager 5 | 6 | class VerticalStackTransformer : ViewPager.PageTransformer { 7 | override fun transformPage(page: View, position: Float) { 8 | if (position >= 0) { 9 | page.scaleX = (0.9f - 0.05f * position) 10 | page.scaleY = 0.9f 11 | page.translationX = -page.width * position 12 | page.translationY = -30 * position 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/util/DensityUtil.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.util; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.util.DisplayMetrics; 6 | 7 | import androidx.annotation.NonNull; 8 | 9 | public class DensityUtil { 10 | 11 | public static int getScreenHeight(@NonNull Context context) { 12 | DisplayMetrics displayMetrics = new DisplayMetrics(); 13 | ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 14 | return displayMetrics.heightPixels; 15 | } 16 | 17 | public static int dip2px(@NonNull Context context, float dpVale) { 18 | final float scale = context.getResources().getDisplayMetrics().density; 19 | return (int) (dpVale * scale + 0.5f); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/views/DrawableGradient.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.views; 2 | 3 | import android.graphics.drawable.GradientDrawable; 4 | 5 | public class DrawableGradient extends GradientDrawable { 6 | public DrawableGradient(Orientation orientations, int[] colors, int shape) { 7 | super(orientations, colors); 8 | try { 9 | setShape(shape); 10 | setGradientType(GradientDrawable.LINEAR_GRADIENT); 11 | setCornerRadius(0); 12 | } catch (Exception e) { 13 | e.printStackTrace(); 14 | } 15 | } 16 | 17 | public DrawableGradient SetTransparency(int transparencyPercent) { 18 | this.setAlpha(255 - ((255 * transparencyPercent) / 100)); 19 | return this; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/views/WidthFitSquareCardView.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.views 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | 6 | import com.google.android.material.card.MaterialCardView 7 | 8 | class WidthFitSquareCardView : MaterialCardView { 9 | constructor(context: Context) : super(context) {} 10 | 11 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {} 12 | 13 | constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} 14 | 15 | fun forceSquare(z: Boolean) { 16 | this.forceSquare = z 17 | requestLayout() 18 | } 19 | 20 | override fun onMeasure(i: Int, i2: Int) { 21 | var width = i2 22 | if (this.forceSquare) { 23 | width = i 24 | } 25 | super.onMeasure(i, width) 26 | } 27 | 28 | private var forceSquare = true 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/maxfour/libreplayer/volume/OnAudioVolumeChangedListener.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.libreplayer.volume; 2 | 3 | public interface OnAudioVolumeChangedListener { 4 | 5 | void onAudioVolumeChanged(int currentVolume, int maxVolume); 6 | } 7 | -------------------------------------------------------------------------------- /app/src/main/res/anim/item_animation_fall_down.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 8 | 9 | 13 | 14 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/anim/layout_animation_fall_down.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/anim/sliding_in_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/anim/sliding_out_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/default_album_art.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-hdpi/default_album_art.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/default_artist_art.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-hdpi/default_artist_art.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-hdpi/ic_notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/default_album_art.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-mdpi/default_album_art.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/default_artist_art.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-mdpi/default_artist_art.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-mdpi/ic_notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/notification_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/round_selector.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/saf_guide_1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-v21/saf_guide_1.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/saf_guide_2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-v21/saf_guide_2.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/saf_guide_3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-v21/saf_guide_3.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/widget_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v21/widget_selector_light.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v26/saf_guide_1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-v26/saf_guide_1.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-v26/saf_guide_2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-v26/saf_guide_2.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-v26/saf_guide_3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-v26/saf_guide_3.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/default_album_art.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xhdpi/default_album_art.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/default_artist_art.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xhdpi/default_artist_art.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xhdpi/ic_notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/default_album_art.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxhdpi/default_album_art.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/default_artist_art.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxhdpi/default_artist_art.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxhdpi/ic_notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/default_album_art.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/default_album_art.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/default_artist_art.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/default_artist_art.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/ic_notification.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/ic_splash.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_adaptive.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_adaptive.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_blur.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_blur.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_blur_card.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_blur_card.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_card.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_card.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_circle.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_circle.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_color.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_color.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_fit.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_fit.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_flat.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_flat.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_full.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_full.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_material.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_material.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_normal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_normal.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_peak.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_peak.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_plain.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_plain.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_simple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_simple.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/np_tiny.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable-xxxhdpi/np_tiny.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_navigation_item_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_navigation_item_background_mask.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_navigation_item_colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_progress.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | 14 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/color_circle_gradient.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/color_progress_seek.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_access_time_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_account_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_photo_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 12 | 15 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_album_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_app_shortcut_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_app_shortcut_last_added.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_app_shortcut_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_app_shortcut_shuffle_all.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_app_shortcut_top_songs.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_artist_selected_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_artist_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_audiotrack_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bookmark_music_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cellphone_lock_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cellphone_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_all_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_colorize_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_delete_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_equalizer_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_favorite_border_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_favorite_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_file_music_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_filter_song_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_folder_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_github_circle_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_grid_size_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hdr_strong_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_image_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_outline_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_keyboard_arrow_down_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_keyboard_arrow_right_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_keyboard_arrow_up_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_keyboard_backspace_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_keyboard_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_library_add_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_library_music_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_mic_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more_vert_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_music_note_off_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_notifications_active_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pause_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pause_white_48dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pause_white_64dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_arrow_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_arrow_white_32dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_arrow_white_48dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_arrow_white_64dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_circle_filled_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_playlist_add_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_playlist_play_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_queue_music_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_redo_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_repeat_one_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_repeat_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_repeat_white_circle_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rounded_corner.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_save_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_scanner_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_select_all_white_24dp.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_brigntness_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_shuffle_off_circled.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_shuffle_on_circled.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_shuffle_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_skip_next_round_white_32dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_skip_next_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_skip_previous_round_white_32dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_skip_previous_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sort_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_telegram_white.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_testing_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_theme_palette_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_trending_up_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_view_carousel_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_volume_down_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_volume_off_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_volume_up_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/line_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/material_design_default.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/drawable/material_design_default.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/notification_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/option_menu_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/progress_drawable_vertical.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rect_selector.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_window.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow_down_strong.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow_up_edited.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow_up_full_theme.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow_up_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shadow_up_strong.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/slider_thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/square_window.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/switch_square.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/switch_thumb_material.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_indicator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_selector_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_selector_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/font/circular.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/font/circular_std_black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/font/circular_std_black.otf -------------------------------------------------------------------------------- /app/src/main/res/font/circular_std_book.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/font/circular_std_book.otf -------------------------------------------------------------------------------- /app/src/main/res/font/circular_std_medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/font/circular_std_medium.otf -------------------------------------------------------------------------------- /app/src/main/res/layout-xlarge/activity_about_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 19 | 20 | 21 | 22 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_about_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_album_circle_cover.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_album_flat_cover.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_album_full_card_cover.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_album_full_cover.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_lyrics.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_player_album_cover.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_synced.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_category_title.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_dialog_library_categories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_dialog_now_playing_screen.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/shadow_statusbar_toolbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 17 | 18 | 21 | 22 | 23 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/status_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/sub_header.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/menu/bottom_navigation_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 15 | 20 | 25 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_artist_detail.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 8 | 9 | 13 | 14 | 18 | 19 | 23 | 24 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_cannot_delete_single_songs_playlist_songs_selection.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | 16 | 17 | 22 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_folders.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_genre_detail.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 11 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_item_directory.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_item_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 10 | 13 | 16 | 19 | 22 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_item_smart_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 11 | 12 | 15 | 16 | 19 | 20 | 23 | 24 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_playlists_songs_selection.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | 16 | 17 | 22 | 23 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_smart_playlist_detail.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 10 | 14 | 18 | 22 | 25 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_music.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_music_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/mipmap-hdpi/ic_music.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_music_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/mipmap-hdpi/ic_music_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/mipmap-mdpi/ic_music.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_music_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/mipmap-mdpi/ic_music_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/mipmap-xhdpi/ic_music.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_music_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/mipmap-xhdpi/ic_music_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/mipmap-xxhdpi/ic_music.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_music_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/mipmap-xxhdpi/ic_music_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/mipmap-xxxhdpi/ic_music.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_music_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/app/src/main/res/mipmap-xxxhdpi/ic_music_round.png -------------------------------------------------------------------------------- /app/src/main/res/values-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8dp 4 | -------------------------------------------------------------------------------- /app/src/main/res/values-land/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-large/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 42dp 3 | 52dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 | 6 5 | 6 | 2 7 | 3 8 | 9 | 6 10 | 8 11 | -------------------------------------------------------------------------------- /app/src/main/res/values-v23/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 24dp 4 | -------------------------------------------------------------------------------- /app/src/main/res/values-v23/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 14 | 15 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/values-xlarge/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 64dp 3 | 64dp 4 | 16dp 5 | 64dp 6 | 16dp 7 | 72dp 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/values/baseline_textview_attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values/circular_image_view_attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/color_icon_view_attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/values/donottranslate.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | GitHub 5 | 6 | @string/last_added 7 | @string/last_added 8 | @string/action_shuffle_all 9 | @string/my_top_songs 10 | 11 | 🤔 12 | 13 | 1 14 | 2 15 | 3 16 | 4 17 | 5 18 | 6 19 | 7 20 | 8 21 | -------------------------------------------------------------------------------- /app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/values/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 2 4 | 4 5 | 6 | 1 7 | 2 8 | 2 9 | 4 10 | 11 | 4 12 | 6 13 | 14 | 200 15 | -------------------------------------------------------------------------------- /app/src/main/res/values/list_item_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/list_setting_item_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/metal_recycler_view_attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/xml/app_widget_big_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/xml/app_widget_card_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/xml/app_widget_classic_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/xml/app_widget_small_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/xml/app_widget_text.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/xml/pref_images.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/xml/pref_notification.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 11 | 12 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /appthemehelper/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /appthemehelper/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /appthemehelper/src/androidTest/java/com/maxfour/appthemehelper/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.maxfour.appthemehelper.test", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /appthemehelper/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/ATHActivity.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper 2 | 3 | import android.os.Bundle 4 | import android.os.Handler 5 | import androidx.appcompat.app.AppCompatActivity 6 | 7 | open class ATHActivity : AppCompatActivity() { 8 | 9 | private var updateTime: Long = -1 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | updateTime = System.currentTimeMillis() 14 | } 15 | 16 | override fun onResume() { 17 | super.onResume() 18 | if (ATH.didThemeValuesChange(this, updateTime)) { 19 | onThemeChanged() 20 | } 21 | } 22 | 23 | fun onThemeChanged() { 24 | postRecreate() 25 | } 26 | 27 | fun postRecreate() { 28 | // hack to prevent java.lang.RuntimeException: Performing pause of activity that is not resumed 29 | // makes sure recreate() is called right after and not in onResume() 30 | Handler().post { recreate() } 31 | } 32 | } -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/common/ATHActionBarActivity.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.common 2 | 3 | import androidx.appcompat.widget.Toolbar 4 | 5 | import com.maxfour.appthemehelper.util.ToolbarContentTintHelper 6 | 7 | class ATHActionBarActivity : ATHToolbarActivity() { 8 | 9 | override fun getATHToolbar(): Toolbar? { 10 | return ToolbarContentTintHelper.getSupportActionBarView(supportActionBar) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/common/prefs/supportv7/ATEDialogPreference.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.common.prefs.supportv7 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import androidx.preference.DialogPreference 6 | 7 | open class ATEDialogPreference @JvmOverloads constructor( 8 | context: Context, 9 | attrs: AttributeSet? = null, 10 | defStyleAttr: Int = 0, defStyleRes: Int = 0 11 | ) : DialogPreference(context, attrs, defStyleAttr, defStyleRes) { 12 | 13 | init { 14 | 15 | } 16 | } -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/common/prefs/supportv7/ATEEditTextPreference.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.common.prefs.supportv7 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import androidx.preference.EditTextPreference 6 | import com.maxfour.appthemehelper.R 7 | 8 | class ATEEditTextPreference @JvmOverloads constructor( 9 | context: Context, 10 | attrs: AttributeSet? = null, 11 | defStyleAttr: Int = 0, 12 | defStyleRes: Int = 0 13 | ) : EditTextPreference(context, attrs, defStyleAttr, defStyleRes) { 14 | 15 | init { 16 | layoutResource = R.layout.ate_preference_custom_support 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/common/prefs/supportv7/ATEPreference.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.common.prefs.supportv7 2 | 3 | import android.content.Context 4 | import android.graphics.PorterDuff 5 | import android.util.AttributeSet 6 | import androidx.preference.Preference 7 | import com.maxfour.appthemehelper.ThemeStore 8 | 9 | class ATEPreference @JvmOverloads constructor( 10 | context: Context, 11 | attrs: AttributeSet? = null, 12 | defStyleAttr: Int = 0, 13 | defStyleRes: Int = 0 14 | ) : Preference(context, attrs, defStyleAttr, defStyleRes) { 15 | 16 | init { 17 | 18 | icon?.setColorFilter(ThemeStore.textColorSecondary(context), PorterDuff.Mode.SRC_IN) 19 | } 20 | } -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/common/prefs/supportv7/ATEPreferenceCategory.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.common.prefs.supportv7 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.TextView 6 | import androidx.preference.PreferenceCategory 7 | import androidx.preference.PreferenceViewHolder 8 | import com.maxfour.appthemehelper.ThemeStore 9 | 10 | class ATEPreferenceCategory @JvmOverloads constructor( 11 | context: Context?, 12 | attrs: AttributeSet?, 13 | defStyleAttr: Int = -1, 14 | defStyleRes: Int = -1 15 | ) : PreferenceCategory(context, attrs, defStyleAttr, defStyleRes) { 16 | override fun onBindViewHolder(holder: PreferenceViewHolder) { 17 | super.onBindViewHolder(holder) 18 | val title = holder.itemView.findViewById(android.R.id.title) 19 | title.setTextColor(ThemeStore.accentColor(context)) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/common/views/ATEAccentTextView.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.common.views 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | 6 | import androidx.appcompat.widget.AppCompatTextView 7 | import com.maxfour.appthemehelper.ThemeStore 8 | 9 | class ATEAccentTextView @JvmOverloads constructor( 10 | context: Context, 11 | attrs: AttributeSet? = null, 12 | defStyleAttr: Int = 0 13 | ) : AppCompatTextView(context, attrs, defStyleAttr) { 14 | 15 | init { 16 | setTextColor(ThemeStore.accentColor(context)) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/common/views/ATECheckBox.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.common.views 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import androidx.appcompat.widget.AppCompatCheckBox 6 | import com.maxfour.appthemehelper.ATH 7 | import com.maxfour.appthemehelper.ThemeStore 8 | 9 | class ATECheckBox @JvmOverloads constructor( 10 | context: Context, 11 | attrs: AttributeSet? = null, 12 | defStyleAttr: Int = 0 13 | ) : AppCompatCheckBox(context, attrs, defStyleAttr) { 14 | 15 | init { 16 | ATH.setTint(this, ThemeStore.accentColor(context)) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/common/views/ATEPrimaryTextView.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.common.views 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import com.google.android.material.textview.MaterialTextView 6 | import com.maxfour.appthemehelper.ThemeStore 7 | 8 | class ATEPrimaryTextView @JvmOverloads constructor( 9 | context: Context, 10 | attrs: AttributeSet? = null, 11 | defStyleAttr: Int = 0 12 | ) : MaterialTextView(context, attrs, defStyleAttr) { 13 | 14 | init { 15 | setTextColor(ThemeStore.textColorPrimary(context)) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/common/views/ATESecondaryTextView.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.common.views 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import com.google.android.material.textview.MaterialTextView 6 | import com.maxfour.appthemehelper.ThemeStore 7 | 8 | class ATESecondaryTextView @JvmOverloads constructor( 9 | context: Context, 10 | attrs: AttributeSet? = null, 11 | defStyleAttr: Int = 0 12 | ) : MaterialTextView(context, attrs, defStyleAttr) { 13 | 14 | init { 15 | setTextColor(ThemeStore.textColorSecondary(context)) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/common/views/ATESwitch.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.common.views 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.view.View 6 | import androidx.appcompat.widget.SwitchCompat 7 | import com.maxfour.appthemehelper.ATH 8 | import com.maxfour.appthemehelper.ThemeStore 9 | 10 | class ATESwitch : SwitchCompat { 11 | 12 | constructor(context: Context) : super(context) { 13 | init(context) 14 | } 15 | 16 | constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { 17 | init(context) 18 | } 19 | 20 | constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { 21 | init(context) 22 | } 23 | 24 | private fun init(context: Context) { 25 | ATH.setTint(this, ThemeStore.accentColor(context)) 26 | } 27 | 28 | override fun isShown(): Boolean { 29 | return parent != null && visibility == View.VISIBLE 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/util/ATHUtil.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.util 2 | 3 | import android.content.Context 4 | import androidx.annotation.AttrRes 5 | 6 | object ATHUtil { 7 | 8 | fun isWindowBackgroundDark(context: Context): Boolean { 9 | return !ColorUtil.isColorLight(resolveColor(context, android.R.attr.windowBackground)) 10 | } 11 | 12 | @JvmOverloads 13 | fun resolveColor(context: Context?, @AttrRes attr: Int, fallback: Int = 0): Int { 14 | val a = context!!.theme.obtainStyledAttributes(intArrayOf(attr)) 15 | try { 16 | return a.getColor(0, fallback) 17 | } finally { 18 | a.recycle() 19 | } 20 | } 21 | 22 | fun inClassPath(clsName: String): Class<*> { 23 | try { 24 | return Class.forName(clsName) 25 | } catch (t: Throwable) { 26 | throw IllegalStateException(String.format("%s is not in your class path! You must include the associated library.", clsName)) 27 | } 28 | 29 | } 30 | } -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/util/DrawableUtil.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.util 2 | 3 | import android.graphics.drawable.ColorDrawable 4 | import android.graphics.drawable.Drawable 5 | import android.graphics.drawable.TransitionDrawable 6 | import androidx.annotation.ColorInt 7 | 8 | 9 | object DrawableUtil { 10 | 11 | fun createTransitionDrawable(@ColorInt startColor: Int, @ColorInt endColor: Int): TransitionDrawable { 12 | return createTransitionDrawable(ColorDrawable(startColor), ColorDrawable(endColor)) 13 | } 14 | 15 | fun createTransitionDrawable(start: Drawable, end: Drawable): TransitionDrawable { 16 | val drawables = arrayOfNulls(2) 17 | 18 | drawables[0] = start 19 | drawables[1] = end 20 | 21 | return TransitionDrawable(drawables) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/util/TabLayoutUtil.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.util 2 | 3 | import android.content.res.ColorStateList 4 | import androidx.annotation.ColorInt 5 | import com.google.android.material.tabs.TabLayout 6 | 7 | 8 | object TabLayoutUtil { 9 | 10 | fun setTabIconColors(tabLayout: TabLayout?, @ColorInt normalColor: Int, @ColorInt selectedColor: Int) { 11 | if (tabLayout == null) 12 | return 13 | 14 | val sl = ColorStateList(arrayOf(intArrayOf(-android.R.attr.state_selected), intArrayOf(android.R.attr.state_selected)), 15 | intArrayOf(normalColor, selectedColor)) 16 | for (i in 0 until tabLayout.tabCount) { 17 | val tab = tabLayout.getTabAt(i) 18 | if (tab != null && tab.icon != null) { 19 | tab.icon = TintHelper.createTintedDrawable(tab.icon, sl) 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/util/VersionUtils.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.util 2 | 3 | import android.os.Build 4 | 5 | object VersionUtils { 6 | 7 | /** 8 | * @return true if device is running API >= 21 9 | */ 10 | fun hasLollipop(): Boolean { 11 | return Build.VERSION.SDK_INT >= 21 12 | } 13 | 14 | /** 15 | * @return true if device is running API >= 23 16 | */ 17 | fun hasMarshmallow(): Boolean { 18 | return Build.VERSION.SDK_INT >= 23 19 | } 20 | 21 | /** 22 | * @return true if device is running API >= 24 23 | */ 24 | fun hasNougat(): Boolean { 25 | return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N 26 | } 27 | 28 | /** 29 | * @return true if device is running API >= 24 30 | */ 31 | fun hasNougatMR(): Boolean { 32 | return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1 33 | } 34 | 35 | /** 36 | * @return true if device is running API >= 26 37 | */ 38 | fun hasOreo(): Boolean { 39 | return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /appthemehelper/src/main/java/com/maxfour/appthemehelper/util/ViewUtil.kt: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper.util 2 | 3 | import android.graphics.drawable.Drawable 4 | import android.view.View 5 | import android.view.ViewTreeObserver 6 | 7 | 8 | object ViewUtil { 9 | fun removeOnGlobalLayoutListener(v: View, listener: ViewTreeObserver.OnGlobalLayoutListener) { 10 | v.viewTreeObserver.removeOnGlobalLayoutListener(listener) 11 | } 12 | 13 | fun setBackgroundCompat(view: View, drawable: Drawable?) { 14 | view.background = drawable 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /appthemehelper/src/main/res/drawable/ate_check.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /appthemehelper/src/main/res/drawable/ate_switch.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /appthemehelper/src/main/res/drawable/ic_toggle_switch.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /appthemehelper/src/main/res/drawable/ic_toggle_switch_off.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /appthemehelper/src/main/res/layout/ate_preference_color.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /appthemehelper/src/main/res/layout/ate_preference_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 17 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /appthemehelper/src/main/res/layout/ate_preference_switch_support.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /appthemehelper/src/main/res/values-large/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 28dp 5 | 6 | -------------------------------------------------------------------------------- /appthemehelper/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1dp 5 | 6 | 16dp 7 | 8 | -------------------------------------------------------------------------------- /appthemehelper/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /appthemehelper/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | appthemehelper 3 | 4 | -------------------------------------------------------------------------------- /appthemehelper/src/test/java/com/maxfour/appthemehelper/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.maxfour.appthemehelper; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() throws Exception { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext.kotlin_version = '1.3.61' 5 | repositories { 6 | jcenter() 7 | google() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:3.5.3' 11 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 12 | classpath 'com.android.tools.build:bundletool:0.9.0' 13 | } 14 | } 15 | 16 | allprojects { 17 | repositories { 18 | google() 19 | jcenter() 20 | maven { url "https://jitpack.io" } 21 | } 22 | } 23 | 24 | task clean(type: Delete) { 25 | delete rootProject.buildDir 26 | } 27 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx2048M 2 | org.gradle.daemon=true 3 | org.gradle.parallel=true 4 | jvmArgs='-Xmx2048m' 5 | android.useAndroidX=true 6 | android.enabelR8=true 7 | android.enableR8.fullMode=false 8 | android.enableJetifier=true 9 | android.debug.obsoleteApi=true 10 | android.enableBuildCache=true 11 | android.jetifier.blacklist = butterknife.*\\.jar 12 | kotlin.code.style=official -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Sep 20 00:21:23 IST 2019 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-5.6.1-all.zip 7 | -------------------------------------------------------------------------------- /images/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MaxFour/LibrePlayer/693d2c652118abd07350fddda680756f2768991b/images/Icon.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':appthemehelper', ':core' --------------------------------------------------------------------------------