├── .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 | [](https://github.com/MaxFour/LibrePlayer/blob/master/LICENSE)
4 | [](https://android-arsenal.com/api?level=16)
5 | [](https://t.me/max_four "Contact me in Telegram")
6 | [](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 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_artist_detail.xml:
--------------------------------------------------------------------------------
1 |
30 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_cannot_delete_single_songs_playlist_songs_selection.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_folders.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_genre_detail.xml:
--------------------------------------------------------------------------------
1 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_item_directory.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_item_playlist.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_item_smart_playlist.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_playlists_songs_selection.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_search.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_smart_playlist_detail.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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'
--------------------------------------------------------------------------------