├── .github
├── CONTRIBUTING.md
└── ISSUE_TEMPLATE.md
├── .gitignore
├── .idea
├── codeStyles
│ ├── Project.xml
│ └── codeStyleConfig.xml
├── encodings.xml
├── misc.xml
├── modules.xml
├── runConfigurations.xml
└── vcs.xml
├── .travis.yml
├── .travis
├── run_on_non_pull_requests
└── run_on_pull_requests
├── LICENSE.md
├── README.md
├── app
├── .gitignore
├── build.gradle
├── libs
│ └── jaudiotagger-2.0.4-SNAPSHOT.jar
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── simplecity
│ │ └── amp_library
│ │ └── ExampleInstrumentedTest.java
│ ├── debug
│ ├── google-services.json
│ └── res
│ │ ├── drawable-xxxhdpi
│ │ └── ic_ribbon_debug.png
│ │ ├── drawable
│ │ └── ic_launcher_foreground_layer.xml
│ │ └── xml
│ │ └── shortcuts.xml
│ ├── free
│ ├── AndroidManifest.xml
│ └── res
│ │ ├── values
│ │ └── donottranslate.xml
│ │ └── xml
│ │ └── shortcuts.xml
│ ├── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ └── web
│ │ │ ├── info.html
│ │ │ ├── info_dark.html
│ │ │ ├── styles.css
│ │ │ └── styles_dark.css
│ ├── google-services.json
│ ├── ic_launcher-web.png
│ ├── java
│ │ ├── android
│ │ │ └── support
│ │ │ │ └── design
│ │ │ │ └── widget
│ │ │ │ ├── CustomCollapsingTextHelper.java
│ │ │ │ └── CustomCollapsingToolbarLayout.java
│ │ └── com
│ │ │ ├── jp
│ │ │ └── wasabeef
│ │ │ │ └── glide
│ │ │ │ └── transformations
│ │ │ │ ├── BlurTransformation.java
│ │ │ │ ├── ColorFilterTransformation.java
│ │ │ │ ├── CropCircleTransformation.java
│ │ │ │ ├── CropSquareTransformation.java
│ │ │ │ ├── CropTransformation.java
│ │ │ │ ├── GrayscaleTransformation.java
│ │ │ │ ├── MaskTransformation.java
│ │ │ │ ├── RoundedCornersTransformation.java
│ │ │ │ └── internal
│ │ │ │ ├── FastBlur.java
│ │ │ │ ├── RSBlur.java
│ │ │ │ └── Utils.java
│ │ │ └── simplecity
│ │ │ └── amp_library
│ │ │ ├── ShuttleApplication.java
│ │ │ ├── androidauto
│ │ │ ├── AndroidAutoHelper.kt
│ │ │ ├── CarHelper.java
│ │ │ └── PackageValidator.java
│ │ │ ├── billing
│ │ │ └── BillingManager.java
│ │ │ ├── cast
│ │ │ ├── CastManager.java
│ │ │ └── CastOptionsProvider.java
│ │ │ ├── constants
│ │ │ ├── Config.java
│ │ │ └── OpenSLESConstants.java
│ │ │ ├── data
│ │ │ ├── AlbumArtistsRepository.kt
│ │ │ ├── AlbumsRepository.kt
│ │ │ ├── BlacklistRepository.kt
│ │ │ ├── GenresRepository.kt
│ │ │ ├── PlaylistsRepository.kt
│ │ │ ├── Repository.kt
│ │ │ └── SongsRepository.kt
│ │ │ ├── di
│ │ │ └── app
│ │ │ │ ├── AppAssistedModule.kt
│ │ │ │ ├── AppComponent.kt
│ │ │ │ ├── AppModule.kt
│ │ │ │ ├── RepositoryModule.kt
│ │ │ │ └── activity
│ │ │ │ ├── ActivityModule.kt
│ │ │ │ ├── ActivityScope.kt
│ │ │ │ └── fragment
│ │ │ │ ├── DialogFragmentModule.java
│ │ │ │ ├── FragmentModule.kt
│ │ │ │ └── FragmentScope.kt
│ │ │ ├── format
│ │ │ └── PrefixHighlighter.java
│ │ │ ├── glide
│ │ │ ├── fetcher
│ │ │ │ ├── BaseFetcher.java
│ │ │ │ ├── FolderFetcher.java
│ │ │ │ ├── MediaStoreFetcher.java
│ │ │ │ ├── MultiFetcher.java
│ │ │ │ ├── RemoteFetcher.java
│ │ │ │ ├── TagFetcher.java
│ │ │ │ └── TypeFetcher.java
│ │ │ ├── loader
│ │ │ │ ├── ArtworkModelLoader.java
│ │ │ │ └── TypeLoader.java
│ │ │ ├── palette
│ │ │ │ ├── ColorSet.kt
│ │ │ │ ├── ColorSetResource.java
│ │ │ │ └── ColorSetTranscoder.java
│ │ │ ├── preloader
│ │ │ │ ├── RecyclerToListViewScrollListener.java
│ │ │ │ └── RecyclerViewPreloader.java
│ │ │ └── utils
│ │ │ │ ├── AlwaysCrossFade.java
│ │ │ │ ├── BitmapAndSize.java
│ │ │ │ ├── BitmapAndSizeDecoder.java
│ │ │ │ ├── BitmapAndSizeResource.java
│ │ │ │ ├── CustomAppWidgetTarget.java
│ │ │ │ ├── CustomGlideModule.java
│ │ │ │ ├── GlideUtils.java
│ │ │ │ ├── Size.java
│ │ │ │ └── WrappingViewAdapter.java
│ │ │ ├── http
│ │ │ ├── HttpClient.java
│ │ │ ├── HttpServer.java
│ │ │ └── lastfm
│ │ │ │ ├── LastFmAlbum.java
│ │ │ │ ├── LastFmArtist.java
│ │ │ │ ├── LastFmImage.java
│ │ │ │ ├── LastFmResult.java
│ │ │ │ ├── LastFmService.java
│ │ │ │ ├── LastFmTrack.java
│ │ │ │ └── LastFmUtils.java
│ │ │ ├── interfaces
│ │ │ ├── Breadcrumb.java
│ │ │ ├── BreadcrumbListener.java
│ │ │ └── FileType.java
│ │ │ ├── model
│ │ │ ├── Album.java
│ │ │ ├── AlbumArtist.java
│ │ │ ├── Artist.java
│ │ │ ├── ArtworkModel.java
│ │ │ ├── ArtworkProvider.java
│ │ │ ├── BaseFileObject.java
│ │ │ ├── CategoryItem.java
│ │ │ ├── FileObject.java
│ │ │ ├── FolderObject.java
│ │ │ ├── Genre.java
│ │ │ ├── Header.java
│ │ │ ├── InclExclItem.java
│ │ │ ├── Playlist.java
│ │ │ ├── Query.java
│ │ │ ├── Song.java
│ │ │ ├── Sortable.java
│ │ │ ├── SuggestedHeader.java
│ │ │ ├── Suggestion.java
│ │ │ ├── TagInfo.java
│ │ │ ├── TagUpdate.java
│ │ │ └── UserSelectedArtwork.java
│ │ │ ├── notifications
│ │ │ ├── MusicNotificationHelper.java
│ │ │ └── NotificationHelper.java
│ │ │ ├── playback
│ │ │ ├── BluetoothManager.kt
│ │ │ ├── CastPlayback.kt
│ │ │ ├── DummyNotificationHelper.java
│ │ │ ├── HeadsetManager.kt
│ │ │ ├── LocalBinder.java
│ │ │ ├── LocalPlayback.kt
│ │ │ ├── MediaManager.java
│ │ │ ├── MediaPlayerPlayback.kt
│ │ │ ├── MediaSessionManager.java
│ │ │ ├── MusicService.java
│ │ │ ├── NotificationStateHandler.java
│ │ │ ├── Playback.kt
│ │ │ ├── PlaybackManager.java
│ │ │ ├── PlaybackMonitor.java
│ │ │ ├── PlaybackSettingsManager.kt
│ │ │ ├── QueueManager.java
│ │ │ ├── ScrobbleManager.kt
│ │ │ └── constants
│ │ │ │ ├── ExternalIntents.java
│ │ │ │ ├── InternalIntents.java
│ │ │ │ ├── MediaButtonCommand.java
│ │ │ │ ├── ServiceCommand.java
│ │ │ │ ├── ShortcutCommands.java
│ │ │ │ └── WidgetManager.kt
│ │ │ ├── printEvent.kt
│ │ │ ├── rx
│ │ │ ├── UnsafeAction.java
│ │ │ ├── UnsafeCallable.java
│ │ │ └── UnsafeConsumer.java
│ │ │ ├── saf
│ │ │ └── SafManager.java
│ │ │ ├── services
│ │ │ ├── ArtworkDownloadService.java
│ │ │ ├── DashClockService.java
│ │ │ └── Equalizer.java
│ │ │ ├── sql
│ │ │ ├── SqlUtils.java
│ │ │ ├── databases
│ │ │ │ ├── BlacklistWhitelistDbOpenHelper.java
│ │ │ │ └── CustomArtworkTable.java
│ │ │ ├── legacy
│ │ │ │ ├── BlacklistDbOpenHelper.java
│ │ │ │ ├── BlacklistedSong.java
│ │ │ │ ├── WhitelistDbOpenHelper.java
│ │ │ │ └── WhitelistFolder.java
│ │ │ ├── providers
│ │ │ │ ├── CustomArtworkContentProvider.java
│ │ │ │ ├── PlayCountContentProvider.java
│ │ │ │ └── PlayCountTable.java
│ │ │ └── sqlbrite
│ │ │ │ ├── QueryToListOperator.java
│ │ │ │ ├── QueryToOneOperator.java
│ │ │ │ ├── QueryToOptionalOperator.java
│ │ │ │ └── SqlBriteUtils.java
│ │ │ ├── ui
│ │ │ ├── adapters
│ │ │ │ ├── LoggingViewModelAdapter.java
│ │ │ │ ├── PagerAdapter.java
│ │ │ │ ├── RobotoSpinnerAdapter.java
│ │ │ │ ├── SectionedAdapter.java
│ │ │ │ └── ViewType.java
│ │ │ ├── common
│ │ │ │ ├── BaseActivity.java
│ │ │ │ ├── BaseFragment.java
│ │ │ │ ├── BaseFragmentModule.java
│ │ │ │ ├── EqualizerModule.java
│ │ │ │ ├── Presenter.java
│ │ │ │ ├── PurchasePresenter.java
│ │ │ │ ├── RequestManagerProvider.java
│ │ │ │ ├── ToolbarListener.java
│ │ │ │ └── TransitionListenerAdapter.java
│ │ │ ├── dialog
│ │ │ │ ├── AlbumBiographyDialog.kt
│ │ │ │ ├── ArtistBiographyDialog.kt
│ │ │ │ ├── ChangelogDialog.kt
│ │ │ │ ├── DeleteDialog.java
│ │ │ │ ├── FileInfoDialog.kt
│ │ │ │ ├── InclExclDialog.kt
│ │ │ │ ├── ShareDialog.kt
│ │ │ │ ├── SongInfoDialog.kt
│ │ │ │ ├── UpgradeDialog.kt
│ │ │ │ ├── UpgradeNagDialog.kt
│ │ │ │ ├── UpgradeSuccessDialog.kt
│ │ │ │ └── WeekSelectorDialog.kt
│ │ │ ├── modelviews
│ │ │ │ ├── AlbumArtistView.java
│ │ │ │ ├── AlbumView.java
│ │ │ │ ├── ArtworkLoadingView.java
│ │ │ │ ├── ArtworkView.java
│ │ │ │ ├── BaseSelectableViewModel.java
│ │ │ │ ├── BreadcrumbsView.java
│ │ │ │ ├── DiscNumberView.java
│ │ │ │ ├── EmptyView.java
│ │ │ │ ├── FolderView.java
│ │ │ │ ├── GenreView.java
│ │ │ │ ├── HorizontalAlbumView.java
│ │ │ │ ├── HorizontalRecyclerView.java
│ │ │ │ ├── InclExclView.java
│ │ │ │ ├── LoadingView.java
│ │ │ │ ├── MultiItemView.java
│ │ │ │ ├── PlaylistView.java
│ │ │ │ ├── QueuePagerItemView.java
│ │ │ │ ├── SearchHeaderView.java
│ │ │ │ ├── SectionedView.java
│ │ │ │ ├── SelectableViewModel.java
│ │ │ │ ├── ShuffleView.java
│ │ │ │ ├── SongView.java
│ │ │ │ ├── SubheaderView.java
│ │ │ │ ├── SuggestedHeaderView.java
│ │ │ │ ├── SuggestedSongView.java
│ │ │ │ └── TabViewModel.java
│ │ │ ├── screens
│ │ │ │ ├── album
│ │ │ │ │ ├── detail
│ │ │ │ │ │ ├── AlbumDetailFragment.kt
│ │ │ │ │ │ ├── AlbumDetailPresenter.kt
│ │ │ │ │ │ ├── AlbumDetailView.kt
│ │ │ │ │ │ └── AlbumsDetailFragmentModule.java
│ │ │ │ │ ├── list
│ │ │ │ │ │ ├── AlbumListContract.kt
│ │ │ │ │ │ ├── AlbumListFragment.kt
│ │ │ │ │ │ ├── AlbumListFragmentModule.java
│ │ │ │ │ │ └── AlbumListPresenter.kt
│ │ │ │ │ └── menu
│ │ │ │ │ │ ├── AlbumMenuContract.kt
│ │ │ │ │ │ └── AlbumMenuPresenter.kt
│ │ │ │ ├── artist
│ │ │ │ │ ├── detail
│ │ │ │ │ │ ├── ArtistDetailFragment.kt
│ │ │ │ │ │ ├── ArtistDetailPresenter.kt
│ │ │ │ │ │ ├── ArtistDetailView.kt
│ │ │ │ │ │ └── ArtistsDetailFragmentModule.java
│ │ │ │ │ ├── list
│ │ │ │ │ │ ├── AlbumArtistListContract.kt
│ │ │ │ │ │ ├── AlbumArtistListFragment.kt
│ │ │ │ │ │ ├── AlbumArtistListFragmentModule.java
│ │ │ │ │ │ └── AlbumArtistListPresenter.kt
│ │ │ │ │ └── menu
│ │ │ │ │ │ ├── AlbumArtistMenuContract.kt
│ │ │ │ │ │ └── AlbumArtistMenuPresenter.kt
│ │ │ │ ├── drawer
│ │ │ │ │ ├── DrawerAdapter.java
│ │ │ │ │ ├── DrawerChild.java
│ │ │ │ │ ├── DrawerDivider.java
│ │ │ │ │ ├── DrawerFragment.kt
│ │ │ │ │ ├── DrawerFragmentModule.java
│ │ │ │ │ ├── DrawerLockController.java
│ │ │ │ │ ├── DrawerLockManager.java
│ │ │ │ │ ├── DrawerParent.java
│ │ │ │ │ ├── DrawerPresenter.kt
│ │ │ │ │ ├── DrawerProvider.java
│ │ │ │ │ ├── DrawerView.kt
│ │ │ │ │ ├── MiniPlayerLockManager.java
│ │ │ │ │ └── NavigationEventRelay.java
│ │ │ │ ├── equalizer
│ │ │ │ │ ├── EqualizerFragment.java
│ │ │ │ │ └── EqualizerModule.java
│ │ │ │ ├── folders
│ │ │ │ │ ├── FolderFragment.java
│ │ │ │ │ └── FolderFragmentModule.java
│ │ │ │ ├── genre
│ │ │ │ │ ├── detail
│ │ │ │ │ │ ├── GenreDetailFragment.kt
│ │ │ │ │ │ ├── GenreDetailFragmentModule.java
│ │ │ │ │ │ ├── GenreDetailPresenter.kt
│ │ │ │ │ │ └── GenreDetailView.kt
│ │ │ │ │ ├── list
│ │ │ │ │ │ ├── GenreListContract.kt
│ │ │ │ │ │ ├── GenreListFragment.kt
│ │ │ │ │ │ ├── GenreListFragmentModule.java
│ │ │ │ │ │ └── GenreListPresenter.kt
│ │ │ │ │ └── menu
│ │ │ │ │ │ ├── GenreMenuContract.kt
│ │ │ │ │ │ └── GenreMenuPresenter.kt
│ │ │ │ ├── lyrics
│ │ │ │ │ ├── LyricsDialog.kt
│ │ │ │ │ ├── LyricsPresenter.kt
│ │ │ │ │ ├── LyricsView.kt
│ │ │ │ │ └── QuickLyricUtils.java
│ │ │ │ ├── main
│ │ │ │ │ ├── LibraryController.java
│ │ │ │ │ ├── LibraryFragmentModule.java
│ │ │ │ │ ├── MainActivity.java
│ │ │ │ │ ├── MainActivityModule.java
│ │ │ │ │ ├── MainController.java
│ │ │ │ │ └── MainControllerModule.java
│ │ │ │ ├── miniplayer
│ │ │ │ │ ├── MiniPlayerFragment.java
│ │ │ │ │ └── MiniPlayerFragmentModule.java
│ │ │ │ ├── nowplaying
│ │ │ │ │ ├── PlayerFragment.java
│ │ │ │ │ ├── PlayerFragmentModule.java
│ │ │ │ │ ├── PlayerPresenter.kt
│ │ │ │ │ └── PlayerView.kt
│ │ │ │ ├── playlist
│ │ │ │ │ ├── detail
│ │ │ │ │ │ ├── PlaylistDetailFragment.kt
│ │ │ │ │ │ ├── PlaylistDetailFragmentModule.java
│ │ │ │ │ │ ├── PlaylistDetailPresenter.kt
│ │ │ │ │ │ └── PlaylistDetailView.kt
│ │ │ │ │ ├── dialog
│ │ │ │ │ │ ├── CreatePlaylistDialog.kt
│ │ │ │ │ │ ├── DeletePlaylistConfirmationDialog.kt
│ │ │ │ │ │ ├── M3uPlaylistDialog.kt
│ │ │ │ │ │ └── RenamePlaylistDialog.kt
│ │ │ │ │ ├── list
│ │ │ │ │ │ ├── PlaylistListContract.kt
│ │ │ │ │ │ ├── PlaylistListFragment.kt
│ │ │ │ │ │ ├── PlaylistListFragmentModule.java
│ │ │ │ │ │ └── PlaylistListPresenter.kt
│ │ │ │ │ └── menu
│ │ │ │ │ │ ├── PlaylistMenuContract.kt
│ │ │ │ │ │ └── PlaylistMenuPresenter.kt
│ │ │ │ ├── qcircle
│ │ │ │ │ └── QCircleActivity.java
│ │ │ │ ├── queue
│ │ │ │ │ ├── QueueContract.kt
│ │ │ │ │ ├── QueueFragment.kt
│ │ │ │ │ ├── QueueFragmentModule.java
│ │ │ │ │ ├── QueueItem.kt
│ │ │ │ │ ├── QueuePresenter.kt
│ │ │ │ │ ├── QueueViewBinder.kt
│ │ │ │ │ ├── menu
│ │ │ │ │ │ ├── QueueMenuPresenter.kt
│ │ │ │ │ │ └── SongsMenuContract.kt
│ │ │ │ │ └── pager
│ │ │ │ │ │ ├── QueuePagerFragment.java
│ │ │ │ │ │ ├── QueuePagerFragmentModule.java
│ │ │ │ │ │ ├── QueuePagerPresenter.java
│ │ │ │ │ │ └── QueuePagerView.java
│ │ │ │ ├── search
│ │ │ │ │ ├── JaroWinklerObject.java
│ │ │ │ │ ├── SearchFragment.kt
│ │ │ │ │ ├── SearchFragmentModule.java
│ │ │ │ │ ├── SearchPresenter.kt
│ │ │ │ │ ├── SearchResult.kt
│ │ │ │ │ ├── SearchView.kt
│ │ │ │ │ └── voice
│ │ │ │ │ │ └── VoiceSearchActivity.java
│ │ │ │ ├── shortcut
│ │ │ │ │ └── ShortcutTrampolineActivity.kt
│ │ │ │ ├── songs
│ │ │ │ │ ├── list
│ │ │ │ │ │ ├── SongListContract.kt
│ │ │ │ │ │ ├── SongListFragment.kt
│ │ │ │ │ │ ├── SongListPresenter.kt
│ │ │ │ │ │ └── SongsListFragmentModule.java
│ │ │ │ │ └── menu
│ │ │ │ │ │ ├── SongMenuContract.kt
│ │ │ │ │ │ └── SongMenuPresenter.kt
│ │ │ │ ├── suggested
│ │ │ │ │ ├── SuggestedContract.kt
│ │ │ │ │ ├── SuggestedFragment.kt
│ │ │ │ │ ├── SuggestedFragmentModule.java
│ │ │ │ │ └── SuggestedPresenter.kt
│ │ │ │ ├── tagger
│ │ │ │ │ ├── CheckDocumentPermissionsTask.java
│ │ │ │ │ ├── TaggerDialog.java
│ │ │ │ │ ├── TaggerTask.java
│ │ │ │ │ └── TaggerUtils.java
│ │ │ │ ├── upnext
│ │ │ │ │ └── UpNextView.kt
│ │ │ │ └── widgets
│ │ │ │ │ └── WidgetFragment.java
│ │ │ ├── settings
│ │ │ │ ├── SettingsFragmentModule.java
│ │ │ │ ├── SettingsParentFragment.java
│ │ │ │ ├── SettingsParentFragmentModule.java
│ │ │ │ ├── SettingsPresenter.java
│ │ │ │ ├── SettingsView.java
│ │ │ │ ├── SupportPresenter.java
│ │ │ │ ├── SupportView.java
│ │ │ │ └── TabChooserDialog.kt
│ │ │ ├── views
│ │ │ │ ├── AestheticDrawableTextView.java
│ │ │ │ ├── AestheticFastScrollRecyclerView.java
│ │ │ │ ├── AestheticTintedImageView.java
│ │ │ │ ├── BreadcrumbItem.java
│ │ │ │ ├── BreadcrumbView.java
│ │ │ │ ├── CircleImageView.java
│ │ │ │ ├── CircleView.java
│ │ │ │ ├── ContextualToolbar.java
│ │ │ │ ├── ContextualToolbarHost.java
│ │ │ │ ├── CustomCheckbox.java
│ │ │ │ ├── CustomMediaRouteActionProvider.java
│ │ │ │ ├── DragGripView.java
│ │ │ │ ├── DragHandle.java
│ │ │ │ ├── DrawerIconImageView.java
│ │ │ │ ├── FavoriteActionBarView.java
│ │ │ │ ├── LockActionBarView.java
│ │ │ │ ├── NonClickableToolbar.java
│ │ │ │ ├── NonScrollImageButton.java
│ │ │ │ ├── OverflowButton.java
│ │ │ │ ├── PagerListenerAdapter.java
│ │ │ │ ├── PlayCountView.java
│ │ │ │ ├── PlayPauseDrawable.java
│ │ │ │ ├── PlayPauseView.java
│ │ │ │ ├── PlayerViewAdapter.kt
│ │ │ │ ├── PurchaseView.java
│ │ │ │ ├── RatingSnackbar.kt
│ │ │ │ ├── RepeatButton.java
│ │ │ │ ├── RepeatingImageButton.java
│ │ │ │ ├── ShuffleButton.java
│ │ │ │ ├── SizableSeekBar.java
│ │ │ │ ├── SnowfallView.java
│ │ │ │ ├── SquareFrameLayout.java
│ │ │ │ ├── SquareHeightImageView.java
│ │ │ │ ├── SquareImageView.java
│ │ │ │ ├── StatusBarView.java
│ │ │ │ ├── SuggestedDividerDecoration.java
│ │ │ │ ├── SuggestedHeaderButton.java
│ │ │ │ ├── TextViewDrawableSize.java
│ │ │ │ ├── ThemedStatusBarView.java
│ │ │ │ ├── multisheet
│ │ │ │ │ ├── CustomMultiSheetView.java
│ │ │ │ │ ├── MultiSheetEventRelay.java
│ │ │ │ │ └── MultiSheetSlideEventRelay.java
│ │ │ │ └── recyclerview
│ │ │ │ │ ├── AdaptableSpanSizeLookup.java
│ │ │ │ │ ├── GridDividerDecoration.java
│ │ │ │ │ ├── ItemTouchHelperCallback.java
│ │ │ │ │ └── SpacesItemDecoration.java
│ │ │ └── widgets
│ │ │ │ ├── BaseWidgetConfigureActivity.java
│ │ │ │ ├── BaseWidgetProvider.java
│ │ │ │ ├── WidgetConfigureActivityExtraLarge.java
│ │ │ │ ├── WidgetConfigureActivityExtraLargeModule.java
│ │ │ │ ├── WidgetConfigureActivityLarge.java
│ │ │ │ ├── WidgetConfigureActivityLargeModule.java
│ │ │ │ ├── WidgetConfigureActivityMedium.java
│ │ │ │ ├── WidgetConfigureActivityMediumModule.java
│ │ │ │ ├── WidgetConfigureActivitySmall.java
│ │ │ │ ├── WidgetConfigureActivitySmallModule.java
│ │ │ │ ├── WidgetFragmentModule.java
│ │ │ │ ├── WidgetProviderExtraLarge.java
│ │ │ │ ├── WidgetProviderLarge.java
│ │ │ │ ├── WidgetProviderMedium.java
│ │ │ │ └── WidgetProviderSmall.java
│ │ │ └── utils
│ │ │ ├── ActionBarUtils.java
│ │ │ ├── AnalyticsManager.java
│ │ │ ├── AnimUtils.java
│ │ │ ├── ArtworkDialog.java
│ │ │ ├── ArtworkUtils.java
│ │ │ ├── BaseSettingsManager.kt
│ │ │ ├── ColorPalette.java
│ │ │ ├── ColorUtils.java
│ │ │ ├── ComparisonUtils.java
│ │ │ ├── ContextualToolbarHelper.java
│ │ │ ├── CustomMediaScanner.java
│ │ │ ├── DrawableUtils.java
│ │ │ ├── FileBrowser.java
│ │ │ ├── FileHelper.java
│ │ │ ├── FragmentExt.kt
│ │ │ ├── InputMethodManagerLeaks.java
│ │ │ ├── LegacyUtils.java
│ │ │ ├── LetterDrawable.java
│ │ │ ├── ListUtils.java
│ │ │ ├── LogUtils.java
│ │ │ ├── MediaButtonIntentReceiver.java
│ │ │ ├── MusicServiceConnectionUtils.java
│ │ │ ├── Operators.java
│ │ │ ├── PermissionUtils.java
│ │ │ ├── PlaceholderProvider.java
│ │ │ ├── ResourceUtils.java
│ │ │ ├── ResumingServiceManager.kt
│ │ │ ├── RingtoneManager.kt
│ │ │ ├── SettingsManager.java
│ │ │ ├── ShuttleUtils.java
│ │ │ ├── SleepTimer.java
│ │ │ ├── StringUtils.java
│ │ │ ├── ThemeUtils.java
│ │ │ ├── ThreadUtils.java
│ │ │ ├── TimeLogger.java
│ │ │ ├── TypefaceManager.java
│ │ │ ├── ViewUtils.java
│ │ │ ├── color
│ │ │ ├── ArgbEvaluator.java
│ │ │ ├── BitmapPaletteProcessor.java
│ │ │ └── ColorHelper.java
│ │ │ ├── extensions
│ │ │ ├── AlbumArtistExt.kt
│ │ │ ├── AlbumExt.kt
│ │ │ ├── GenreExt.kt
│ │ │ └── SongExt.kt
│ │ │ ├── menu
│ │ │ ├── MenuUtils.java
│ │ │ ├── album
│ │ │ │ ├── AlbumMenuUtils.kt
│ │ │ │ └── AlbumsMenuCallbacks.kt
│ │ │ ├── albumartist
│ │ │ │ ├── AlbumArtistMenuCallbacks.kt
│ │ │ │ └── AlbumArtistMenuUtils.kt
│ │ │ ├── folder
│ │ │ │ └── FolderMenuUtils.kt
│ │ │ ├── genre
│ │ │ │ ├── GenreMenuCallbacks.kt
│ │ │ │ └── GenreMenuUtils.kt
│ │ │ ├── playlist
│ │ │ │ ├── PlaylistMenuCallbacks.kt
│ │ │ │ └── PlaylistMenuUtils.kt
│ │ │ ├── queue
│ │ │ │ ├── QueueMenuCallbacks.kt
│ │ │ │ └── QueueMenuUtils.kt
│ │ │ └── song
│ │ │ │ ├── SongMenuUtils.kt
│ │ │ │ └── SongsMenuCallbacks.kt
│ │ │ ├── playlists
│ │ │ ├── FavoritesPlaylistManager.kt
│ │ │ ├── PlaylistManager.kt
│ │ │ └── PlaylistMenuHelper.kt
│ │ │ └── sorting
│ │ │ ├── AlbumSortHelper.kt
│ │ │ ├── SongSortHelper.kt
│ │ │ └── SortManager.java
│ └── res
│ │ ├── anim
│ │ ├── item_animation_from_bottom.xml
│ │ └── layout_animation_from_bottom.xml
│ │ ├── drawable-hdpi
│ │ ├── ic_drag_grip.png
│ │ ├── ic_drawer_header_placeholder.png
│ │ ├── ic_headphones_white.png
│ │ ├── ic_placeholder_dark_large.png
│ │ ├── ic_placeholder_dark_medium.png
│ │ ├── ic_placeholder_light_large.png
│ │ ├── ic_placeholder_light_medium.png
│ │ ├── ic_settings_scrobbling.png
│ │ ├── ic_stat_notification.png
│ │ ├── list_pressed_holo_dark.9.png
│ │ ├── list_pressed_holo_light.9.png
│ │ ├── quicklyric.png
│ │ ├── scrubber_control_from_pressed_mtrl_000.png
│ │ ├── scrubber_primary_mtrl_alpha.9.png
│ │ └── scrubber_track_mtrl_alpha.9.png
│ │ ├── drawable-nodpi
│ │ └── backbutton.png
│ │ ├── drawable-v21
│ │ ├── list_selector_dark.xml
│ │ ├── list_selector_light.xml
│ │ ├── ripple_circular_dark.xml
│ │ └── ripple_circular_light.xml
│ │ ├── drawable-xhdpi
│ │ ├── ic_drag_grip.png
│ │ ├── ic_drawer_header_placeholder.png
│ │ ├── ic_headphones_white.png
│ │ ├── ic_placeholder_dark_large.png
│ │ ├── ic_placeholder_dark_medium.png
│ │ ├── ic_placeholder_light_large.png
│ │ ├── ic_placeholder_light_medium.png
│ │ ├── ic_settings_scrobbling.png
│ │ ├── ic_stat_notification.png
│ │ ├── list_pressed_holo_dark.9.png
│ │ ├── list_pressed_holo_light.9.png
│ │ ├── quicklyric.png
│ │ ├── scrubber_control_from_pressed_mtrl_000.png
│ │ ├── scrubber_primary_mtrl_alpha.9.png
│ │ └── scrubber_track_mtrl_alpha.9.png
│ │ ├── drawable-xxhdpi
│ │ ├── ic_drag_grip.png
│ │ ├── ic_drawer_header_placeholder.png
│ │ ├── ic_headphones_white.png
│ │ ├── ic_placeholder_dark_large.png
│ │ ├── ic_placeholder_dark_medium.png
│ │ ├── ic_placeholder_light_large.png
│ │ ├── ic_placeholder_light_medium.png
│ │ ├── ic_settings_scrobbling.png
│ │ ├── ic_stat_notification.png
│ │ ├── list_pressed_holo_dark.9.png
│ │ ├── list_pressed_holo_light.9.png
│ │ ├── quicklyric.png
│ │ ├── scrubber_control_from_pressed_mtrl_000.png
│ │ ├── scrubber_primary_mtrl_alpha.9.png
│ │ └── scrubber_track_mtrl_alpha.9.png
│ │ ├── drawable-xxxhdpi
│ │ └── ic_headphones_white.png
│ │ ├── drawable
│ │ ├── bg_rounded.xml
│ │ ├── card_shadow.xml
│ │ ├── circle.xml
│ │ ├── ic_action_lyrics_24dp.xml
│ │ ├── ic_add_circle_outline_24dp.xml
│ │ ├── ic_album_24dp.xml
│ │ ├── ic_arrow_down_24dp.xml
│ │ ├── ic_arrow_right_24dp.xml
│ │ ├── ic_arrow_up_24dp.xml
│ │ ├── ic_audiotrack_24dp.xml
│ │ ├── ic_check_24dp.xml
│ │ ├── ic_close_24dp.xml
│ │ ├── ic_delete_24dp.xml
│ │ ├── ic_equalizer_24dp.xml
│ │ ├── ic_favorite_24dp.xml
│ │ ├── ic_favorite_24dp_scaled.xml
│ │ ├── ic_favorite_border_24dp.xml
│ │ ├── ic_favorite_border_24dp_scaled.xml
│ │ ├── ic_folder_24dp.xml
│ │ ├── ic_folder_multiple_24dp.xml
│ │ ├── ic_folder_nav.xml
│ │ ├── ic_folder_outline.xml
│ │ ├── ic_folder_remove.xml
│ │ ├── ic_headset_24dp.xml
│ │ ├── ic_help_24dp.xml
│ │ ├── ic_image_24dp.xml
│ │ ├── ic_info_outline_24dp.xml
│ │ ├── ic_launcher_background.xml
│ │ ├── ic_launcher_foreground.xml
│ │ ├── ic_launcher_foreground_layer.xml
│ │ ├── ic_library_music_24dp.xml
│ │ ├── ic_lock_24dp.xml
│ │ ├── ic_overflow_20dp.xml
│ │ ├── ic_palette_24dp.xml
│ │ ├── ic_pause_24dp.xml
│ │ ├── ic_play_24dp.xml
│ │ ├── ic_play_circle_outline_24dp.xml
│ │ ├── ic_play_next.xml
│ │ ├── ic_playlist_add_24dp.xml
│ │ ├── ic_queue_music_24dp.xml
│ │ ├── ic_queue_remove.xml
│ │ ├── ic_repeat_24dp_scaled.xml
│ │ ├── ic_repeat_one_24dp_scaled.xml
│ │ ├── ic_search_24dp.xml
│ │ ├── ic_settings_24dp.xml
│ │ ├── ic_shuffle_24dp.xml
│ │ ├── ic_shuffle_24dp_scaled.xml
│ │ ├── ic_shuffle_off_circled.xml
│ │ ├── ic_shuffle_on_circled.xml
│ │ ├── ic_skip_next_24dp.xml
│ │ ├── ic_skip_previous_24dp.xml
│ │ ├── ic_sleep_24dp.xml
│ │ ├── ic_sort_24dp.xml
│ │ ├── ic_tv_24dp.xml
│ │ ├── ic_unlock_24dp.xml
│ │ ├── ic_view_list_24dp.xml
│ │ ├── ic_warning_24dp.xml
│ │ ├── list_item_activated_dark.xml
│ │ ├── list_item_activated_light.xml
│ │ ├── list_selector_dark.xml
│ │ ├── list_selector_light.xml
│ │ ├── lock_anim.xml
│ │ ├── ripple_circular_dark.xml
│ │ ├── ripple_circular_light.xml
│ │ ├── scrubber_progress_horizontal_material.xml
│ │ ├── scrubber_progress_horizontal_material_no_background.xml
│ │ ├── shortcut_folder.xml
│ │ ├── shortcut_play.xml
│ │ ├── shortcut_shuffle.xml
│ │ ├── text_protection_scrim.xml
│ │ ├── text_protection_scrim_reversed.xml
│ │ └── unlock_anim.xml
│ │ ├── layout-land
│ │ ├── fragment_player.xml
│ │ └── up_next_view.xml
│ │ ├── layout-sw600dp
│ │ ├── list_item_edit.xml
│ │ ├── list_item_one_line.xml
│ │ └── list_item_two_lines.xml
│ │ ├── layout
│ │ ├── action_bar_favorite.xml
│ │ ├── action_bar_lock.xml
│ │ ├── activity_main.xml
│ │ ├── activity_qcircle.xml
│ │ ├── activity_widget_config.xml
│ │ ├── breadcrumb_item.xml
│ │ ├── breadcrumb_item_divider.xml
│ │ ├── breadcrumb_view.xml
│ │ ├── contextual_toolbar.xml
│ │ ├── dialog_artwork.xml
│ │ ├── dialog_biography.xml
│ │ ├── dialog_changelog.xml
│ │ ├── dialog_incl_excl.xml
│ │ ├── dialog_lyrics.xml
│ │ ├── dialog_minutes_picker.xml
│ │ ├── dialog_playlist.xml
│ │ ├── dialog_playlist_duplicates.xml
│ │ ├── dialog_progress.xml
│ │ ├── dialog_rename.xml
│ │ ├── dialog_song_info.xml
│ │ ├── dialog_song_info_item.xml
│ │ ├── dialog_tagger.xml
│ │ ├── drawer_header.xml
│ │ ├── empty_view.xml
│ │ ├── fragment_detail.xml
│ │ ├── fragment_drawer.xml
│ │ ├── fragment_equalizer.xml
│ │ ├── fragment_folder_browser.xml
│ │ ├── fragment_library.xml
│ │ ├── fragment_main.xml
│ │ ├── fragment_mini_player.xml
│ │ ├── fragment_player.xml
│ │ ├── fragment_queue.xml
│ │ ├── fragment_queue_pager.xml
│ │ ├── fragment_recycler.xml
│ │ ├── fragment_search.xml
│ │ ├── fragment_settings.xml
│ │ ├── fragment_suggested.xml
│ │ ├── fragment_widget.xml
│ │ ├── grid_item.xml
│ │ ├── grid_item_bottom_container.xml
│ │ ├── grid_item_bottom_container_card.xml
│ │ ├── grid_item_card.xml
│ │ ├── grid_item_horizontal.xml
│ │ ├── grid_item_palette.xml
│ │ ├── list_item_artwork.xml
│ │ ├── list_item_artwork_loading.xml
│ │ ├── list_item_breadcrumbs.xml
│ │ ├── list_item_disc_number.xml
│ │ ├── list_item_drawer.xml
│ │ ├── list_item_drawer_divider.xml
│ │ ├── list_item_edit.xml
│ │ ├── list_item_folder.xml
│ │ ├── list_item_image.xml
│ │ ├── list_item_loading.xml
│ │ ├── list_item_one_line.xml
│ │ ├── list_item_queue_pager.xml
│ │ ├── list_item_reorder_tabs.xml
│ │ ├── list_item_section_separator.xml
│ │ ├── list_item_shuffle.xml
│ │ ├── list_item_small.xml
│ │ ├── list_item_subheader.xml
│ │ ├── list_item_subheader_lock.xml
│ │ ├── list_item_two_lines.xml
│ │ ├── overflow_button.xml
│ │ ├── recycler_header.xml
│ │ ├── repeat_button.xml
│ │ ├── shuffle_button.xml
│ │ ├── spinner_item.xml
│ │ ├── suggested_header.xml
│ │ ├── up_next_view.xml
│ │ ├── weekpicker.xml
│ │ ├── widget_layout_extra_large.xml
│ │ ├── widget_layout_large.xml
│ │ ├── widget_layout_large_alt.xml
│ │ ├── widget_layout_medium.xml
│ │ ├── widget_layout_medium_alt.xml
│ │ └── widget_layout_small.xml
│ │ ├── menu
│ │ ├── context_menu_folders.xml
│ │ ├── context_menu_general.xml
│ │ ├── context_menu_queue.xml
│ │ ├── menu_album.xml
│ │ ├── menu_artist.xml
│ │ ├── menu_detail_sort.xml
│ │ ├── menu_detail_sort_albums.xml
│ │ ├── menu_detail_sort_songs.xml
│ │ ├── menu_equalizer.xml
│ │ ├── menu_file.xml
│ │ ├── menu_folders.xml
│ │ ├── menu_fragment_queue.xml
│ │ ├── menu_genre.xml
│ │ ├── menu_library.xml
│ │ ├── menu_now_playing.xml
│ │ ├── menu_playlist.xml
│ │ ├── menu_queue_song.xml
│ │ ├── menu_search.xml
│ │ ├── menu_song.xml
│ │ ├── menu_sort_albums.xml
│ │ ├── menu_sort_artists.xml
│ │ ├── menu_sort_songs.xml
│ │ └── menu_view_as.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── raw
│ │ └── beep.mp3
│ │ ├── transition
│ │ └── image_transition.xml
│ │ ├── values-bg-rBG
│ │ └── strings.xml
│ │ ├── values-ca
│ │ └── strings.xml
│ │ ├── values-de
│ │ └── strings.xml
│ │ ├── values-en-rAU
│ │ └── strings.xml
│ │ ├── values-en-rGB
│ │ └── strings.xml
│ │ ├── values-en-rNZ
│ │ └── strings.xml
│ │ ├── values-es-rES
│ │ └── strings.xml
│ │ ├── values-es
│ │ └── strings.xml
│ │ ├── values-et-rEE
│ │ └── strings.xml
│ │ ├── values-eu-rES
│ │ └── strings.xml
│ │ ├── values-fr
│ │ └── strings.xml
│ │ ├── values-hi-rIN
│ │ └── strings.xml
│ │ ├── values-hr
│ │ └── strings.xml
│ │ ├── values-hu
│ │ └── strings.xml
│ │ ├── values-it
│ │ └── strings.xml
│ │ ├── values-ja
│ │ └── strings.xml
│ │ ├── values-ko
│ │ └── strings.xml
│ │ ├── values-land
│ │ ├── arrays.xml
│ │ ├── bool.xml
│ │ ├── dimens.xml
│ │ └── integers.xml
│ │ ├── values-nl
│ │ └── strings.xml
│ │ ├── values-pl
│ │ └── strings.xml
│ │ ├── values-pt-rBR
│ │ └── strings.xml
│ │ ├── values-ro
│ │ └── strings.xml
│ │ ├── values-ru
│ │ └── strings.xml
│ │ ├── values-sw360dp-land
│ │ └── dimens.xml
│ │ ├── values-sw360dp
│ │ └── dimens.xml
│ │ ├── values-sw600dp-land
│ │ ├── arrays.xml
│ │ ├── bool.xml
│ │ ├── dimens.xml
│ │ └── integers.xml
│ │ ├── values-sw600dp
│ │ ├── arrays.xml
│ │ ├── bool.xml
│ │ ├── dimens.xml
│ │ └── integers.xml
│ │ ├── values-sw720dp-land
│ │ ├── bool.xml
│ │ └── dimens.xml
│ │ ├── values-sw720dp
│ │ ├── bool.xml
│ │ └── dimens.xml
│ │ ├── values-th
│ │ └── strings.xml
│ │ ├── values-tr
│ │ └── strings.xml
│ │ ├── values-uk
│ │ └── strings.xml
│ │ ├── values-v21
│ │ ├── color.xml
│ │ ├── dimens.xml
│ │ └── styles.xml
│ │ ├── values-v24
│ │ ├── color.xml
│ │ └── dimens.xml
│ │ ├── values-vi
│ │ └── strings.xml
│ │ ├── values-zh-rCN
│ │ └── strings.xml
│ │ ├── values-zh-rTW
│ │ └── strings.xml
│ │ ├── values
│ │ ├── arrays.xml
│ │ ├── attrs.xml
│ │ ├── bool.xml
│ │ ├── color.xml
│ │ ├── dimens.xml
│ │ ├── donottranslate.xml
│ │ ├── ids.xml
│ │ ├── integers.xml
│ │ ├── material_colors.xml
│ │ ├── play_store_strings.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ │ └── xml
│ │ ├── allowed_media_browser_callers.xml
│ │ ├── automotive_app_desc.xml
│ │ ├── provider_paths.xml
│ │ ├── remote_config_defaults.xml
│ │ ├── searchable.xml
│ │ ├── settings_artwork.xml
│ │ ├── settings_blacklist.xml
│ │ ├── settings_display.xml
│ │ ├── settings_headers.xml
│ │ ├── settings_headset.xml
│ │ ├── settings_playback.xml
│ │ ├── settings_scrobbling.xml
│ │ ├── settings_support.xml
│ │ ├── settings_themes.xml
│ │ ├── shortcuts.xml
│ │ ├── widget_provider_extra_large.xml
│ │ ├── widget_provider_large.xml
│ │ ├── widget_provider_medium.xml
│ │ └── widget_provider_small.xml
│ └── paid
│ └── res
│ ├── values
│ └── donottranslate.xml
│ └── xml
│ └── shortcuts.xml
├── build.gradle
├── buildSrc
├── build.gradle.kts
└── src
│ └── main
│ └── kotlin
│ ├── Config.kt
│ └── dependencies
│ └── Dependencies.kt
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── libraries
├── aesthetic
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── afollestad
│ │ │ └── aesthetic
│ │ │ ├── ActiveInactiveColors.java
│ │ │ ├── Aesthetic.java
│ │ │ ├── AestheticActionMenuItemView.java
│ │ │ ├── AestheticActivity.java
│ │ │ ├── AestheticBottomNavigationView.java
│ │ │ ├── AestheticButton.java
│ │ │ ├── AestheticCardView.java
│ │ │ ├── AestheticCheckBox.java
│ │ │ ├── AestheticCoordinatorLayout.java
│ │ │ ├── AestheticDialogButton.java
│ │ │ ├── AestheticDrawerLayout.java
│ │ │ ├── AestheticEditText.java
│ │ │ ├── AestheticFab.java
│ │ │ ├── AestheticImageButton.java
│ │ │ ├── AestheticImageView.java
│ │ │ ├── AestheticKeyProvider.java
│ │ │ ├── AestheticListView.java
│ │ │ ├── AestheticNavigationView.java
│ │ │ ├── AestheticNestedScrollView.java
│ │ │ ├── AestheticProgressBar.java
│ │ │ ├── AestheticRadioButton.java
│ │ │ ├── AestheticRecyclerView.java
│ │ │ ├── AestheticScrollView.java
│ │ │ ├── AestheticSeekBar.java
│ │ │ ├── AestheticSnackBarButton.java
│ │ │ ├── AestheticSnackBarTextView.java
│ │ │ ├── AestheticSpinner.java
│ │ │ ├── AestheticSwitch.java
│ │ │ ├── AestheticSwitchCompat.java
│ │ │ ├── AestheticTabLayout.java
│ │ │ ├── AestheticTextInputEditText.java
│ │ │ ├── AestheticTextInputLayout.java
│ │ │ ├── AestheticTextView.java
│ │ │ ├── AestheticToolbar.java
│ │ │ ├── AestheticViewPager.java
│ │ │ ├── AutoSwitchMode.java
│ │ │ ├── BgIconColorState.java
│ │ │ ├── BottomNavBgMode.java
│ │ │ ├── BottomNavIconTextMode.java
│ │ │ ├── ColorIsDarkState.java
│ │ │ ├── EdgeGlowUtil.java
│ │ │ ├── InflationInterceptor.java
│ │ │ ├── LightDarkColorState.java
│ │ │ ├── MaterialDialogsUtil.java
│ │ │ ├── NavigationViewMode.java
│ │ │ ├── Rx.java
│ │ │ ├── TabLayoutBgMode.java
│ │ │ ├── TabLayoutIndicatorMode.java
│ │ │ ├── TextInputLayoutUtil.java
│ │ │ ├── TintHelper.java
│ │ │ ├── Util.java
│ │ │ ├── ViewBackgroundAction.java
│ │ │ ├── ViewBackgroundSubscriber.java
│ │ │ ├── ViewHintTextColorAction.java
│ │ │ ├── ViewObservablePair.java
│ │ │ ├── ViewTextColorAction.java
│ │ │ └── ViewUtil.java
│ │ ├── res-public
│ │ └── values
│ │ │ ├── attrs.xml
│ │ │ └── public.xml
│ │ └── res
│ │ └── values
│ │ └── colors.xml
├── glidepalette
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── github
│ │ │ └── florent37
│ │ │ └── glidepalette
│ │ │ ├── BitmapPalette.java
│ │ │ ├── GlidePalette.java
│ │ │ └── PaletteTarget.java
│ │ └── res
│ │ └── values
│ │ └── strings.xml
├── multisheetview
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── simplecity
│ │ │ └── multisheetview
│ │ │ └── ui
│ │ │ ├── behavior
│ │ │ └── CustomBottomSheetBehavior.java
│ │ │ └── view
│ │ │ └── MultiSheetView.java
│ │ └── res
│ │ ├── layout
│ │ └── multi_sheet.xml
│ │ ├── values-land
│ │ └── dimen.xml
│ │ └── values
│ │ ├── dimen.xml
│ │ └── strings.xml
├── navigation
│ ├── .gitignore
│ ├── build.gradle
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── test
│ │ │ └── com
│ │ │ └── androidnavigation
│ │ │ ├── base
│ │ │ ├── Controller.java
│ │ │ └── NavigationController.java
│ │ │ └── fragment
│ │ │ ├── BackPressHandler.java
│ │ │ ├── BackPressListener.java
│ │ │ ├── BaseController.java
│ │ │ ├── BaseNavigationController.java
│ │ │ ├── FragmentInfo.java
│ │ │ └── NavigationController.java
│ │ └── res
│ │ └── layout
│ │ └── navigation_fragment.xml
└── recycler-adapter
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── simplecityapps
│ │ └── recycler_adapter
│ │ ├── adapter
│ │ ├── CompletionListUpdateCallback.java
│ │ ├── CompletionListUpdateCallbackAdapter.java
│ │ └── ViewModelAdapter.java
│ │ ├── model
│ │ ├── BaseViewModel.java
│ │ ├── ContentsComparator.java
│ │ └── ViewModel.java
│ │ └── recyclerview
│ │ ├── AttachStateViewHolder.java
│ │ ├── BaseViewHolder.java
│ │ ├── ChildAttachStateChangeListener.java
│ │ ├── RecyclerListener.java
│ │ ├── RecyclingViewHolder.java
│ │ └── SpanSizeLookup.java
│ └── res
│ └── values
│ └── strings.xml
├── public.properties
├── secrets.tar.enc
├── settings.gradle
├── shuttle.jks
└── shuttle_code_style.xml
/.github/ISSUE_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | **Shuttle version:**
2 |
3 | v1.x.x
4 |
5 | **Device, OS:**
6 |
7 | Device info here
8 |
9 | **Description of bug:**
10 |
11 | Bug description here
12 |
13 | **Steps to reproduce:**
14 |
15 | 1. Step 1
16 | 2. Step 2
17 | 3. Step 3
18 |
19 | **Expected outcome:**
20 |
21 | Expected outcome here
22 |
23 | **Observations/Actual Result:**
24 |
25 | Observations here
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.travis/run_on_non_pull_requests:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | # Decrypt private keys
6 |
7 | openssl aes-256-cbc -K $encrypted_7fcb240c82db_key -iv $encrypted_7fcb240c82db_iv -in secrets.tar.enc -out secrets.tar -d
8 |
9 | tar xvf secrets.tar
10 |
11 | # For non pull-requests, build & test everything.
12 |
13 | ./gradlew --no-daemon -parallel build
--------------------------------------------------------------------------------
/.travis/run_on_pull_requests:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | # For pull requests, just assemble & test the debug build
6 | ./gradlew --no-daemon -parallel assembleDebug testDebugUnitTest
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/libs/jaudiotagger-2.0.4-SNAPSHOT.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/libs/jaudiotagger-2.0.4-SNAPSHOT.jar
--------------------------------------------------------------------------------
/app/src/debug/res/drawable-xxxhdpi/ic_ribbon_debug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/debug/res/drawable-xxxhdpi/ic_ribbon_debug.png
--------------------------------------------------------------------------------
/app/src/debug/res/drawable/ic_launcher_foreground_layer.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/free/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/free/res/values/donottranslate.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Shuttle
4 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwttl8JuSAiBOqu830SuzlOKJCzVoY9D9/A5ruazvGuR/dXiIW2H1NOnejzWhCEm+QizheRLincy5Ijd0m18SdUjEfvvPCsosjyFjotvG+aD3w1VCeMvC8QRSir/SNqSwHCJtClPY+GOuVvO2URD9Bt/FhrdbefJjEQFUC6lGIFg/jcSntVZCLIWP2ufETazJn/6xCjdgH5h86MDZHZl4WjnKd0EWOMEYKfXjgu3JpeAl3EE3dOPrMu6TSX+u/e1uyKe8Mz7DsXV/DVT6q6VES8+DbzGGAJe9RHvVReX9M72svQFn0NkGNp+tLKVcluGsdpP7WE0A81OgfHll+Af8gQIDAQAB
5 |
--------------------------------------------------------------------------------
/app/src/main/assets/web/styles.css:
--------------------------------------------------------------------------------
1 | * {
2 | font-family: 'Helvetica', sans-serif;
3 | color: #333333;
4 | }
5 |
6 | body
7 | {
8 | padding-top: 0px;
9 | padding-right: 16px;
10 | padding-bottom: 0px;
11 | padding-left: 16px;
12 | margin: 0;
13 | background-color: transparent;
14 | line-height: 1.6em;
15 | }
16 |
17 | pre {
18 | width: 100%;
19 | padding: 16px;
20 | overflow: auto;
21 | font-size: 85%;
22 | line-height: 1.45;
23 | background-color: #f1f1f1;
24 | border-radius: 3px;
25 | }
--------------------------------------------------------------------------------
/app/src/main/assets/web/styles_dark.css:
--------------------------------------------------------------------------------
1 | * {
2 | font-family: 'Helvetica', sans-serif;
3 | color: #ffffff;
4 | }
5 |
6 | body
7 | {
8 | padding-top: 0px;
9 | padding-right: 16px;
10 | padding-bottom: 0px;
11 | padding-left: 16px;
12 | margin: 0;
13 | background-color: transparent;
14 | line-height: 1.6em;
15 | }
16 |
17 | pre {
18 | width: 100%;
19 | padding: 16px;
20 | overflow: auto;
21 | font-size: 85%;
22 | line-height: 1.45;
23 | background-color: #202020;
24 | border-radius: 3px;
25 | }
26 |
27 | a:link {color: #B0D1F1; text-decoration: underline; }
28 | a:active {color: #ffffff; text-decoration: underline; }
29 | a:visited {color: #4575A5; text-decoration: underline; }
30 | a:hover {color: #6198BF; text-decoration: none; }
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/ic_launcher-web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/ic_launcher-web.png
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/cast/CastOptionsProvider.java:
--------------------------------------------------------------------------------
1 |
2 | package com.simplecity.amp_library.cast;
3 |
4 | import android.content.Context;
5 | import com.google.android.gms.cast.framework.CastOptions;
6 | import com.google.android.gms.cast.framework.OptionsProvider;
7 | import com.google.android.gms.cast.framework.SessionProvider;
8 | import com.simplecity.amp_library.constants.Config;
9 | import java.util.List;
10 |
11 | /**
12 | * Specify receiver application ID for cast
13 | */
14 | public class CastOptionsProvider implements OptionsProvider {
15 |
16 | @Override
17 | public CastOptions getCastOptions(Context context) {
18 | return new CastOptions.Builder()
19 | .setReceiverApplicationId(Config.CHROMECAST_APP_ID)
20 | .build();
21 | }
22 |
23 | @Override
24 | public List getAdditionalSessionProviders(Context context) {
25 | return null;
26 | }
27 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/constants/Config.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.constants;
2 |
3 | public final class Config {
4 |
5 | /* This class is never initialized */
6 | private Config() {
7 | }
8 |
9 | public static final String ID = "id";
10 |
11 | public static final String NAME = "name";
12 |
13 | public static final String PACKAGE_NAME_FREE = "another.music.player";
14 | public static final String PACKAGE_NAME_PRO = "com.simplecity.amp_pro";
15 |
16 | public static final String CHROMECAST_APP_ID = "73341C53";
17 |
18 | // IAP
19 | public static final String SKU_PREMIUM = "id_upgrade_to_pro";
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/di/app/AppAssistedModule.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.di.app
2 |
3 | import com.squareup.inject.assisted.dagger2.AssistedModule
4 | import dagger.Module
5 |
6 | @AssistedModule
7 | @Module(includes = [AssistedInject_AppAssistedModule::class])
8 | abstract class AppAssistedModule
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/di/app/AppComponent.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.di.app
2 |
3 | import com.simplecity.amp_library.ShuttleApplication
4 | import dagger.Component
5 | import dagger.android.AndroidInjector
6 | import dagger.android.support.AndroidSupportInjectionModule
7 | import javax.inject.Singleton
8 |
9 | @Singleton
10 | @Component(
11 | modules = [
12 | AndroidSupportInjectionModule::class,
13 | AppModule::class,
14 | AppAssistedModule::class,
15 | RepositoryModule::class
16 | ]
17 | )
18 | interface AppComponent : AndroidInjector {
19 | @Component.Builder
20 | abstract class Builder : AndroidInjector.Builder()
21 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/di/app/activity/ActivityModule.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.di.app.activity
2 |
3 | import android.app.Activity
4 | import android.support.v4.app.FragmentManager
5 | import android.support.v7.app.AppCompatActivity
6 | import dagger.Module
7 | import dagger.Provides
8 |
9 | @Module
10 | class ActivityModule {
11 |
12 | @Provides
13 | @ActivityScope
14 | fun activity(activity: AppCompatActivity): Activity {
15 | return activity
16 | }
17 |
18 | @Provides
19 | @ActivityScope
20 | fun fragmentManager(activity: AppCompatActivity): FragmentManager {
21 | return activity.supportFragmentManager
22 | }
23 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/di/app/activity/ActivityScope.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.di.app.activity
2 |
3 | import javax.inject.Scope
4 | import kotlin.annotation.AnnotationRetention.RUNTIME
5 |
6 | @Scope
7 | @Retention(RUNTIME)
8 | annotation class ActivityScope
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/di/app/activity/fragment/DialogFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.di.app.activity.fragment;
2 |
3 | import android.support.v4.app.DialogFragment;
4 | import dagger.Binds;
5 | import dagger.Module;
6 | import javax.inject.Named;
7 |
8 | @Module
9 | public abstract class DialogFragmentModule {
10 |
11 | @Binds
12 | @Named(FragmentModule.FRAGMENT)
13 | @FragmentScope
14 | abstract DialogFragment fragment(DialogFragment dialogFragment);
15 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/di/app/activity/fragment/FragmentModule.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.di.app.activity.fragment
2 |
3 | import android.support.v4.app.Fragment
4 | import com.bumptech.glide.Glide
5 | import com.bumptech.glide.RequestManager
6 | import dagger.Module
7 | import dagger.Provides
8 | import javax.inject.Named
9 |
10 | @Module
11 | class FragmentModule {
12 |
13 | @Provides
14 | @FragmentScope
15 | fun provideRequestManager(@Named(FRAGMENT) fragment: Fragment): RequestManager {
16 | return Glide.with(fragment)
17 | }
18 |
19 | companion object {
20 | const val FRAGMENT = "FragmentModule.fragment"
21 | }
22 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/di/app/activity/fragment/FragmentScope.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.di.app.activity.fragment
2 |
3 | import javax.inject.Scope
4 |
5 | @Scope
6 | @Retention(AnnotationRetention.RUNTIME)
7 | annotation class FragmentScope
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/glide/fetcher/FolderFetcher.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.glide.fetcher;
2 |
3 | import com.simplecity.amp_library.model.ArtworkProvider;
4 | import com.simplecity.amp_library.utils.ArtworkUtils;
5 | import java.io.File;
6 | import java.io.InputStream;
7 |
8 | class FolderFetcher extends BaseFetcher {
9 |
10 | private static final String TAG = "FolderFetcher";
11 |
12 | private File file;
13 |
14 | FolderFetcher(ArtworkProvider artworkProvider, File file) {
15 | super(artworkProvider);
16 | this.file = file;
17 | }
18 |
19 | @Override
20 | protected String getTag() {
21 | return TAG;
22 | }
23 |
24 | @Override
25 | protected InputStream getStream() {
26 |
27 | if (file == null) {
28 | return artworkProvider.getFolderArtwork();
29 | }
30 |
31 | return ArtworkUtils.getFileArtwork(file);
32 | }
33 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/glide/fetcher/MediaStoreFetcher.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.glide.fetcher;
2 |
3 | import android.content.Context;
4 | import com.simplecity.amp_library.model.ArtworkProvider;
5 | import java.io.InputStream;
6 |
7 | public class MediaStoreFetcher extends BaseFetcher {
8 |
9 | String TAG = "MediaStoreFetcher";
10 |
11 | private Context applicationContext;
12 |
13 | public MediaStoreFetcher(Context context, ArtworkProvider artworkProvider) {
14 | super(artworkProvider);
15 | applicationContext = context.getApplicationContext();
16 | }
17 |
18 | @Override
19 | protected String getTag() {
20 | return TAG;
21 | }
22 |
23 | @Override
24 | protected InputStream getStream() {
25 | return artworkProvider.getMediaStoreArtwork(applicationContext);
26 | }
27 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/glide/fetcher/RemoteFetcher.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.glide.fetcher;
2 |
3 | import com.bumptech.glide.load.data.HttpUrlFetcher;
4 | import com.bumptech.glide.load.model.GlideUrl;
5 | import com.simplecity.amp_library.model.ArtworkProvider;
6 |
7 | public class RemoteFetcher extends HttpUrlFetcher {
8 |
9 | String TAG = "RemoteFetcher";
10 |
11 | public RemoteFetcher(ArtworkProvider artworkProvider) {
12 | super(new GlideUrl(artworkProvider.getRemoteArtworkUrl()));
13 | }
14 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/glide/fetcher/TagFetcher.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.glide.fetcher;
2 |
3 | import com.simplecity.amp_library.model.ArtworkProvider;
4 | import java.io.InputStream;
5 |
6 | public class TagFetcher extends BaseFetcher {
7 |
8 | String TAG = "TagFetcher";
9 |
10 | public TagFetcher(ArtworkProvider artworkProvider) {
11 | super(artworkProvider);
12 | }
13 |
14 | @Override
15 | protected String getTag() {
16 | return TAG;
17 | }
18 |
19 | @Override
20 | protected InputStream getStream() {
21 | return artworkProvider.getTagArtwork();
22 | }
23 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/glide/palette/ColorSetResource.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.glide.palette;
2 |
3 | import android.support.annotation.NonNull;
4 | import com.bumptech.glide.load.engine.Resource;
5 |
6 | public class ColorSetResource implements Resource {
7 | private final ColorSet colorSet;
8 |
9 | public ColorSetResource(@NonNull ColorSet colorSet) {
10 | this.colorSet = colorSet;
11 | }
12 |
13 | @Override
14 | public ColorSet get() {
15 | return colorSet;
16 | }
17 |
18 | @Override
19 | public int getSize() {
20 | return ColorSet.Companion.estimatedSize();
21 | }
22 |
23 | @Override
24 | public void recycle() {
25 |
26 | }
27 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/glide/palette/ColorSetTranscoder.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.glide.palette;
2 |
3 | import android.content.Context;
4 | import android.graphics.Bitmap;
5 | import com.bumptech.glide.load.engine.Resource;
6 | import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
7 |
8 | public class ColorSetTranscoder implements ResourceTranscoder {
9 |
10 | private Context context;
11 |
12 | public ColorSetTranscoder(Context context) {
13 | this.context = context;
14 | }
15 |
16 | @Override
17 | public Resource transcode(Resource toTranscode) {
18 | Bitmap bitmap = toTranscode.get();
19 |
20 | return new ColorSetResource(ColorSet.Companion.fromBitmap(context, bitmap));
21 | }
22 |
23 | @Override
24 | public String getId() {
25 | return ColorSetTranscoder.class.getName();
26 | }
27 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/glide/utils/CustomGlideModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.glide.utils;
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.simplecity.amp_library.glide.loader.ArtworkModelLoader;
8 | import com.simplecity.amp_library.model.ArtworkProvider;
9 | import java.io.InputStream;
10 |
11 | public class CustomGlideModule implements GlideModule {
12 |
13 | public CustomGlideModule() {
14 |
15 | }
16 |
17 | @Override
18 | public void applyOptions(Context context, GlideBuilder builder) {
19 |
20 | }
21 |
22 | @Override
23 | public void registerComponents(Context context, Glide glide) {
24 | glide.register(ArtworkProvider.class, InputStream.class, new ArtworkModelLoader.Factory());
25 | }
26 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/glide/utils/WrappingViewAdapter.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.glide.utils;
2 |
3 | import android.graphics.drawable.Drawable;
4 | import android.support.annotation.NonNull;
5 | import android.view.View;
6 | import com.bumptech.glide.request.animation.GlideAnimation.ViewAdapter;
7 |
8 | public class WrappingViewAdapter implements ViewAdapter {
9 | protected final ViewAdapter adapter;
10 |
11 | public WrappingViewAdapter(@NonNull ViewAdapter adapter) {
12 | this.adapter = adapter;
13 | }
14 |
15 | @Override
16 | public View getView() {
17 | return adapter.getView();
18 | }
19 |
20 | @Override
21 | public Drawable getCurrentDrawable() {
22 | return adapter.getCurrentDrawable();
23 | }
24 |
25 | @Override
26 | public void setDrawable(Drawable drawable) {
27 | adapter.setDrawable(drawable);
28 | }
29 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/http/lastfm/LastFmAlbum.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.http.lastfm;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 | import java.util.ArrayList;
5 | import java.util.List;
6 |
7 | @SuppressWarnings("WeakerAccess")
8 | public class LastFmAlbum implements LastFmResult {
9 |
10 | @SerializedName("album")
11 | public Album album;
12 |
13 | public static class Album {
14 | public String name;
15 | @SerializedName("image")
16 | public List images = new ArrayList<>();
17 | public Wiki wiki;
18 | }
19 |
20 | @Override
21 | public String getImageUrl() {
22 | if (album != null) {
23 | return LastFmUtils.getBestImageUrl(album.images);
24 | } else {
25 | return null;
26 | }
27 | }
28 |
29 | public static class Wiki {
30 | public String summary;
31 | }
32 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/http/lastfm/LastFmImage.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.http.lastfm;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 |
5 | @SuppressWarnings("WeakerAccess")
6 | public class LastFmImage {
7 |
8 | @SerializedName("#text")
9 | public String url;
10 |
11 | public String size;
12 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/http/lastfm/LastFmResult.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.http.lastfm;
2 |
3 | public interface LastFmResult {
4 |
5 | String getImageUrl();
6 | }
7 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/http/lastfm/LastFmTrack.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.http.lastfm;
2 |
3 | import com.google.gson.annotations.SerializedName;
4 | import java.util.ArrayList;
5 | import java.util.List;
6 |
7 | @SuppressWarnings("WeakerAccess")
8 | class LastFmTrack implements LastFmResult {
9 |
10 | @SerializedName("track")
11 | public Track track;
12 |
13 | public static class Track {
14 | @SerializedName("album")
15 | public TrackAlbum album;
16 |
17 | public static class TrackAlbum {
18 |
19 | @SerializedName("album")
20 | public TrackAlbum album;
21 |
22 | @SerializedName("image")
23 | public List images = new ArrayList<>();
24 | }
25 | }
26 |
27 | @Override
28 | public String getImageUrl() {
29 | return LastFmUtils.getBestImageUrl(track.album.images);
30 | }
31 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/interfaces/Breadcrumb.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.interfaces;
2 |
3 | /**
4 | * An interface that defines the breadcrumb operations
5 | */
6 | public interface Breadcrumb {
7 |
8 | /**
9 | * Changes the path of the breadcrumb
10 | *
11 | * @param newPath The new path
12 | */
13 | void changeBreadcrumbPath(final String newPath);
14 |
15 | /**
16 | * Adds a new breadcrumb listener.
17 | *
18 | * @param listener The breadcrumb listener to add
19 | */
20 | void addBreadcrumbListener(BreadcrumbListener listener);
21 |
22 | /**
23 | * Sdds an active breadcrumb listener.
24 | *
25 | * @param listener The breadcrumb listener to remove
26 | */
27 | void removeBreadcrumbListener(BreadcrumbListener listener);
28 |
29 | void setTextColor(int textColor);
30 | }
31 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/interfaces/BreadcrumbListener.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.interfaces;
2 |
3 | import com.simplecity.amp_library.ui.views.BreadcrumbItem;
4 |
5 | /**
6 | * Interface with events from a breadcrumb
7 | */
8 | public interface BreadcrumbListener {
9 | /**
10 | * This method is called when a breadcrumb item is clicked
11 | *
12 | * @param item The breadcrumb item click
13 | */
14 | void onBreadcrumbItemClick(BreadcrumbItem item);
15 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/interfaces/FileType.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.interfaces;
2 |
3 | import android.support.annotation.IntDef;
4 |
5 | @IntDef({ FileType.PARENT, FileType.FOLDER, FileType.FILE })
6 | public @interface FileType {
7 | int PARENT = 0;
8 | int FOLDER = 1;
9 | int FILE = 2;
10 | }
11 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/model/ArtworkProvider.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.model;
2 |
3 | import android.content.Context;
4 | import android.support.annotation.NonNull;
5 | import android.support.annotation.Nullable;
6 | import java.io.File;
7 | import java.io.InputStream;
8 | import java.util.List;
9 |
10 | public interface ArtworkProvider {
11 |
12 | @interface Type {
13 | int MEDIA_STORE = 0;
14 | int TAG = 1;
15 | int FOLDER = 2;
16 | int REMOTE = 3;
17 | }
18 |
19 | @NonNull
20 | String getArtworkKey();
21 |
22 | @Nullable
23 | String getRemoteArtworkUrl();
24 |
25 | @Nullable
26 | InputStream getMediaStoreArtwork(Context context);
27 |
28 | @Nullable
29 | InputStream getFolderArtwork();
30 |
31 | @Nullable
32 | InputStream getTagArtwork();
33 |
34 | @Nullable
35 | List getFolderArtworkFiles();
36 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/model/FolderObject.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.model;
2 |
3 | import com.simplecity.amp_library.interfaces.FileType;
4 |
5 | public class FolderObject extends BaseFileObject {
6 |
7 | public int fileCount;
8 | public int folderCount;
9 |
10 | public FolderObject() {
11 | this.fileType = FileType.FOLDER;
12 | }
13 |
14 | @Override
15 | public String toString() {
16 | return "FolderObject{" +
17 | "fileCount=" + fileCount +
18 | ", folderCount=" + folderCount +
19 | "} " + super.toString();
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/model/Header.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.model;
2 |
3 | import java.io.Serializable;
4 |
5 | public class Header implements Serializable {
6 |
7 | public String title;
8 |
9 | public Header(String title) {
10 | this.title = title;
11 | }
12 |
13 | @Override
14 | public boolean equals(Object o) {
15 | if (this == o) return true;
16 | if (o == null || getClass() != o.getClass()) return false;
17 |
18 | Header header = (Header) o;
19 |
20 | return title != null ? title.equals(header.title) : header.title == null;
21 | }
22 |
23 | @Override
24 | public int hashCode() {
25 | return title != null ? title.hashCode() : 0;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/model/Sortable.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.model;
2 |
3 | /**
4 | * An interface used to define sorting keys used for object comparison
5 | */
6 | public interface Sortable {
7 |
8 | String getSortKey();
9 |
10 | void setSortKey();
11 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/model/UserSelectedArtwork.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.model;
2 |
3 | public class UserSelectedArtwork {
4 |
5 | @ArtworkProvider.Type
6 | public int type;
7 | public String path;
8 |
9 | public UserSelectedArtwork(@ArtworkProvider.Type int type, String path) {
10 | this.type = type;
11 | this.path = path;
12 | }
13 |
14 | @Override
15 | public String toString() {
16 | return "UserSelectedArtwork{" +
17 | "type=" + type +
18 | ", path='" + path + '\'' +
19 | '}';
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/playback/LocalBinder.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.playback;
2 |
3 | import android.os.Binder;
4 | import java.lang.ref.WeakReference;
5 |
6 | /**
7 | * Class used for the client Binder. Because we know this service always
8 | * runs in the same process as its clients, we don't need to deal with IPC.
9 | */
10 | public class LocalBinder extends Binder {
11 |
12 | private WeakReference weakReference;
13 |
14 | public LocalBinder(MusicService musicService) {
15 | weakReference = new WeakReference<>(musicService);
16 | }
17 |
18 | public MusicService getService() {
19 | // Return this instance of MusicService so clients can call public methods
20 | return weakReference.get();
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/playback/constants/ExternalIntents.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.playback.constants;
2 |
3 | public interface ExternalIntents {
4 |
5 | String PLAY_STATUS_REQUEST = "com.android.music.playstatusrequest";
6 |
7 | String PLAY_STATUS_RESPONSE = "com.android.music.playstatusresponse";
8 |
9 | String AVRCP_PLAY_STATE_CHANGED = "com.android.music.playstatechanged";
10 |
11 | String AVRCP_META_CHANGED = "com.android.music.metachanged";
12 |
13 | String TASKER = "net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS";
14 |
15 | String SCROBBLER = "com.adam.aslfms.notify.playstatechanged";
16 |
17 | String PEBBLE = "com.getpebble.action.NOW_PLAYING";
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/playback/constants/InternalIntents.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.playback.constants;
2 |
3 | public interface InternalIntents {
4 | String INTERNAL_INTENT_PREFIX = "com.simplecity.shuttle";
5 | String PLAY_STATE_CHANGED = INTERNAL_INTENT_PREFIX + ".playstatechanged";
6 | String POSITION_CHANGED = INTERNAL_INTENT_PREFIX + ".positionchanged";
7 | String TRACK_ENDING = INTERNAL_INTENT_PREFIX + ".trackending";
8 | String META_CHANGED = INTERNAL_INTENT_PREFIX + ".metachanged";
9 | String QUEUE_CHANGED = INTERNAL_INTENT_PREFIX + ".queuechanged";
10 | String SHUFFLE_CHANGED = INTERNAL_INTENT_PREFIX + ".shufflechanged";
11 | String REPEAT_CHANGED = INTERNAL_INTENT_PREFIX + ".repeatchanged";
12 | String FAVORITE_CHANGED = INTERNAL_INTENT_PREFIX + ".favoritechanged";
13 | String SERVICE_CONNECTED = INTERNAL_INTENT_PREFIX + ".serviceconnected";
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/playback/constants/MediaButtonCommand.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.playback.constants;
2 |
3 | public interface MediaButtonCommand {
4 | String CMD_NAME = "command";
5 | String TOGGLE_PAUSE = "togglepause";
6 | String STOP = "stop";
7 | String PAUSE = "pause";
8 | String PLAY = "play";
9 | String PREVIOUS = "previous";
10 | String NEXT = "next";
11 | String TOGGLE_FAVORITE = "togglefavorite";
12 | String FROM_MEDIA_BUTTON = "frommediabutton";
13 |
14 | String FORCE_PREVIOUS = "force";
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/playback/constants/ServiceCommand.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.playback.constants;
2 |
3 | public interface ServiceCommand {
4 | String COMMAND = "com.simplecityapps.shuttle.service_command";
5 | String TOGGLE_PLAYBACK = COMMAND + ".toggle_playback";
6 | String PAUSE = COMMAND + ".pause";
7 | String PLAY = COMMAND + ".play";
8 | String PREV = COMMAND + ".prev";
9 | String NEXT = COMMAND + ".next";
10 | String STOP = COMMAND + ".stop";
11 | String SHUFFLE = COMMAND + ".shuffle";
12 | String REPEAT = COMMAND + ".repeat";
13 | String SHUTDOWN = COMMAND + ".shutdown";
14 | String TOGGLE_FAVORITE = COMMAND + ".toggle_favorite";
15 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/playback/constants/ShortcutCommands.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.playback.constants;
2 |
3 | public interface ShortcutCommands {
4 | String PLAY = "com.simplecity.amp_library.shortcuts.PLAY";
5 | String SHUFFLE_ALL = "com.simplecity.amp_library.shortcuts.SHUFFLE";
6 | String FOLDERS = "com.simplecity.amp_library.shortcuts.FOLDERS";
7 | String PLAYLIST = "com.simplecity.amp_library.shortcuts.PLAYLIST";
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/rx/UnsafeAction.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.rx;
2 |
3 | import io.reactivex.functions.Action;
4 |
5 | /**
6 | * An Action which does not throw on error.
7 | */
8 | public interface UnsafeAction extends Action {
9 |
10 | @Override
11 | void run();
12 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/rx/UnsafeCallable.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.rx;
2 |
3 | import java.util.concurrent.Callable;
4 |
5 | /**
6 | * A callable which does not throw on error.
7 | */
8 | public interface UnsafeCallable extends Callable {
9 |
10 | @Override
11 | T call();
12 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/rx/UnsafeConsumer.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.rx;
2 |
3 | import io.reactivex.functions.Consumer;
4 |
5 | /**
6 | * A Consumer which does not throw on error.
7 | */
8 | public interface UnsafeConsumer extends Consumer {
9 |
10 | @Override
11 | void accept(T t);
12 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/adapters/SectionedAdapter.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.adapters;
2 |
3 | import android.support.annotation.NonNull;
4 | import com.simplecity.amp_library.ui.modelviews.SectionedView;
5 | import com.simplecityapps.recycler_adapter.adapter.ViewModelAdapter;
6 | import com.simplecityapps.recycler_adapter.model.ViewModel;
7 | import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
8 |
9 | public class SectionedAdapter extends ViewModelAdapter implements FastScrollRecyclerView.SectionedAdapter {
10 |
11 | @NonNull
12 | @Override
13 | public String getSectionName(int position) {
14 |
15 | ViewModel viewModel = items.get(position);
16 |
17 | if (viewModel instanceof SectionedView) {
18 | return ((SectionedView) viewModel).getSectionName();
19 | }
20 |
21 | return "";
22 | }
23 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/common/BaseFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.common;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class BaseFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(BaseFragment baseFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/common/EqualizerModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.common;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import com.simplecity.amp_library.ui.screens.equalizer.EqualizerFragment;
7 | import dagger.Binds;
8 | import dagger.Module;
9 | import javax.inject.Named;
10 |
11 | @Module(includes = FragmentModule.class)
12 | public abstract class EqualizerModule {
13 |
14 | @Binds
15 | @Named(FragmentModule.FRAGMENT)
16 | @FragmentScope
17 | abstract Fragment fragment(EqualizerFragment equalizerFragment);
18 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/common/PurchasePresenter.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.common;
2 |
3 | import com.simplecity.amp_library.ui.common.Presenter;
4 | import com.simplecity.amp_library.ui.views.PurchaseView;
5 |
6 | public class PurchasePresenter extends Presenter {
7 |
8 | public void upgradeClicked() {
9 | PurchaseView purchaseView = getView();
10 | if (purchaseView != null) {
11 | purchaseView.showUpgradeDialog();
12 | }
13 | }
14 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/common/RequestManagerProvider.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.common;
2 |
3 | import com.bumptech.glide.RequestManager;
4 |
5 | public interface RequestManagerProvider {
6 |
7 | RequestManager getRequestManager();
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/common/ToolbarListener.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.common;
2 |
3 | import android.support.v7.widget.Toolbar;
4 |
5 | //Todo: Better name
6 | public interface ToolbarListener {
7 | void toolbarAttached(Toolbar toolbar);
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/common/TransitionListenerAdapter.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.common;
2 |
3 | import android.annotation.TargetApi;
4 | import android.os.Build;
5 | import android.transition.Transition;
6 |
7 | @TargetApi(Build.VERSION_CODES.KITKAT)
8 | public abstract class TransitionListenerAdapter implements Transition.TransitionListener {
9 |
10 | @Override
11 | public void onTransitionStart(Transition transition) {
12 |
13 | }
14 |
15 | @Override
16 | public void onTransitionEnd(Transition transition) {
17 |
18 | }
19 |
20 | @Override
21 | public void onTransitionCancel(Transition transition) {
22 |
23 | }
24 |
25 | @Override
26 | public void onTransitionPause(Transition transition) {
27 |
28 | }
29 |
30 | @Override
31 | public void onTransitionResume(Transition transition) {
32 |
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/modelviews/HorizontalAlbumView.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.modelviews;
2 |
3 | import com.bumptech.glide.RequestManager;
4 | import com.simplecity.amp_library.R;
5 | import com.simplecity.amp_library.model.Album;
6 | import com.simplecity.amp_library.ui.adapters.ViewType;
7 | import com.simplecity.amp_library.utils.SettingsManager;
8 | import com.simplecity.amp_library.utils.sorting.SortManager;
9 |
10 | public class HorizontalAlbumView extends AlbumView {
11 |
12 | public HorizontalAlbumView(Album album, RequestManager requestManager, SortManager sortManager, SettingsManager settingsManager) {
13 | super(album, ViewType.ALBUM_CARD, requestManager, sortManager, settingsManager);
14 | }
15 |
16 | @Override
17 | public int getLayoutResId() {
18 | return R.layout.grid_item_horizontal;
19 | }
20 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/modelviews/SectionedView.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.modelviews;
2 |
3 | public interface SectionedView {
4 |
5 | String getSectionName();
6 | }
7 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/modelviews/SelectableViewModel.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.modelviews;
2 |
3 | public interface SelectableViewModel {
4 |
5 | void setSelected(boolean selected);
6 |
7 | boolean isSelected();
8 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/album/detail/AlbumDetailView.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.album.detail
2 |
3 | import com.simplecity.amp_library.model.Song
4 | import com.simplecity.amp_library.ui.screens.album.menu.AlbumMenuContract
5 | import com.simplecity.amp_library.ui.screens.songs.menu.SongMenuContract
6 |
7 | interface AlbumDetailView :
8 | SongMenuContract.View,
9 | AlbumMenuContract.View {
10 | fun setData(data: MutableList)
11 |
12 | fun closeContextualToolbar()
13 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/album/detail/AlbumsDetailFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.album.detail;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = { FragmentModule.class })
11 | public abstract class AlbumsDetailFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(AlbumDetailFragment albumDetailFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/album/list/AlbumListContract.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.album.list
2 |
3 | import com.simplecity.amp_library.model.Album
4 | import com.simplecity.amp_library.ui.screens.album.menu.AlbumMenuContract
5 |
6 | interface AlbumListContract {
7 |
8 | interface View : AlbumMenuContract.View {
9 |
10 | fun setData(albums: List, scrollToTop: Boolean = false)
11 |
12 | fun invalidateOptionsMenu()
13 | }
14 |
15 | interface Presenter {
16 |
17 | fun loadAlbums(scrollToTop: Boolean)
18 |
19 | fun setAlbumsSortOrder(order: Int)
20 |
21 | fun setAlbumsAscending(ascending: Boolean)
22 | }
23 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/album/list/AlbumListFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.album.list;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class AlbumListFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(AlbumListFragment albumFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/artist/detail/ArtistDetailView.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.artist.detail
2 |
3 | import com.simplecity.amp_library.model.Album
4 | import com.simplecity.amp_library.model.Song
5 | import com.simplecity.amp_library.ui.screens.album.menu.AlbumArtistMenuContract
6 | import com.simplecity.amp_library.ui.screens.album.menu.AlbumMenuContract
7 | import com.simplecity.amp_library.ui.screens.songs.menu.SongMenuContract
8 |
9 | interface ArtistDetailView :
10 | SongMenuContract.View,
11 | AlbumMenuContract.View,
12 | AlbumArtistMenuContract.View {
13 |
14 | fun setData(albums: List, songs: List)
15 |
16 | fun closeContextualToolbar()
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/artist/detail/ArtistsDetailFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.artist.detail;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = { FragmentModule.class })
11 | public abstract class ArtistsDetailFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(ArtistDetailFragment artistDetailFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/artist/list/AlbumArtistListContract.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.artist.list
2 |
3 | import com.simplecity.amp_library.model.AlbumArtist
4 | import com.simplecity.amp_library.ui.screens.album.menu.AlbumArtistMenuContract
5 |
6 | interface AlbumArtistListContract {
7 |
8 | interface View : AlbumArtistMenuContract.View {
9 |
10 | fun setData(albumArtists: List, scrollToTop: Boolean = false)
11 |
12 | fun invalidateOptionsMenu()
13 | }
14 |
15 | interface Presenter {
16 |
17 | fun loadAlbumArtists(scrollToTop: Boolean)
18 |
19 | fun setAlbumArtistsSortOrder(order: Int)
20 |
21 | fun setAlbumArtistsAscending(ascending: Boolean)
22 | }
23 |
24 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/artist/list/AlbumArtistListFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.artist.list;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class AlbumArtistListFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(AlbumArtistListFragment artistFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/drawer/DrawerDivider.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.drawer;
2 |
3 | import android.support.annotation.NonNull;
4 | import android.view.View;
5 | import com.bignerdranch.expandablerecyclerview.ParentViewHolder;
6 | import com.bignerdranch.expandablerecyclerview.model.Parent;
7 | import java.util.Collections;
8 | import java.util.List;
9 |
10 | public class DrawerDivider implements Parent {
11 |
12 | @Override
13 | public List getChildList() {
14 | return Collections.emptyList();
15 | }
16 |
17 | @Override
18 | public boolean isInitiallyExpanded() {
19 | return false;
20 | }
21 |
22 | public void bindView() {
23 |
24 | }
25 |
26 | static class DividerHolder extends ParentViewHolder {
27 |
28 | DividerHolder(@NonNull View itemView) {
29 | super(itemView);
30 | }
31 | }
32 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/drawer/DrawerFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.drawer;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class DrawerFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(DrawerFragment drawerFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/drawer/DrawerLockController.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.drawer;
2 |
3 | public interface DrawerLockController {
4 |
5 | void lockDrawer();
6 |
7 | void unlockDrawer();
8 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/drawer/DrawerProvider.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.drawer;
2 |
3 | import android.support.v4.widget.DrawerLayout;
4 |
5 | public interface DrawerProvider {
6 |
7 | DrawerLayout getDrawerLayout();
8 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/drawer/DrawerView.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.drawer
2 |
3 | import com.simplecity.amp_library.model.Playlist
4 | import com.simplecity.amp_library.ui.screens.playlist.menu.PlaylistMenuContract
5 | import com.simplecity.amp_library.ui.views.PurchaseView
6 |
7 | interface DrawerView :
8 | PurchaseView,
9 | PlaylistMenuContract.View {
10 |
11 | fun setPlaylistItems(playlists: List)
12 |
13 | fun closeDrawer()
14 |
15 | fun setDrawerItemSelected(@DrawerParent.Type type: Int)
16 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/equalizer/EqualizerModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.equalizer;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class EqualizerModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(EqualizerFragment equalizerFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/folders/FolderFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.folders;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class FolderFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(FolderFragment folderFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/genre/detail/GenreDetailFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.genre.detail;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class GenreDetailFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(GenreDetailFragment genreDetailFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/genre/detail/GenreDetailView.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.genre.detail
2 |
3 | import com.simplecity.amp_library.model.Album
4 | import com.simplecity.amp_library.model.Song
5 | import com.simplecity.amp_library.ui.screens.album.menu.AlbumMenuContract
6 | import com.simplecity.amp_library.ui.screens.genre.menu.GenreMenuContract
7 | import com.simplecity.amp_library.ui.screens.songs.menu.SongMenuContract
8 |
9 | interface GenreDetailView :
10 | GenreMenuContract.View,
11 | SongMenuContract.View,
12 | AlbumMenuContract.View {
13 |
14 | fun setData(albums: List, songs: List)
15 |
16 | fun closeContextualToolbar()
17 |
18 | fun fadeInSlideShowAlbum(previousAlbum: Album?, newAlbum: Album)
19 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/genre/list/GenreListContract.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.genre.list
2 |
3 | import com.simplecity.amp_library.model.Genre
4 | import com.simplecity.amp_library.ui.screens.genre.menu.GenreMenuContract
5 |
6 | interface GenreListContract {
7 |
8 | interface View : GenreMenuContract.View {
9 |
10 | fun setData(genres: List)
11 | }
12 |
13 | interface Presenter {
14 |
15 | fun loadGenres()
16 | }
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/genre/list/GenreListFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.genre.list;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class GenreListFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(GenreListFragment genreListFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/genre/menu/GenreMenuContract.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.genre.menu
2 |
3 | import com.simplecity.amp_library.model.Playlist
4 | import com.simplecity.amp_library.model.Song
5 | import com.simplecity.amp_library.utils.menu.genre.GenreMenuCallbacks
6 |
7 | interface GenreMenuContract {
8 |
9 | interface View {
10 |
11 | fun presentCreatePlaylistDialog(songs: List)
12 |
13 | fun onSongsAddedToPlaylist(playlist: Playlist, numSongs: Int)
14 |
15 | fun onSongsAddedToQueue(numSongs: Int)
16 |
17 | fun onPlaybackFailed()
18 | }
19 |
20 | interface Presenter : GenreMenuCallbacks
21 |
22 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/lyrics/LyricsView.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.lyrics
2 |
3 | import com.simplecity.amp_library.model.Song
4 |
5 | interface LyricsView {
6 |
7 | fun updateLyrics(lyrics: String?)
8 |
9 | fun showNoLyricsView(show: Boolean)
10 |
11 | fun showQuickLyricInfoButton(show: Boolean)
12 |
13 | fun showQuickLyricInfoDialog()
14 |
15 | fun downloadQuickLyric()
16 |
17 | fun launchQuickLyric(song: Song)
18 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/main/LibraryFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.main;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class LibraryFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(LibraryController libraryController);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/main/MainControllerModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.main;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class MainControllerModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(MainController mainController);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/miniplayer/MiniPlayerFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.miniplayer;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class MiniPlayerFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(MiniPlayerFragment miniPlayerFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/nowplaying/PlayerFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.nowplaying;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class PlayerFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(PlayerFragment playerFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/playlist/detail/PlaylistDetailFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.playlist.detail;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class PlaylistDetailFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(PlaylistDetailFragment playlistDetailFragment);
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/playlist/detail/PlaylistDetailView.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.playlist.detail
2 |
3 | import com.simplecity.amp_library.model.Album
4 | import com.simplecity.amp_library.model.Song
5 | import com.simplecity.amp_library.ui.screens.playlist.menu.PlaylistMenuContract
6 | import com.simplecity.amp_library.ui.screens.songs.menu.SongMenuContract
7 |
8 | interface PlaylistDetailView :
9 | PlaylistMenuContract.View,
10 | SongMenuContract.View {
11 |
12 | fun setData(data: MutableList)
13 |
14 | fun closeContextualToolbar()
15 |
16 | fun fadeInSlideShowAlbum(previousAlbum: Album?, newAlbum: Album)
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/playlist/list/PlaylistListContract.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.playlist.list
2 |
3 | import com.simplecity.amp_library.model.Playlist
4 | import com.simplecity.amp_library.ui.screens.playlist.menu.PlaylistMenuContract
5 |
6 | interface PlaylistListContract {
7 |
8 | interface View : PlaylistMenuContract.View {
9 |
10 | fun setData(playlists: List)
11 | }
12 |
13 | interface Presenter {
14 |
15 | fun loadData()
16 | }
17 |
18 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/playlist/list/PlaylistListFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.playlist.list;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class PlaylistListFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(PlaylistListFragment playlistFragment);
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/playlist/menu/PlaylistMenuContract.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.playlist.menu
2 |
3 | import com.simplecity.amp_library.model.Playlist
4 | import com.simplecity.amp_library.utils.menu.playlist.PlaylistMenuCallbacks
5 |
6 | interface PlaylistMenuContract {
7 |
8 | interface View {
9 |
10 | fun onPlaybackFailed()
11 |
12 | fun onSongsAddedToQueue(numSongs: Int)
13 |
14 | fun presentEditDialog(playlist: Playlist)
15 |
16 | fun presentRenameDialog(playlist: Playlist)
17 |
18 | fun presentM3uDialog(playlist: Playlist)
19 |
20 | fun presentDeletePlaylistDialog(playlist: Playlist)
21 | }
22 |
23 | interface Presenter : PlaylistMenuCallbacks
24 |
25 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/queue/QueueFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.queue;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import com.simplecity.amp_library.ui.screens.nowplaying.PlayerFragment;
7 | import dagger.Binds;
8 | import dagger.Module;
9 | import javax.inject.Named;
10 |
11 | @Module(includes = FragmentModule.class)
12 | public abstract class QueueFragmentModule {
13 |
14 | @Binds
15 | @Named(FragmentModule.FRAGMENT)
16 | @FragmentScope
17 | abstract Fragment fragment(QueueFragment queueFragment);
18 | }
19 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/queue/menu/SongsMenuContract.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.queue.menu
2 |
3 | import com.simplecity.amp_library.ui.screens.songs.menu.SongMenuContract
4 | import com.simplecity.amp_library.utils.menu.queue.QueueMenuCallbacks
5 |
6 | interface QueueMenuContract : SongMenuContract {
7 |
8 | interface View : SongMenuContract.View {
9 |
10 | }
11 |
12 | interface Presenter : SongMenuContract.Presenter, QueueMenuCallbacks {
13 |
14 | }
15 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/queue/pager/QueuePagerFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.queue.pager;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class QueuePagerFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(QueuePagerFragment queuePagerFragment);
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/queue/pager/QueuePagerView.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.queue.pager;
2 |
3 | import com.simplecityapps.recycler_adapter.model.ViewModel;
4 | import java.util.List;
5 |
6 | public interface QueuePagerView {
7 |
8 | void loadData(List items, int position);
9 |
10 | void updateQueuePosition(int position);
11 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/search/SearchFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.search;
2 |
3 | import android.support.v4.app.Fragment;
4 |
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
6 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
7 |
8 | import javax.inject.Named;
9 |
10 | import dagger.Binds;
11 | import dagger.Module;
12 |
13 | @Module(includes = FragmentModule.class)
14 | public abstract class SearchFragmentModule {
15 |
16 | @Binds
17 | @Named(FragmentModule.FRAGMENT)
18 | @FragmentScope
19 | abstract Fragment fragment(SearchFragment searchFragment);
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/search/SearchResult.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.search
2 |
3 | import com.simplecity.amp_library.model.Album
4 | import com.simplecity.amp_library.model.AlbumArtist
5 | import com.simplecity.amp_library.model.Song
6 |
7 | class SearchResult(internal var albumArtists: List, internal var albums: List, internal var songs: List)
8 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/songs/list/SongListContract.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.songs.list
2 |
3 | import com.simplecity.amp_library.model.Song
4 | import com.simplecity.amp_library.ui.screens.songs.menu.SongMenuContract
5 |
6 | interface SongListContract {
7 |
8 | interface View: SongMenuContract.View {
9 |
10 | fun setData(songs: List, scrollToTop: Boolean = false)
11 |
12 | fun invalidateOptionsMenu()
13 |
14 | fun showPlaybackError()
15 | }
16 |
17 | interface Presenter {
18 |
19 | fun loadSongs(scrollToTop: Boolean = false)
20 |
21 | fun setSongsSortOrder(order: Int)
22 |
23 | fun setSongsAscending(ascending: Boolean)
24 |
25 | fun setShowArtwork(show: Boolean)
26 |
27 | fun play(song: Song)
28 |
29 | fun shuffleAll()
30 | }
31 |
32 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/songs/list/SongsListFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.songs.list;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class SongsListFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(SongListFragment songsFragment);
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/suggested/SuggestedContract.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.suggested
2 |
3 | import com.simplecity.amp_library.ui.screens.album.menu.AlbumMenuContract
4 | import com.simplecity.amp_library.ui.screens.songs.menu.SongMenuContract
5 | import com.simplecity.amp_library.ui.screens.suggested.SuggestedPresenter.SuggestedData
6 |
7 | interface SuggestedContract {
8 |
9 | interface Presenter {
10 |
11 | fun loadData()
12 |
13 | }
14 |
15 | interface View : AlbumMenuContract.View, SongMenuContract.View {
16 |
17 | fun setData(suggestedData: SuggestedData)
18 | }
19 |
20 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/screens/suggested/SuggestedFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.screens.suggested;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class SuggestedFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(SuggestedFragment suggestedFragment);
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/settings/SettingsFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.settings;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class SettingsFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(SettingsParentFragment.SettingsFragment settingsFragment);
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/settings/SettingsParentFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.settings;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import dagger.Binds;
7 | import dagger.Module;
8 | import javax.inject.Named;
9 |
10 | @Module(includes = FragmentModule.class)
11 | public abstract class SettingsParentFragmentModule {
12 |
13 | @Binds
14 | @Named(FragmentModule.FRAGMENT)
15 | @FragmentScope
16 | abstract Fragment fragment(SettingsParentFragment settingsParentFragment);
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/settings/SupportView.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.settings;
2 |
3 | import android.content.Intent;
4 |
5 | public interface SupportView {
6 |
7 | void setVersion(String version);
8 |
9 | void showFaq(Intent intent);
10 |
11 | void showHelp(Intent intent);
12 |
13 | void showRate(Intent intent);
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/views/ContextualToolbarHost.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.views;
2 |
3 | public interface ContextualToolbarHost {
4 |
5 | ContextualToolbar getContextualToolbar();
6 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/views/NonScrollImageButton.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.views;
2 |
3 | import android.content.Context;
4 | import android.graphics.Rect;
5 | import android.util.AttributeSet;
6 | import android.widget.ImageButton;
7 |
8 | /**
9 | * A custom {@link ImageButton} which prevents parent ScrollView scrolling when used as the
10 | * anchor for a {@link android.support.v7.widget.PopupMenu}
11 | */
12 | public class NonScrollImageButton extends android.support.v7.widget.AppCompatImageButton {
13 |
14 | public NonScrollImageButton(Context context, AttributeSet attrs) {
15 | super(context, attrs);
16 | }
17 |
18 | @Override
19 | public boolean requestRectangleOnScreen(Rect rectangle, boolean immediate) {
20 | return false;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/views/PagerListenerAdapter.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.views;
2 |
3 | import android.support.v4.view.ViewPager;
4 |
5 | public abstract class PagerListenerAdapter implements ViewPager.OnPageChangeListener {
6 |
7 | @Override
8 | public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
9 |
10 | }
11 |
12 | @Override
13 | public void onPageSelected(int position) {
14 |
15 | }
16 |
17 | @Override
18 | public void onPageScrollStateChanged(int state) {
19 |
20 | }
21 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/views/PurchaseView.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.views;
2 |
3 | public interface PurchaseView {
4 |
5 | void showUpgradeDialog();
6 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/views/SquareHeightImageView.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.views;
2 |
3 | import android.content.Context;
4 | import android.support.v7.widget.AppCompatImageView;
5 | import android.util.AttributeSet;
6 |
7 | public class SquareHeightImageView extends AppCompatImageView {
8 |
9 | public SquareHeightImageView(Context context, AttributeSet attrs) {
10 | super(context, attrs);
11 | }
12 |
13 | @Override
14 | public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
15 | super.onMeasure(heightMeasureSpec, heightMeasureSpec);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/views/SquareImageView.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.views;
2 |
3 | import android.content.Context;
4 | import android.support.v7.widget.AppCompatImageView;
5 | import android.util.AttributeSet;
6 |
7 | public class SquareImageView extends AppCompatImageView {
8 |
9 | public SquareImageView(Context context, AttributeSet attrs) {
10 | super(context, attrs);
11 | }
12 |
13 | @Override
14 | public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
15 | super.onMeasure(widthMeasureSpec, widthMeasureSpec);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/views/recyclerview/SpacesItemDecoration.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.views.recyclerview;
2 |
3 | import android.graphics.Rect;
4 | import android.support.v7.widget.RecyclerView;
5 | import android.view.View;
6 | import com.simplecity.amp_library.utils.ResourceUtils;
7 |
8 | public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
9 |
10 | private int space;
11 |
12 | public SpacesItemDecoration(int space) {
13 | this.space = ResourceUtils.toPixels(space);
14 | }
15 |
16 | @Override
17 | public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
18 |
19 | if (parent.getChildLayoutPosition(view) == 0) {
20 | outRect.left = 0;
21 | } else {
22 | outRect.left = space;
23 | }
24 | }
25 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/ui/widgets/WidgetFragmentModule.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.ui.widgets;
2 |
3 | import android.support.v4.app.Fragment;
4 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentModule;
5 | import com.simplecity.amp_library.di.app.activity.fragment.FragmentScope;
6 | import com.simplecity.amp_library.ui.screens.main.LibraryController;
7 | import com.simplecity.amp_library.ui.screens.widgets.WidgetFragment;
8 | import dagger.Binds;
9 | import dagger.Module;
10 | import javax.inject.Named;
11 |
12 | @Module(includes = FragmentModule.class)
13 | public abstract class WidgetFragmentModule {
14 |
15 | @Binds
16 | @Named(FragmentModule.FRAGMENT)
17 | @FragmentScope
18 | abstract Fragment fragment(WidgetFragment widgetFragment);
19 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/utils/AnimUtils.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.utils;
2 |
3 | public final class AnimUtils {
4 |
5 | public static float lerp(float a, float b, float v) {
6 | return a + (b - a) * v;
7 | }
8 |
9 | public static int lerp(int a, int b, int v) {
10 | return a + (b - a) * v;
11 | }
12 |
13 | public static double lerp(double a, double b, double v) {
14 | return a + (b - a) * v;
15 | }
16 |
17 | private AnimUtils() {
18 | throw new IllegalStateException("no instances");
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/utils/ColorUtils.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.utils;
2 |
3 | import android.graphics.Color;
4 |
5 | public class ColorUtils {
6 |
7 | private ColorUtils() {
8 |
9 | }
10 |
11 | public static int adjustAlpha(int color, float factor) {
12 | int alpha = Math.round(Color.alpha(color) * factor);
13 | int red = Color.red(color);
14 | int green = Color.green(color);
15 | int blue = Color.blue(color);
16 | return Color.argb(alpha, red, green, blue);
17 | }
18 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/utils/FragmentExt.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.utils
2 |
3 | import android.os.Bundle
4 | import android.support.v4.app.Fragment
5 |
6 | inline fun T.withArgs(
7 | argsBuilder: Bundle.() -> Unit
8 | ): T = this.apply { arguments = Bundle().apply(argsBuilder) }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/utils/ListUtils.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.utils;
2 |
3 | import java.util.List;
4 |
5 | import static java.util.Collections.emptyList;
6 |
7 | public final class ListUtils {
8 |
9 | public static List emptyIfNull(List data) {
10 | return data == null ? emptyList() : data;
11 | }
12 |
13 | private ListUtils() {
14 | throw new IllegalStateException("no instances");
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/utils/ThreadUtils.java:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.utils;
2 |
3 | import android.os.Looper;
4 | import com.crashlytics.android.core.CrashlyticsCore;
5 | import com.simplecity.amp_library.BuildConfig;
6 |
7 | public class ThreadUtils {
8 |
9 | private ThreadUtils() {
10 |
11 | }
12 |
13 | public static void ensureNotOnMainThread() {
14 | if (Thread.currentThread() == Looper.getMainLooper().getThread()) {
15 | if (BuildConfig.DEBUG) {
16 | throw new IllegalStateException("ensureNotOnMainThread failed.");
17 | } else {
18 | CrashlyticsCore.getInstance().log("ThreadUtils ensureNotOnMainThread() failed");
19 | }
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/utils/menu/genre/GenreMenuCallbacks.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.utils.menu.genre
2 |
3 | import com.simplecity.amp_library.model.Genre
4 | import com.simplecity.amp_library.model.Playlist
5 |
6 | interface GenreMenuCallbacks {
7 |
8 | fun createPlaylist(genre: Genre)
9 |
10 | fun addToPlaylist(playlist: Playlist, genre: Genre)
11 |
12 | fun addToQueue(genre: Genre)
13 |
14 | fun play(genre: Genre)
15 |
16 | fun playNext(genre: Genre)
17 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/utils/menu/playlist/PlaylistMenuCallbacks.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.utils.menu.playlist
2 |
3 | import com.simplecity.amp_library.model.Playlist
4 |
5 | interface PlaylistMenuCallbacks {
6 |
7 | fun playNext(playlist: Playlist)
8 |
9 | fun play(playlist: Playlist)
10 |
11 | fun delete(playlist: Playlist)
12 |
13 | fun edit(playlist: Playlist)
14 |
15 | fun rename(playlist: Playlist)
16 |
17 | fun clear(playlist: Playlist)
18 |
19 | fun createM3uPlaylist(playlist: Playlist)
20 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/simplecity/amp_library/utils/menu/queue/QueueMenuCallbacks.kt:
--------------------------------------------------------------------------------
1 | package com.simplecity.amp_library.utils.menu.queue
2 |
3 | import com.simplecity.amp_library.ui.screens.queue.QueueItem
4 | import com.simplecity.amp_library.utils.menu.song.SongsMenuCallbacks
5 | import io.reactivex.Single
6 |
7 | interface QueueMenuCallbacks : SongsMenuCallbacks {
8 |
9 | fun moveToNext(queueItem: QueueItem)
10 |
11 | fun removeQueueItems(queueItems: List)
12 | }
13 |
14 |
15 | fun QueueMenuCallbacks.removeQueueItem(queueItem: QueueItem) {
16 | removeQueueItems(listOf(queueItem))
17 | }
18 |
19 |
20 | fun QueueMenuCallbacks.removeQueueItems(queueItems: Single>) {
21 | transform(queueItems) { queueItems -> removeQueueItems(queueItems) }
22 | }
--------------------------------------------------------------------------------
/app/src/main/res/anim/item_animation_from_bottom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
9 |
10 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/layout_animation_from_bottom.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_drag_grip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/ic_drag_grip.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_drawer_header_placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/ic_drawer_header_placeholder.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_headphones_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/ic_headphones_white.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_placeholder_dark_large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/ic_placeholder_dark_large.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_placeholder_dark_medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/ic_placeholder_dark_medium.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_placeholder_light_large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/ic_placeholder_light_large.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_placeholder_light_medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/ic_placeholder_light_medium.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_settings_scrobbling.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/ic_settings_scrobbling.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/ic_stat_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/ic_stat_notification.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/list_pressed_holo_dark.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/list_pressed_holo_dark.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/list_pressed_holo_light.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/list_pressed_holo_light.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/quicklyric.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/quicklyric.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/scrubber_control_from_pressed_mtrl_000.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/scrubber_control_from_pressed_mtrl_000.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/scrubber_primary_mtrl_alpha.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/scrubber_primary_mtrl_alpha.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-hdpi/scrubber_track_mtrl_alpha.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-hdpi/scrubber_track_mtrl_alpha.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-nodpi/backbutton.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-nodpi/backbutton.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v21/list_selector_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 | -
7 |
8 |
9 |
10 | -
11 |
13 |
14 |
17 |
18 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v21/list_selector_light.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 | -
7 |
8 |
9 |
10 | -
11 |
13 |
14 |
17 |
18 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v21/ripple_circular_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | -
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v21/ripple_circular_light.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | -
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_drag_grip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/ic_drag_grip.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_drawer_header_placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/ic_drawer_header_placeholder.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_headphones_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/ic_headphones_white.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_placeholder_dark_large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/ic_placeholder_dark_large.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_placeholder_dark_medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/ic_placeholder_dark_medium.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_placeholder_light_large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/ic_placeholder_light_large.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_placeholder_light_medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/ic_placeholder_light_medium.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_settings_scrobbling.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/ic_settings_scrobbling.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/ic_stat_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/ic_stat_notification.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/list_pressed_holo_dark.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/list_pressed_holo_dark.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/list_pressed_holo_light.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/list_pressed_holo_light.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/quicklyric.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/quicklyric.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/scrubber_control_from_pressed_mtrl_000.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/scrubber_control_from_pressed_mtrl_000.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/scrubber_primary_mtrl_alpha.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/scrubber_primary_mtrl_alpha.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xhdpi/scrubber_track_mtrl_alpha.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xhdpi/scrubber_track_mtrl_alpha.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_drag_grip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/ic_drag_grip.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_drawer_header_placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/ic_drawer_header_placeholder.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_headphones_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/ic_headphones_white.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_placeholder_dark_large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/ic_placeholder_dark_large.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_placeholder_dark_medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/ic_placeholder_dark_medium.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_placeholder_light_large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/ic_placeholder_light_large.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_placeholder_light_medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/ic_placeholder_light_medium.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_settings_scrobbling.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/ic_settings_scrobbling.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/ic_stat_notification.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/ic_stat_notification.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/list_pressed_holo_dark.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/list_pressed_holo_dark.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/list_pressed_holo_light.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/list_pressed_holo_light.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/quicklyric.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/quicklyric.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/scrubber_control_from_pressed_mtrl_000.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/scrubber_control_from_pressed_mtrl_000.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/scrubber_primary_mtrl_alpha.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/scrubber_primary_mtrl_alpha.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxhdpi/scrubber_track_mtrl_alpha.9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxhdpi/scrubber_track_mtrl_alpha.9.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable-xxxhdpi/ic_headphones_white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/drawable-xxxhdpi/ic_headphones_white.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/bg_rounded.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/card_shadow.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/circle.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_action_lyrics_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_add_circle_outline_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_album_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_arrow_down_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_arrow_right_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_arrow_up_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_audiotrack_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_check_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_close_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_delete_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_equalizer_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_favorite_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_favorite_24dp_scaled.xml:
--------------------------------------------------------------------------------
1 |
6 |
11 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_favorite_border_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_favorite_border_24dp_scaled.xml:
--------------------------------------------------------------------------------
1 |
6 |
11 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_folder_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_folder_multiple_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_folder_nav.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_folder_outline.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_folder_remove.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_headset_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_help_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_image_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_info_outline_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_foreground_layer.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_library_music_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_lock_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_overflow_20dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_palette_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_pause_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_play_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_play_circle_outline_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_play_next.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_playlist_add_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_queue_music_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_queue_remove.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_repeat_24dp_scaled.xml:
--------------------------------------------------------------------------------
1 |
6 |
11 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_repeat_one_24dp_scaled.xml:
--------------------------------------------------------------------------------
1 |
6 |
11 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_search_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_shuffle_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_shuffle_24dp_scaled.xml:
--------------------------------------------------------------------------------
1 |
6 |
11 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/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 |
6 |
9 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_skip_next_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_skip_previous_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_sleep_24dp.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_sort_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_tv_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_unlock_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_view_list_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_warning_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/list_item_activated_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
6 | -
7 |
8 |
9 | -
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/list_item_activated_light.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
6 | -
7 |
8 |
9 | -
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/list_selector_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/list_selector_light.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ripple_circular_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ripple_circular_light.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shortcut_folder.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shortcut_play.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shortcut_shuffle.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/text_protection_scrim.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/text_protection_scrim_reversed.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/action_bar_favorite.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/action_bar_lock.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/breadcrumb_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/breadcrumb_item_divider.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/breadcrumb_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
16 |
17 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/contextual_toolbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_artwork.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_minutes_picker.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_playlist.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_rename.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/empty_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_drawer.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
21 |
22 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_recycler.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_suggested.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_widget.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/list_item_artwork_loading.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/list_item_breadcrumbs.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
21 |
22 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/list_item_drawer_divider.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/list_item_loading.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/list_item_queue_pager.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/list_item_section_separator.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/list_item_subheader.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/overflow_button.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/recycler_header.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/repeat_button.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/shuffle_button.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/spinner_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/weekpicker.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/context_menu_folders.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/context_menu_queue.xml:
--------------------------------------------------------------------------------
1 |
2 |
26 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_equalizer.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
17 |
18 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_fragment_queue.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
9 |
10 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_genre.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
8 |
9 |
12 |
13 | -
15 |
16 |
-
19 |
20 |
21 |
22 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_library.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
12 |
13 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/raw/beep.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/app/src/main/res/raw/beep.mp3
--------------------------------------------------------------------------------
/app/src/main/res/transition/image_transition.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app/src/main/res/values-land/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - 2
5 | - 3
6 | - 4
7 | - 5
8 | - 6
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values-land/bool.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | false
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values-land/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 180dp
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values-land/integers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 4
4 |
5 | 2
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw360dp-land/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 180dp
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw360dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 360dp
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp-land/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - 2
5 | - 3
6 | - 4
7 | - 4
8 | - 6
9 | - 7
10 | - 8
11 | - 9
12 | - 10
13 |
14 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp-land/bool.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | true
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp-land/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 32dp
5 | 128dp
6 |
7 | 250dp
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp-land/integers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 6
4 | 3
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - 2
5 | - 3
6 | - 4
7 | - 4
8 | - 6
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp/bool.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | true
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 148dp
5 |
6 | 64dp
7 | 64dp
8 |
9 | 420dp
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw600dp/integers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 4
4 |
5 | 2
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw720dp-land/bool.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | true
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw720dp-land/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 64dp
6 | 196dp
7 |
8 | 300dp
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw720dp/bool.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | true
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sw720dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 168dp
6 |
7 | 600dp
8 |
9 | 56dp
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v21/color.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #000000
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v21/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 113dp
5 |
6 | 113dp
7 |
8 | 14sp
9 | 14sp
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v21/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
8 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v24/color.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #757575
4 |
5 | #E1E1E1
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v24/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 94dp
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values/bool.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | false
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/ids.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/integers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 3
4 |
5 | 1
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/play_store_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/automotive_app_desc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/provider_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
10 |
11 |
14 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/remote_config_defaults.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | let_it_snow
5 | false
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/searchable.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/settings_playback.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
8 |
9 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/widget_provider_extra_large.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/widget_provider_large.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/widget_provider_medium.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/widget_provider_small.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
--------------------------------------------------------------------------------
/app/src/paid/res/values/donottranslate.xml:
--------------------------------------------------------------------------------
1 |
2 | Shuttle+
3 | MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApxVy643Q/ydAVyM1n5g+aU5XlpMRGbOSvfM2Lzwk38qwhF4bLoEqiOTeqiZkRM3KkjjhK0i3Fw8lsbgC5bpTqieXeSfM0peOS7ReB0z4cAmnvs+SXG3eNMAhvr0nJ8w8BiC9kMrWWCsG1bYeEvzW1gNWJoy/z9vTvhM73sYCQqKPfFDYa/rLMsqGbsPInUxQhb4KBYnQHnxiW0PuHfpJ1jV/9o71ua8IAqQITThP5v4Nb64KI+XOTevRAmOSmEZQrxhr5IOrNJ+Fb4i58Dw7CL+LCFFglPwhQ9An+R0cEwV/zjGp3GICBiheJM1Avmaxgwq4uZp3ZY9yELD7ZNgadwIDAQAB
4 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | import dependencies.Dependencies
2 |
3 | apply plugin: Dependencies.BuildPlugins.gradleVersions
4 |
5 | buildscript {
6 | repositories {
7 | google()
8 | jcenter()
9 | }
10 | dependencies {
11 | classpath Dependencies.Plugins.android
12 | classpath Dependencies.Plugins.gradleVersions
13 | classpath Dependencies.Plugins.playServices
14 | classpath Dependencies.Plugins.kotlin
15 | }
16 | }
17 |
18 | allprojects {
19 | repositories {
20 | google()
21 | jcenter()
22 | maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
23 | maven { url "https://jitpack.io" }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/buildSrc/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import org.gradle.kotlin.dsl.`kotlin-dsl`
2 |
3 | repositories {
4 | jcenter()
5 | }
6 |
7 | plugins {
8 | `kotlin-dsl`
9 | }
10 |
11 | repositories {
12 | jcenter()
13 | }
14 |
--------------------------------------------------------------------------------
/buildSrc/src/main/kotlin/Config.kt:
--------------------------------------------------------------------------------
1 | object Config {
2 |
3 | const val versionName = "2.0.13-beta1"
4 |
5 | }
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun Aug 20 13:15:49 AEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/libraries/aesthetic/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/java/com/afollestad/aesthetic/AestheticActivity.java:
--------------------------------------------------------------------------------
1 | package com.afollestad.aesthetic;
2 |
3 | import android.os.Bundle;
4 | import android.support.annotation.Nullable;
5 | import android.support.v7.app.AppCompatActivity;
6 |
7 | /** @author Aidan Follestad (afollestad) */
8 | public class AestheticActivity extends AppCompatActivity implements AestheticKeyProvider {
9 |
10 | @Override
11 | protected void onCreate(@Nullable Bundle savedInstanceState) {
12 | Aesthetic.get(this).attach(this);
13 | super.onCreate(savedInstanceState);
14 | }
15 |
16 | @Override
17 | protected void onResume() {
18 | super.onResume();
19 | Aesthetic.get(this).resume(this);
20 | }
21 |
22 | @Override
23 | protected void onPause() {
24 | Aesthetic.get(this).pause(this);
25 | super.onPause();
26 | }
27 |
28 | @Nullable
29 | @Override
30 | public String key() {
31 | return null;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/java/com/afollestad/aesthetic/AestheticKeyProvider.java:
--------------------------------------------------------------------------------
1 | package com.afollestad.aesthetic;
2 |
3 | import android.support.annotation.Nullable;
4 |
5 | /** @author Aidan Follestad (afollestad) */
6 | @SuppressWarnings("WeakerAccess")
7 | public interface AestheticKeyProvider {
8 |
9 | @Nullable
10 | String key();
11 | }
12 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/java/com/afollestad/aesthetic/AutoSwitchMode.java:
--------------------------------------------------------------------------------
1 | package com.afollestad.aesthetic;
2 |
3 | import static com.afollestad.aesthetic.AutoSwitchMode.AUTO;
4 | import static com.afollestad.aesthetic.AutoSwitchMode.OFF;
5 | import static com.afollestad.aesthetic.AutoSwitchMode.ON;
6 | import static java.lang.annotation.RetentionPolicy.SOURCE;
7 |
8 | import android.support.annotation.IntDef;
9 | import java.lang.annotation.Retention;
10 |
11 | /** @author Aidan Follestad (afollestad) */
12 | @SuppressWarnings("WeakerAccess")
13 | @Retention(SOURCE)
14 | @IntDef(value = {OFF, ON, AUTO})
15 | public @interface AutoSwitchMode {
16 | int OFF = 0;
17 | int ON = 1;
18 | int AUTO = 2;
19 | }
20 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/java/com/afollestad/aesthetic/BottomNavBgMode.java:
--------------------------------------------------------------------------------
1 | package com.afollestad.aesthetic;
2 |
3 | import static com.afollestad.aesthetic.BottomNavBgMode.ACCENT;
4 | import static com.afollestad.aesthetic.BottomNavBgMode.BLACK_WHITE_AUTO;
5 | import static com.afollestad.aesthetic.BottomNavBgMode.PRIMARY;
6 | import static com.afollestad.aesthetic.BottomNavBgMode.PRIMARY_DARK;
7 | import static java.lang.annotation.RetentionPolicy.SOURCE;
8 |
9 | import android.support.annotation.IntDef;
10 | import java.lang.annotation.Retention;
11 |
12 | /** @author Aidan Follestad (afollestad) */
13 | @SuppressWarnings("WeakerAccess")
14 | @Retention(SOURCE)
15 | @IntDef(value = {BLACK_WHITE_AUTO, PRIMARY, PRIMARY_DARK, ACCENT})
16 | public @interface BottomNavBgMode {
17 | int BLACK_WHITE_AUTO = 0;
18 | int PRIMARY = 1;
19 | int PRIMARY_DARK = 2;
20 | int ACCENT = 3;
21 | }
22 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/java/com/afollestad/aesthetic/BottomNavIconTextMode.java:
--------------------------------------------------------------------------------
1 | package com.afollestad.aesthetic;
2 |
3 | import static com.afollestad.aesthetic.BottomNavIconTextMode.BLACK_WHITE_AUTO;
4 | import static com.afollestad.aesthetic.BottomNavIconTextMode.SELECTED_ACCENT;
5 | import static com.afollestad.aesthetic.BottomNavIconTextMode.SELECTED_PRIMARY;
6 | import static java.lang.annotation.RetentionPolicy.SOURCE;
7 |
8 | import android.support.annotation.IntDef;
9 | import java.lang.annotation.Retention;
10 |
11 | /** @author Aidan Follestad (afollestad) */
12 | @SuppressWarnings("WeakerAccess")
13 | @Retention(SOURCE)
14 | @IntDef(value = {SELECTED_PRIMARY, SELECTED_ACCENT, BLACK_WHITE_AUTO})
15 | public @interface BottomNavIconTextMode {
16 | int SELECTED_PRIMARY = 0;
17 | int SELECTED_ACCENT = 1;
18 | int BLACK_WHITE_AUTO = 2;
19 | }
20 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/java/com/afollestad/aesthetic/NavigationViewMode.java:
--------------------------------------------------------------------------------
1 | package com.afollestad.aesthetic;
2 |
3 | import static com.afollestad.aesthetic.NavigationViewMode.SELECTED_ACCENT;
4 | import static com.afollestad.aesthetic.NavigationViewMode.SELECTED_PRIMARY;
5 | import static java.lang.annotation.RetentionPolicy.SOURCE;
6 |
7 | import android.support.annotation.IntDef;
8 | import java.lang.annotation.Retention;
9 |
10 | /** @author Aidan Follestad (afollestad) */
11 | @SuppressWarnings("WeakerAccess")
12 | @Retention(SOURCE)
13 | @IntDef(value = {SELECTED_PRIMARY, SELECTED_ACCENT})
14 | public @interface NavigationViewMode {
15 | int SELECTED_PRIMARY = 0;
16 | int SELECTED_ACCENT = 1;
17 | }
18 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/java/com/afollestad/aesthetic/TabLayoutBgMode.java:
--------------------------------------------------------------------------------
1 | package com.afollestad.aesthetic;
2 |
3 | import static com.afollestad.aesthetic.TabLayoutBgMode.ACCENT;
4 | import static com.afollestad.aesthetic.TabLayoutBgMode.PRIMARY;
5 | import static java.lang.annotation.RetentionPolicy.SOURCE;
6 |
7 | import android.support.annotation.IntDef;
8 | import java.lang.annotation.Retention;
9 |
10 | /** @author Aidan Follestad (afollestad) */
11 | @SuppressWarnings("WeakerAccess")
12 | @Retention(SOURCE)
13 | @IntDef(value = {PRIMARY, ACCENT})
14 | public @interface TabLayoutBgMode {
15 | int PRIMARY = 0;
16 | int ACCENT = 1;
17 | }
18 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/java/com/afollestad/aesthetic/TabLayoutIndicatorMode.java:
--------------------------------------------------------------------------------
1 | package com.afollestad.aesthetic;
2 |
3 | import static com.afollestad.aesthetic.TabLayoutIndicatorMode.ACCENT;
4 | import static com.afollestad.aesthetic.TabLayoutIndicatorMode.PRIMARY;
5 | import static java.lang.annotation.RetentionPolicy.SOURCE;
6 |
7 | import android.support.annotation.IntDef;
8 | import java.lang.annotation.Retention;
9 |
10 | /** @author Aidan Follestad (afollestad) */
11 | @SuppressWarnings("WeakerAccess")
12 | @Retention(SOURCE)
13 | @IntDef(value = {PRIMARY, ACCENT})
14 | public @interface TabLayoutIndicatorMode {
15 | int PRIMARY = 0;
16 | int ACCENT = 1;
17 | }
18 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/java/com/afollestad/aesthetic/ViewBackgroundAction.java:
--------------------------------------------------------------------------------
1 | package com.afollestad.aesthetic;
2 |
3 | import android.support.annotation.NonNull;
4 | import android.view.View;
5 | import io.reactivex.functions.Consumer;
6 |
7 | /** @author Aidan Follestad (afollestad) */
8 | @SuppressWarnings("WeakerAccess")
9 | public final class ViewBackgroundAction implements Consumer {
10 |
11 | private final View view;
12 |
13 | private ViewBackgroundAction(View view) {
14 | this.view = view;
15 | }
16 |
17 | public static ViewBackgroundAction create(@NonNull View view) {
18 | return new ViewBackgroundAction(view);
19 | }
20 |
21 | @Override
22 | public void accept(@io.reactivex.annotations.NonNull Integer color) {
23 | if (view != null) {
24 | view.setBackgroundColor(color);
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/res-public/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/libraries/aesthetic/src/main/res-public/values/public.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/libraries/glidepalette/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/libraries/glidepalette/build.gradle:
--------------------------------------------------------------------------------
1 | import dependencies.Dependencies
2 |
3 | apply plugin: Dependencies.BuildPlugins.androidLibrary
4 |
5 | android {
6 | compileSdkVersion Dependencies.compileSdk
7 |
8 | defaultConfig {
9 | minSdkVersion Dependencies.minSdk
10 | targetSdkVersion Dependencies.targetSdk
11 | }
12 | buildTypes {
13 | release {
14 | minifyEnabled false
15 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
16 | }
17 | }
18 | }
19 |
20 | dependencies {
21 | implementation fileTree(dir: 'libs', include: ['*.jar'])
22 | implementation Dependencies.Google.palette
23 | implementation Dependencies.Google.supportv4
24 | implementation Dependencies.glide
25 | }
--------------------------------------------------------------------------------
/libraries/glidepalette/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /Users/florentchampigny/android/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/libraries/glidepalette/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/libraries/glidepalette/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Glide Palette
3 |
4 |
--------------------------------------------------------------------------------
/libraries/multisheetview/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/libraries/multisheetview/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/libraries/multisheetview/src/main/res/values-land/dimen.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 56dp
4 | 68dp
5 |
--------------------------------------------------------------------------------
/libraries/multisheetview/src/main/res/values/dimen.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 56dp
4 | 56dp
5 |
--------------------------------------------------------------------------------
/libraries/multisheetview/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | MultiSheetView
3 |
4 |
--------------------------------------------------------------------------------
/libraries/navigation/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/libraries/navigation/build.gradle:
--------------------------------------------------------------------------------
1 | import dependencies.Dependencies
2 |
3 | apply plugin: Dependencies.BuildPlugins.androidLibrary
4 |
5 | android {
6 | compileSdkVersion Dependencies.compileSdk
7 |
8 | defaultConfig {
9 | minSdkVersion Dependencies.minSdk
10 | targetSdkVersion Dependencies.targetSdk
11 | versionCode 1
12 | versionName "1.0"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | implementation fileTree(dir: 'libs', include: ['*.jar'])
24 |
25 | implementation Dependencies.Google.appcompat
26 | }
--------------------------------------------------------------------------------
/libraries/navigation/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/libraries/navigation/src/main/java/test/com/androidnavigation/base/Controller.java:
--------------------------------------------------------------------------------
1 | package test.com.androidnavigation.base;
2 |
3 | import android.support.annotation.Nullable;
4 |
5 | public interface Controller {
6 |
7 | /**
8 | * @return the parent {@link NavigationController}, or null if none exists.
9 | */
10 | @Nullable
11 | NavigationController getNavigationController();
12 |
13 | }
--------------------------------------------------------------------------------
/libraries/navigation/src/main/java/test/com/androidnavigation/fragment/BackPressHandler.java:
--------------------------------------------------------------------------------
1 | package test.com.androidnavigation.fragment;
2 |
3 | import android.support.annotation.NonNull;
4 |
5 | import test.com.androidnavigation.base.NavigationController;
6 |
7 | /**
8 | * Classes which are capable of handling the Android back-button press (such as {@link android.app.Activity})
9 | * should implement this method to allow back-presses to be propagated to the NavigationController, which then
10 | * gets an opportunity to consume the back press event via {@link NavigationController#consumeBackPress()}
11 | *
12 | * @see {@link BaseNavigationController#onResume()}
13 | */
14 | public interface BackPressHandler {
15 |
16 | void addBackPressListener(@NonNull BackPressListener listener);
17 |
18 | void removeBackPressListener(@NonNull BackPressListener listener);
19 | }
20 |
--------------------------------------------------------------------------------
/libraries/navigation/src/main/java/test/com/androidnavigation/fragment/BackPressListener.java:
--------------------------------------------------------------------------------
1 | package test.com.androidnavigation.fragment;
2 |
3 | public interface BackPressListener {
4 | boolean consumeBackPress();
5 |
6 | }
7 |
--------------------------------------------------------------------------------
/libraries/navigation/src/main/res/layout/navigation_fragment.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/libraries/recycler-adapter/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/libraries/recycler-adapter/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/libraries/recycler-adapter/src/main/java/com/simplecityapps/recycler_adapter/adapter/CompletionListUpdateCallback.java:
--------------------------------------------------------------------------------
1 | package com.simplecityapps.recycler_adapter.adapter;
2 |
3 | import android.support.v7.util.ListUpdateCallback;
4 |
5 | /**
6 | * A custom {@link ListUpdateCallback} with an additional onComplete() methods, used for notifying when the
7 | * diff result has been calculated and supplied to the adapter.
8 | */
9 | public interface CompletionListUpdateCallback extends ListUpdateCallback {
10 |
11 | /**
12 | * Called once the diff result has been calculated and supplied to the adapter.
13 | */
14 | void onComplete();
15 | }
16 |
--------------------------------------------------------------------------------
/libraries/recycler-adapter/src/main/java/com/simplecityapps/recycler_adapter/adapter/CompletionListUpdateCallbackAdapter.java:
--------------------------------------------------------------------------------
1 | package com.simplecityapps.recycler_adapter.adapter;
2 |
3 | public class CompletionListUpdateCallbackAdapter implements CompletionListUpdateCallback {
4 |
5 | @Override
6 | public void onInserted(int position, int count) {
7 |
8 | }
9 |
10 | @Override
11 | public void onRemoved(int position, int count) {
12 |
13 | }
14 |
15 | @Override
16 | public void onMoved(int fromPosition, int toPosition) {
17 |
18 | }
19 |
20 | @Override
21 | public void onChanged(int position, int count, Object payload) {
22 |
23 | }
24 |
25 | public void onComplete() {
26 |
27 | }
28 | }
--------------------------------------------------------------------------------
/libraries/recycler-adapter/src/main/java/com/simplecityapps/recycler_adapter/model/ContentsComparator.java:
--------------------------------------------------------------------------------
1 | package com.simplecityapps.recycler_adapter.model;
2 |
3 | public interface ContentsComparator {
4 |
5 | boolean areContentsEqual(Object other);
6 |
7 | }
--------------------------------------------------------------------------------
/libraries/recycler-adapter/src/main/java/com/simplecityapps/recycler_adapter/model/ViewModel.java:
--------------------------------------------------------------------------------
1 | package com.simplecityapps.recycler_adapter.model;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 | import android.view.ViewGroup;
5 |
6 | import java.util.List;
7 |
8 | public interface ViewModel extends ContentsComparator {
9 |
10 | int getViewType();
11 |
12 | void bindView(VH holder);
13 |
14 | void bindView(VH holder, int position, List payloads);
15 |
16 | VH createViewHolder(ViewGroup parent);
17 |
18 | int getSpanSize(int spanCount);
19 | }
--------------------------------------------------------------------------------
/libraries/recycler-adapter/src/main/java/com/simplecityapps/recycler_adapter/recyclerview/AttachStateViewHolder.java:
--------------------------------------------------------------------------------
1 | package com.simplecityapps.recycler_adapter.recyclerview;
2 |
3 | public interface AttachStateViewHolder {
4 |
5 | void onAttachedToWindow();
6 |
7 | void onDetachedFromWindow();
8 | }
9 |
--------------------------------------------------------------------------------
/libraries/recycler-adapter/src/main/java/com/simplecityapps/recycler_adapter/recyclerview/RecyclerListener.java:
--------------------------------------------------------------------------------
1 | package com.simplecityapps.recycler_adapter.recyclerview;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 |
5 | /**
6 | * A custom RecyclerListener that calls recycle() on the ViewHolder, if it implements {@link RecyclingViewHolder}
7 | */
8 | public class RecyclerListener implements RecyclerView.RecyclerListener {
9 |
10 | @Override
11 | public void onViewRecycled(RecyclerView.ViewHolder holder) {
12 | if (holder instanceof RecyclingViewHolder) {
13 | ((RecyclingViewHolder) holder).recycle();
14 | }
15 | }
16 | }
--------------------------------------------------------------------------------
/libraries/recycler-adapter/src/main/java/com/simplecityapps/recycler_adapter/recyclerview/RecyclingViewHolder.java:
--------------------------------------------------------------------------------
1 | package com.simplecityapps.recycler_adapter.recyclerview;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 |
5 | public interface RecyclingViewHolder {
6 |
7 | /**
8 | * If a {@link RecyclerView.RecyclerListener} is attached to the RecyclerView and implemented so as to call this method
9 | * on the ViewHolder to be recycled, we can clean up resources here.
10 | */
11 | void recycle();
12 |
13 | }
--------------------------------------------------------------------------------
/libraries/recycler-adapter/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | recyclerview-adapter
3 |
4 |
--------------------------------------------------------------------------------
/public.properties:
--------------------------------------------------------------------------------
1 | # This API key is provided for convenience. Please go to https://www.last.fm/api/account/create and create your own.
2 |
3 | LASTFM_API_KEY=206993ea109315882749d5bc7b2e704d
--------------------------------------------------------------------------------
/secrets.tar.enc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/secrets.tar.enc
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app',
2 | 'libraries:glidepalette',
3 | 'libraries:ccl',
4 | 'libraries:navigation',
5 | 'libraries:recycler-adapter',
6 | 'libraries:multisheetview',
7 | 'libraries:aesthetic'
--------------------------------------------------------------------------------
/shuttle.jks:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/timusus/Shuttle/42c0d6095e97ed6ac91df2be6c27f82ce60c053a/shuttle.jks
--------------------------------------------------------------------------------