├── .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 | 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 | 4 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/context_menu_queue.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 19 | 20 | 24 | 25 | 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 --------------------------------------------------------------------------------