├── .editorconfig ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml ├── dependabot.yml └── workflows │ ├── image-minimizer.yml │ ├── no-response.yml │ ├── pr-labeler.yml │ ├── pr.yml │ ├── prepare-release-pr.yml │ ├── release.yml │ └── testing-build.yml ├── .gitignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle.kts ├── detekt-baseline.xml ├── lint-baseline.xml ├── proguard-rules.pro └── src │ ├── debug │ └── res │ │ └── values │ │ └── strings.xml │ ├── foss │ └── res │ │ └── values │ │ └── bools.xml │ ├── gplay │ └── res │ │ └── values │ │ └── bools.xml │ └── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── kotlin │ └── org │ │ └── fossify │ │ └── musicplayer │ │ ├── App.kt │ │ ├── activities │ │ ├── AlbumsActivity.kt │ │ ├── EqualizerActivity.kt │ │ ├── ExcludedFoldersActivity.kt │ │ ├── MainActivity.kt │ │ ├── QueueActivity.kt │ │ ├── SettingsActivity.kt │ │ ├── SimpleActivity.kt │ │ ├── SimpleControllerActivity.kt │ │ ├── SimpleMusicActivity.kt │ │ ├── SplashActivity.kt │ │ ├── TrackActivity.kt │ │ ├── TracksActivity.kt │ │ └── WidgetConfigureActivity.kt │ │ ├── adapters │ │ ├── AlbumsAdapter.kt │ │ ├── AlbumsTracksAdapter.kt │ │ ├── ArtistsAdapter.kt │ │ ├── BaseMusicAdapter.kt │ │ ├── ExcludedFoldersAdapter.kt │ │ ├── FoldersAdapter.kt │ │ ├── GenresAdapter.kt │ │ ├── PlaylistsAdapter.kt │ │ ├── QueueAdapter.kt │ │ ├── TracksAdapter.kt │ │ ├── TracksHeaderAdapter.kt │ │ └── ViewPagerAdapter.kt │ │ ├── databases │ │ └── SongsDatabase.kt │ │ ├── dialogs │ │ ├── ChangeSortingDialog.kt │ │ ├── EditDialog.kt │ │ ├── ExportPlaylistDialog.kt │ │ ├── ManageVisibleTabsDialog.kt │ │ ├── NewPlaylistDialog.kt │ │ ├── RemovePlaylistDialog.kt │ │ ├── SelectPlaylistDialog.kt │ │ └── SleepTimerCustomDialog.kt │ │ ├── extensions │ │ ├── Activity.kt │ │ ├── Context.kt │ │ ├── Future.kt │ │ ├── Looper.kt │ │ ├── LottieAnimationView.kt │ │ ├── MediaController.kt │ │ ├── MediaItem.kt │ │ ├── MutableList.kt │ │ ├── Player.kt │ │ ├── RecyclerView.kt │ │ ├── Resources.kt │ │ └── View.kt │ │ ├── fragments │ │ ├── AlbumsFragment.kt │ │ ├── ArtistsFragment.kt │ │ ├── FoldersFragment.kt │ │ ├── GenresFragment.kt │ │ ├── MyViewPagerFragment.kt │ │ ├── PlaybackSpeedFragment.kt │ │ ├── PlaylistsFragment.kt │ │ └── TracksFragment.kt │ │ ├── helpers │ │ ├── AudioHelper.kt │ │ ├── Config.kt │ │ ├── Constants.kt │ │ ├── M3uExporter.kt │ │ ├── M3uImporter.kt │ │ ├── MyWidgetProvider.kt │ │ ├── NotificationHelper.kt │ │ ├── PlaybackSetting.kt │ │ ├── RoomHelper.kt │ │ ├── SimpleMediaController.kt │ │ ├── SimpleMediaScanner.kt │ │ └── TagHelper.kt │ │ ├── inlines │ │ └── Int.kt │ │ ├── interfaces │ │ ├── AlbumsDao.kt │ │ ├── ArtistsDao.kt │ │ ├── GenresDao.kt │ │ ├── PlaybackSpeedListener.kt │ │ ├── PlaylistsDao.kt │ │ ├── QueueItemsDao.kt │ │ └── SongsDao.kt │ │ ├── models │ │ ├── Album.kt │ │ ├── AlbumHeader.kt │ │ ├── AlbumSection.kt │ │ ├── Artist.kt │ │ ├── Events.kt │ │ ├── Folder.kt │ │ ├── Genre.kt │ │ ├── ListItem.kt │ │ ├── Playlist.kt │ │ ├── QueueItem.kt │ │ └── Track.kt │ │ ├── objects │ │ └── MyExecutor.kt │ │ ├── playback │ │ ├── CustomCommands.kt │ │ ├── MediaSessionCallback.kt │ │ ├── PlaybackService.kt │ │ ├── SimpleEqualizer.kt │ │ ├── SleepTimer.kt │ │ ├── library │ │ │ └── MediaItemProvider.kt │ │ └── player │ │ │ ├── AudioOnlyRenderersFactory.kt │ │ │ ├── Player.kt │ │ │ ├── PlayerListener.kt │ │ │ └── SimpleMusicPlayer.kt │ │ └── views │ │ ├── CurrentTrackBar.kt │ │ └── MarqueeTextView.kt │ └── res │ ├── drawable-hdpi │ ├── ic_headset.png │ ├── ic_headset_padded.png │ └── ic_headset_small.png │ ├── drawable-mdpi │ └── ic_headset.png │ ├── drawable-nodpi │ └── img_widget_preview.png │ ├── drawable-xhdpi │ ├── ic_headset.png │ ├── ic_headset_padded.png │ └── ic_headset_small.png │ ├── drawable-xxhdpi │ ├── ic_headset.png │ ├── ic_headset_padded.png │ └── ic_headset_small.png │ ├── drawable-xxxhdpi │ ├── ic_headset.png │ ├── ic_headset_padded.png │ └── ic_headset_small.png │ ├── drawable │ ├── ic_album_vector.xml │ ├── ic_equalizer_vector.xml │ ├── ic_folders_vector.xml │ ├── ic_genre_vector.xml │ ├── ic_launcher_foreground.xml │ ├── ic_launcher_monochrome.xml │ ├── ic_music_note_vector.xml │ ├── ic_next_vector.xml │ ├── ic_play_one_song_vector.xml │ ├── ic_playback_speed_slow_vector.xml │ ├── ic_playback_speed_vector.xml │ ├── ic_playlist_vector.xml │ ├── ic_previous_vector.xml │ ├── ic_repeat_one_song_vector.xml │ ├── ic_repeat_playlist_vector.xml │ └── ic_shuffle_vector.xml │ ├── layout-land │ └── item_playlist.xml │ ├── layout │ ├── activity_albums.xml │ ├── activity_equalizer.xml │ ├── activity_excluded_folders.xml │ ├── activity_main.xml │ ├── activity_queue.xml │ ├── activity_settings.xml │ ├── activity_track.xml │ ├── activity_tracks.xml │ ├── dialog_change_sorting.xml │ ├── dialog_custom_sleep_timer_picker.xml │ ├── dialog_export_playlist.xml │ ├── dialog_manage_visible_tabs.xml │ ├── dialog_new_playlist.xml │ ├── dialog_remove_playlist.xml │ ├── dialog_rename_song.xml │ ├── dialog_select_playlist.xml │ ├── equalizer_band.xml │ ├── fragment_albums.xml │ ├── fragment_artists.xml │ ├── fragment_folders.xml │ ├── fragment_genres.xml │ ├── fragment_playback_speed.xml │ ├── fragment_playlists.xml │ ├── fragment_tracks.xml │ ├── item_album.xml │ ├── item_album_header.xml │ ├── item_artist.xml │ ├── item_excluded_folder.xml │ ├── item_folder.xml │ ├── item_genre.xml │ ├── item_playlist.xml │ ├── item_section.xml │ ├── item_select_playlist.xml │ ├── item_track.xml │ ├── item_track_queue.xml │ ├── item_transparent.xml │ ├── small_radio_button.xml │ ├── small_widget.xml │ ├── view_current_track_bar.xml │ ├── widget.xml │ ├── widget_config.xml │ └── widget_controls.xml │ ├── menu │ ├── cab_albums.xml │ ├── cab_albums_tracks.xml │ ├── cab_artists.xml │ ├── cab_folders.xml │ ├── cab_genres.xml │ ├── cab_playlists.xml │ ├── cab_queue.xml │ ├── cab_tracks.xml │ ├── cab_tracks_header.xml │ ├── menu_main.xml │ ├── menu_playlist.xml │ └── menu_queue.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ ├── ic_launcher_amber.xml │ ├── ic_launcher_blue.xml │ ├── ic_launcher_blue_grey.xml │ ├── ic_launcher_brown.xml │ ├── ic_launcher_cyan.xml │ ├── ic_launcher_deep_orange.xml │ ├── ic_launcher_deep_purple.xml │ ├── ic_launcher_grey_black.xml │ ├── ic_launcher_indigo.xml │ ├── ic_launcher_light_blue.xml │ ├── ic_launcher_light_green.xml │ ├── ic_launcher_lime.xml │ ├── ic_launcher_orange.xml │ ├── ic_launcher_pink.xml │ ├── ic_launcher_purple.xml │ ├── ic_launcher_red.xml │ ├── ic_launcher_teal.xml │ └── ic_launcher_yellow.xml │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ ├── ic_launcher_amber.webp │ ├── ic_launcher_blue.webp │ ├── ic_launcher_blue_grey.webp │ ├── ic_launcher_brown.webp │ ├── ic_launcher_cyan.webp │ ├── ic_launcher_deep_orange.webp │ ├── ic_launcher_deep_purple.webp │ ├── ic_launcher_grey_black.webp │ ├── ic_launcher_indigo.webp │ ├── ic_launcher_light_blue.webp │ ├── ic_launcher_light_green.webp │ ├── ic_launcher_lime.webp │ ├── ic_launcher_orange.webp │ ├── ic_launcher_pink.webp │ ├── ic_launcher_purple.webp │ ├── ic_launcher_red.webp │ ├── ic_launcher_teal.webp │ └── ic_launcher_yellow.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ ├── ic_launcher_amber.webp │ ├── ic_launcher_blue.webp │ ├── ic_launcher_blue_grey.webp │ ├── ic_launcher_brown.webp │ ├── ic_launcher_cyan.webp │ ├── ic_launcher_deep_orange.webp │ ├── ic_launcher_deep_purple.webp │ ├── ic_launcher_grey_black.webp │ ├── ic_launcher_indigo.webp │ ├── ic_launcher_light_blue.webp │ ├── ic_launcher_light_green.webp │ ├── ic_launcher_lime.webp │ ├── ic_launcher_orange.webp │ ├── ic_launcher_pink.webp │ ├── ic_launcher_purple.webp │ ├── ic_launcher_red.webp │ ├── ic_launcher_teal.webp │ └── ic_launcher_yellow.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ ├── ic_launcher_amber.webp │ ├── ic_launcher_blue.webp │ ├── ic_launcher_blue_grey.webp │ ├── ic_launcher_brown.webp │ ├── ic_launcher_cyan.webp │ ├── ic_launcher_deep_orange.webp │ ├── ic_launcher_deep_purple.webp │ ├── ic_launcher_grey_black.webp │ ├── ic_launcher_indigo.webp │ ├── ic_launcher_light_blue.webp │ ├── ic_launcher_light_green.webp │ ├── ic_launcher_lime.webp │ ├── ic_launcher_orange.webp │ ├── ic_launcher_pink.webp │ ├── ic_launcher_purple.webp │ ├── ic_launcher_red.webp │ ├── ic_launcher_teal.webp │ └── ic_launcher_yellow.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ ├── ic_launcher_amber.webp │ ├── ic_launcher_blue.webp │ ├── ic_launcher_blue_grey.webp │ ├── ic_launcher_brown.webp │ ├── ic_launcher_cyan.webp │ ├── ic_launcher_deep_orange.webp │ ├── ic_launcher_deep_purple.webp │ ├── ic_launcher_grey_black.webp │ ├── ic_launcher_indigo.webp │ ├── ic_launcher_light_blue.webp │ ├── ic_launcher_light_green.webp │ ├── ic_launcher_lime.webp │ ├── ic_launcher_orange.webp │ ├── ic_launcher_pink.webp │ ├── ic_launcher_purple.webp │ ├── ic_launcher_red.webp │ ├── ic_launcher_teal.webp │ └── ic_launcher_yellow.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ ├── ic_launcher_amber.webp │ ├── ic_launcher_blue.webp │ ├── ic_launcher_blue_grey.webp │ ├── ic_launcher_brown.webp │ ├── ic_launcher_cyan.webp │ ├── ic_launcher_deep_orange.webp │ ├── ic_launcher_deep_purple.webp │ ├── ic_launcher_grey_black.webp │ ├── ic_launcher_indigo.webp │ ├── ic_launcher_light_blue.webp │ ├── ic_launcher_light_green.webp │ ├── ic_launcher_lime.webp │ ├── ic_launcher_orange.webp │ ├── ic_launcher_pink.webp │ ├── ic_launcher_purple.webp │ ├── ic_launcher_red.webp │ ├── ic_launcher_teal.webp │ └── ic_launcher_yellow.webp │ ├── raw │ └── playpause.json │ ├── values-ar │ └── strings.xml │ ├── values-az │ └── strings.xml │ ├── values-b+es+419 │ └── strings.xml │ ├── values-be │ └── strings.xml │ ├── values-bg │ └── strings.xml │ ├── values-bn-rBD │ └── strings.xml │ ├── values-bn │ └── strings.xml │ ├── values-br │ └── strings.xml │ ├── values-bs │ └── strings.xml │ ├── values-ca │ └── strings.xml │ ├── values-ckb │ └── strings.xml │ ├── values-cr │ └── strings.xml │ ├── values-cs │ └── strings.xml │ ├── values-cy │ └── strings.xml │ ├── values-da │ └── strings.xml │ ├── values-de │ └── strings.xml │ ├── values-el │ └── strings.xml │ ├── values-en-rGB │ └── strings.xml │ ├── values-en-rIN │ └── strings.xml │ ├── values-eo │ └── strings.xml │ ├── values-es-rUS │ └── strings.xml │ ├── values-es │ └── strings.xml │ ├── values-et │ └── strings.xml │ ├── values-eu │ └── strings.xml │ ├── values-fa │ └── strings.xml │ ├── values-fi │ └── strings.xml │ ├── values-fil │ └── strings.xml │ ├── values-fr │ └── strings.xml │ ├── values-ga │ └── strings.xml │ ├── values-gl │ └── strings.xml │ ├── values-hi │ └── strings.xml │ ├── values-hr │ └── strings.xml │ ├── values-hu │ └── strings.xml │ ├── values-ia │ └── strings.xml │ ├── values-in │ └── strings.xml │ ├── values-is │ └── strings.xml │ ├── values-it │ └── strings.xml │ ├── values-iw │ └── strings.xml │ ├── values-ja │ └── strings.xml │ ├── values-kn │ └── strings.xml │ ├── values-ko-rKR │ └── strings.xml │ ├── values-kr │ └── strings.xml │ ├── values-land │ └── dimens.xml │ ├── values-lt │ └── strings.xml │ ├── values-ltg │ └── strings.xml │ ├── values-lv │ └── strings.xml │ ├── values-mk │ └── strings.xml │ ├── values-ml │ └── strings.xml │ ├── values-ms │ └── strings.xml │ ├── values-my │ └── strings.xml │ ├── values-nb-rNO │ └── strings.xml │ ├── values-ne │ └── strings.xml │ ├── values-nl │ └── strings.xml │ ├── values-nn │ └── strings.xml │ ├── values-or │ └── strings.xml │ ├── values-pa-rPK │ └── strings.xml │ ├── values-pa │ └── strings.xml │ ├── values-pl │ └── strings.xml │ ├── values-pt-rBR │ └── strings.xml │ ├── values-pt-rPT │ └── strings.xml │ ├── values-pt │ └── strings.xml │ ├── values-ro │ └── strings.xml │ ├── values-ru │ └── strings.xml │ ├── values-sat │ └── strings.xml │ ├── values-si │ └── strings.xml │ ├── values-sk │ └── strings.xml │ ├── values-sl │ └── strings.xml │ ├── values-so │ └── strings.xml │ ├── values-sr │ └── strings.xml │ ├── values-sv │ └── strings.xml │ ├── values-ta │ └── strings.xml │ ├── values-te │ └── strings.xml │ ├── values-th │ └── strings.xml │ ├── values-tr │ └── strings.xml │ ├── values-uk │ └── strings.xml │ ├── values-vi │ └── strings.xml │ ├── values-zgh │ └── strings.xml │ ├── values-zh-rCN │ └── strings.xml │ ├── values-zh-rHK │ └── strings.xml │ ├── values-zh-rTW │ └── strings.xml │ ├── values │ ├── colors.xml │ ├── dimens.xml │ ├── donottranslate.xml │ ├── drawables.xml │ ├── ic_launcher_background.xml │ ├── integers.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ ├── automotive_app_desc.xml │ ├── provider_paths.xml │ ├── searchable.xml │ └── widget_info.xml ├── build.gradle.kts ├── fastlane ├── Appfile ├── Fastfile ├── README.md └── metadata │ └── android │ ├── ca │ ├── full_description.txt │ └── short_description.txt │ ├── cs-CZ │ ├── full_description.txt │ └── short_description.txt │ ├── da-DK │ └── short_description.txt │ ├── de-DE │ ├── full_description.txt │ └── short_description.txt │ ├── en-US │ ├── changelogs │ │ ├── 1.txt │ │ └── 2.txt │ ├── full_description.txt │ ├── images │ │ ├── featureGraphic.png │ │ ├── icon.png │ │ ├── phoneScreenshots │ │ │ ├── 1_en-US.png │ │ │ ├── 2_en-US.png │ │ │ ├── 3_en-US.png │ │ │ ├── 4_en-US.png │ │ │ └── 5_en-US.png │ │ └── tenInchScreenshots │ │ │ ├── 1_en-US.png │ │ │ ├── 2_en-US.png │ │ │ ├── 3_en-US.png │ │ │ ├── 4_en-US.png │ │ │ └── 5_en-US.png │ ├── short_description.txt │ └── title.txt │ ├── eo │ └── short_description.txt │ ├── es-ES │ ├── full_description.txt │ └── short_description.txt │ ├── et │ └── short_description.txt │ ├── eu-ES │ ├── full_description.txt │ └── short_description.txt │ ├── fi-FI │ ├── full_description.txt │ └── short_description.txt │ ├── gl-ES │ └── short_description.txt │ ├── hi-IN │ ├── full_description.txt │ └── short_description.txt │ ├── hu-HU │ ├── full_description.txt │ └── short_description.txt │ ├── it-IT │ ├── full_description.txt │ └── short_description.txt │ ├── iw-IL │ ├── full_description.txt │ └── short_description.txt │ ├── nl-NL │ └── short_description.txt │ ├── pl-PL │ ├── full_description.txt │ └── short_description.txt │ ├── ru-RU │ ├── full_description.txt │ └── short_description.txt │ ├── sv-SE │ └── short_description.txt │ ├── tr-TR │ └── short_description.txt │ ├── uk │ ├── full_description.txt │ └── short_description.txt │ ├── zh-CN │ ├── full_description.txt │ └── short_description.txt │ └── zh-TW │ └── short_description.txt ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── graphics ├── featureGraphic.png ├── foreground.svg ├── icon.svg └── icon.webp ├── keystore.properties_sample └── settings.gradle.kts /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig 2 | # http://EditorConfig.org 3 | 4 | # top-most EditorConfig file 5 | root = true 6 | 7 | # LF end-of-line, insert an empty new line and UTF-8 8 | [*] 9 | end_of_line = lf 10 | insert_final_newline = true 11 | charset = utf-8 12 | indent_style = space 13 | indent_size = 4 14 | continuation_indent_size = 4 15 | max_line_length = 160 16 | 17 | [*.xml] 18 | continuation_indent_size = 4 19 | 20 | [*.kt] 21 | ij_kotlin_name_count_to_use_star_import = 5 22 | ij_kotlin_name_count_to_use_star_import_for_members = 5 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Questions 4 | url: https://github.com/FossifyOrg/Music-Player/discussions 5 | about: Please ask and answer questions here. -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | registries: 4 | maven-google: 5 | type: maven-repository 6 | url: "https://dl.google.com/dl/android/maven2/" 7 | 8 | maven-central: 9 | type: maven-repository 10 | url: "https://repo.maven.apache.org/maven2" 11 | 12 | jitpack: 13 | type: maven-repository 14 | url: "https://jitpack.io" 15 | 16 | updates: 17 | - package-ecosystem: "bundler" 18 | directory: "/" 19 | schedule: 20 | interval: "weekly" 21 | commit-message: 22 | prefix: "chore" 23 | prefix-development: "chore" 24 | include: "scope" 25 | assignees: 26 | - "naveensingh" 27 | 28 | - package-ecosystem: "gradle" 29 | directory: "/" 30 | registries: 31 | - maven-central 32 | - maven-google 33 | - jitpack 34 | schedule: 35 | interval: "weekly" 36 | commit-message: 37 | prefix: "chore" 38 | prefix-development: "chore" 39 | include: "scope" 40 | assignees: 41 | - "naveensingh" 42 | 43 | - package-ecosystem: "github-actions" 44 | directory: "/" 45 | schedule: 46 | interval: "weekly" 47 | commit-message: 48 | prefix: "chore" 49 | prefix-development: "chore" 50 | include: "scope" 51 | assignees: 52 | - "naveensingh" 53 | -------------------------------------------------------------------------------- /.github/workflows/image-minimizer.yml: -------------------------------------------------------------------------------- 1 | name: Image Minimizer 2 | 3 | on: 4 | issue_comment: 5 | types: [created, edited] 6 | issues: 7 | types: [opened, edited] 8 | pull_request_target: 9 | types: [opened, edited] 10 | 11 | jobs: 12 | call-image-minimizer-workflow: 13 | uses: FossifyOrg/.github/.github/workflows/image-minimizer.yml@main 14 | secrets: inherit 15 | -------------------------------------------------------------------------------- /.github/workflows/no-response.yml: -------------------------------------------------------------------------------- 1 | name: No Response 2 | 3 | on: 4 | schedule: 5 | - cron: "0 12 * * *" # Runs daily at noon 6 | workflow_dispatch: 7 | 8 | jobs: 9 | call-no-response-workflow: 10 | uses: FossifyOrg/.github/.github/workflows/no-response.yml@main 11 | secrets: inherit 12 | -------------------------------------------------------------------------------- /.github/workflows/pr-labeler.yml: -------------------------------------------------------------------------------- 1 | name: PR Labeler 2 | 3 | on: 4 | pull_request_target: 5 | types: [opened] 6 | 7 | jobs: 8 | call-pr-labeler-workflow: 9 | uses: FossifyOrg/.github/.github/workflows/pr-labeler.yml@main 10 | secrets: inherit 11 | -------------------------------------------------------------------------------- /.github/workflows/pr.yml: -------------------------------------------------------------------------------- 1 | name: PR 2 | 3 | on: 4 | pull_request: 5 | branches: [ main ] 6 | 7 | jobs: 8 | call-pr-workflow: 9 | uses: FossifyOrg/.github/.github/workflows/pr.yml@main 10 | -------------------------------------------------------------------------------- /.github/workflows/prepare-release-pr.yml: -------------------------------------------------------------------------------- 1 | name: Prepare Release PR 2 | 3 | on: 4 | repository_dispatch: 5 | types: [prepare-release] 6 | workflow_dispatch: 7 | 8 | jobs: 9 | call-release-pr: 10 | uses: FossifyOrg/.github/.github/workflows/prepare-release-pr.yml@main 11 | secrets: inherit 12 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | paths: 7 | - ".fossify/release-marker.txt" 8 | 9 | jobs: 10 | call-release-workflow: 11 | name: Release 12 | uses: FossifyOrg/.github/.github/workflows/release.yml@main 13 | with: 14 | track: ${{ vars.GPLAY_TRACK || 'beta' }} 15 | rollout: ${{ vars.GPLAY_ROLLOUT || '0.05' }} 16 | validate_only: ${{ vars.GPLAY_DRY_RUN == 'true' }} 17 | secrets: inherit 18 | -------------------------------------------------------------------------------- /.github/workflows/testing-build.yml: -------------------------------------------------------------------------------- 1 | name: Testing build (on PR) 2 | 3 | on: 4 | pull_request: 5 | branches: [ main ] 6 | types: [ labeled, opened, synchronize, reopened ] 7 | 8 | jobs: 9 | call-testing-build-workflow: 10 | uses: FossifyOrg/.github/.github/workflows/testing-build.yml@main 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | *.aab 3 | .gradle 4 | /local.properties 5 | /.idea/ 6 | .DS_Store 7 | /build 8 | /captures 9 | keystore.jks 10 | keystore.properties 11 | fastlane/fastlane.json 12 | fastlane/report.xml 13 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [Unreleased] 9 | 10 | ## [1.1.0] - 2025-05-20 11 | 12 | ### Added 13 | 14 | - Support for displaying disc number in albums ([#18]) 15 | 16 | ### Changed 17 | 18 | - Turned off shuffle by default 19 | - Replaced checkboxes with switches 20 | - Previous button now supports replay ([#45]) 21 | 22 | ### Removed 23 | 24 | - Dropped support for Android 7 and older versions 25 | 26 | ### Fixed 27 | 28 | - Fixed track numbers displaying as 0 ([#47]) 29 | 30 | ## [1.0.0] - 2024-02-11 31 | 32 | ### Added 33 | 34 | - Initial release 35 | 36 | [Unreleased]: https://github.com/FossifyOrg/Music-Player/compare/1.1.0...HEAD 37 | [1.1.0]: https://github.com/FossifyOrg/Music-Player/compare/1.0.0...1.1.0 38 | [1.0.0]: https://github.com/FossifyOrg/Music-Player/releases/tag/1.0.0 39 | 40 | [#18]: https://github.com/FossifyOrg/Music-Player/issues/18 41 | [#45]: https://github.com/FossifyOrg/Music-Player/issues/45 42 | [#47]: https://github.com/FossifyOrg/Music-Player/issues/47 -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ### Reporting 2 | Before you report something, read the reporting rules [here](https://github.com/FossifyOrg/General-Discussion#how-do-i-suggest-an-improvement-ask-a-question-or-report-an-issue) please. 3 | 4 | ### Contributing as a developer 5 | Some instructions about code style and everything that has to be done to increase the chance of your code getting accepted can be found at the [General Discussion](https://github.com/FossifyOrg/General-Discussion#contribution-rules-for-developers) section. 6 | 7 | ### Contributing as a non developer 8 | In case you just want to for example improve a translation, you can find the way of doing it [here](https://github.com/FossifyOrg/General-Discussion#how-can-i-suggest-an-edit-to-a-file). 9 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | gem "fastlane-plugin-fossify", "~> 1.0" 5 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /schemas/ 3 | /foss/ 4 | /gplay/ 5 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Custom serializable 2 | -keepclassmembers class * implements java.io.Serializable { 3 | static final long serialVersionUID; 4 | java.lang.Object writeReplace(); 5 | java.lang.Object readResolve(); 6 | private static final java.io.ObjectStreamField[] serialPersistentFields; 7 | private ; 8 | public ; 9 | } 10 | 11 | # Gson uses generic type information stored in a class file when working with 12 | # fields. Proguard removes such information by default, keep it. 13 | -keepattributes Signature 14 | # This is also needed for R8 in compat mode since multiple optimizations will 15 | # remove the generic signature such as class merging and argument removal. 16 | -keep class com.google.gson.reflect.TypeToken { *; } 17 | -keep class * extends com.google.gson.reflect.TypeToken 18 | 19 | # EventBus 20 | -keepattributes *Annotation* 21 | -keepclassmembers class ** { 22 | @org.greenrobot.eventbus.Subscribe ; 23 | } 24 | -keep enum org.greenrobot.eventbus.ThreadMode { *; } 25 | -------------------------------------------------------------------------------- /app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Music Player_debug 4 | 5 | -------------------------------------------------------------------------------- /app/src/foss/res/values/bools.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | true 5 | true 6 | 7 | -------------------------------------------------------------------------------- /app/src/gplay/res/values/bools.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | false 5 | false 6 | true 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/App.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer 2 | 3 | import android.app.Application 4 | import androidx.lifecycle.DefaultLifecycleObserver 5 | import androidx.lifecycle.LifecycleOwner 6 | import androidx.lifecycle.ProcessLifecycleOwner 7 | import org.fossify.commons.extensions.checkUseEnglish 8 | import org.fossify.musicplayer.helpers.SimpleMediaController 9 | 10 | class App : Application() { 11 | override fun onCreate() { 12 | super.onCreate() 13 | checkUseEnglish() 14 | initController() 15 | } 16 | 17 | private fun initController() { 18 | SimpleMediaController.getInstance(applicationContext).createControllerAsync() 19 | ProcessLifecycleOwner.get().lifecycle.addObserver( 20 | object : DefaultLifecycleObserver { 21 | override fun onStop(owner: LifecycleOwner) { 22 | SimpleMediaController.destroyInstance() 23 | } 24 | } 25 | ) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/activities/ExcludedFoldersActivity.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.activities 2 | 3 | import android.os.Bundle 4 | import org.fossify.commons.extensions.beVisibleIf 5 | import org.fossify.commons.extensions.getProperTextColor 6 | import org.fossify.commons.extensions.viewBinding 7 | import org.fossify.commons.helpers.NavigationIcon 8 | import org.fossify.commons.interfaces.RefreshRecyclerViewListener 9 | import org.fossify.musicplayer.adapters.ExcludedFoldersAdapter 10 | import org.fossify.musicplayer.databinding.ActivityExcludedFoldersBinding 11 | import org.fossify.musicplayer.extensions.config 12 | 13 | class ExcludedFoldersActivity : SimpleActivity(), RefreshRecyclerViewListener { 14 | 15 | private val binding by viewBinding(ActivityExcludedFoldersBinding::inflate) 16 | 17 | override fun onCreate(savedInstanceState: Bundle?) { 18 | isMaterialActivity = true 19 | super.onCreate(savedInstanceState) 20 | setContentView(binding.root) 21 | 22 | updateMaterialActivityViews(binding.excludedFoldersCoordinator, binding.excludedFoldersList, useTransparentNavigation = true, useTopSearchMenu = false) 23 | setupMaterialScrollListener(binding.excludedFoldersList, binding.excludedFoldersToolbar) 24 | updateFolders() 25 | } 26 | 27 | override fun onResume() { 28 | super.onResume() 29 | setupToolbar(binding.excludedFoldersToolbar, NavigationIcon.Arrow) 30 | } 31 | 32 | private fun updateFolders() { 33 | val folders = config.excludedFolders.toMutableList() as ArrayList 34 | binding.excludedFoldersPlaceholder.apply { 35 | beVisibleIf(folders.isEmpty()) 36 | setTextColor(getProperTextColor()) 37 | } 38 | 39 | val adapter = ExcludedFoldersAdapter(this, folders, this, binding.excludedFoldersList) {} 40 | binding.excludedFoldersList.adapter = adapter 41 | } 42 | 43 | override fun refreshItems() { 44 | updateFolders() 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/activities/SimpleActivity.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.activities 2 | 3 | import org.fossify.commons.activities.BaseSimpleActivity 4 | import org.fossify.musicplayer.R 5 | import org.fossify.musicplayer.helpers.REPOSITORY_NAME 6 | 7 | open class SimpleActivity : BaseSimpleActivity() { 8 | override fun getAppIconIDs() = arrayListOf( 9 | R.mipmap.ic_launcher_red, 10 | R.mipmap.ic_launcher_pink, 11 | R.mipmap.ic_launcher_purple, 12 | R.mipmap.ic_launcher_deep_purple, 13 | R.mipmap.ic_launcher_indigo, 14 | R.mipmap.ic_launcher_blue, 15 | R.mipmap.ic_launcher_light_blue, 16 | R.mipmap.ic_launcher_cyan, 17 | R.mipmap.ic_launcher_teal, 18 | R.mipmap.ic_launcher, 19 | R.mipmap.ic_launcher_light_green, 20 | R.mipmap.ic_launcher_lime, 21 | R.mipmap.ic_launcher_yellow, 22 | R.mipmap.ic_launcher_amber, 23 | R.mipmap.ic_launcher_orange, 24 | R.mipmap.ic_launcher_deep_orange, 25 | R.mipmap.ic_launcher_brown, 26 | R.mipmap.ic_launcher_blue_grey, 27 | R.mipmap.ic_launcher_grey_black 28 | ) 29 | 30 | override fun getAppLauncherName() = getString(R.string.app_launcher_name) 31 | 32 | override fun getRepositoryName() = REPOSITORY_NAME 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/activities/SimpleMusicActivity.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.activities 2 | 3 | import android.content.Intent 4 | import androidx.annotation.CallSuper 5 | import androidx.media3.common.MediaItem 6 | import androidx.media3.common.Player 7 | import org.fossify.commons.dialogs.PermissionRequiredDialog 8 | import org.fossify.commons.extensions.hideKeyboard 9 | import org.fossify.commons.extensions.openNotificationSettings 10 | import org.fossify.musicplayer.extensions.isReallyPlaying 11 | import org.fossify.musicplayer.views.CurrentTrackBar 12 | 13 | /** 14 | * Base class for activities that want to control the player and display a [CurrentTrackBar] at the bottom. 15 | */ 16 | abstract class SimpleMusicActivity : SimpleControllerActivity(), Player.Listener { 17 | private var trackBarView: CurrentTrackBar? = null 18 | 19 | override fun onResume() { 20 | super.onResume() 21 | updateCurrentTrackBar() 22 | } 23 | 24 | fun setupCurrentTrackBar(trackBar: CurrentTrackBar) { 25 | trackBarView = trackBar 26 | trackBarView?.initialize(togglePlayback = ::togglePlayback) 27 | trackBarView?.setOnClickListener { 28 | hideKeyboard() 29 | handleNotificationPermission { granted -> 30 | if (granted) { 31 | Intent(this, TrackActivity::class.java).apply { 32 | startActivity(this) 33 | } 34 | } else { 35 | PermissionRequiredDialog(this, org.fossify.commons.R.string.allow_notifications_music_player, { openNotificationSettings() }) 36 | } 37 | } 38 | } 39 | } 40 | 41 | private fun updateCurrentTrackBar() { 42 | trackBarView?.apply { 43 | withPlayer { 44 | updateColors() 45 | updateCurrentTrack(currentMediaItem) 46 | updateTrackState(isReallyPlaying) 47 | } 48 | } 49 | } 50 | 51 | override fun onPlayerPrepared(success: Boolean) = updateCurrentTrackBar() 52 | 53 | @CallSuper 54 | override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) { 55 | trackBarView?.updateCurrentTrack(mediaItem) 56 | } 57 | 58 | @CallSuper 59 | override fun onPlaybackStateChanged(playbackState: Int) = withPlayer { 60 | trackBarView?.updateTrackState(isReallyPlaying) 61 | } 62 | 63 | @CallSuper 64 | override fun onIsPlayingChanged(isPlaying: Boolean) { 65 | trackBarView?.updateTrackState(isPlaying) 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/activities/SplashActivity.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.activities 2 | 3 | import android.content.Intent 4 | import org.fossify.commons.activities.BaseSplashActivity 5 | 6 | class SplashActivity : BaseSplashActivity() { 7 | override fun initActivity() { 8 | startActivity(Intent(this, MainActivity::class.java)) 9 | finish() 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/dialogs/ManageVisibleTabsDialog.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.dialogs 2 | 3 | import org.fossify.commons.activities.BaseSimpleActivity 4 | import org.fossify.commons.extensions.beGone 5 | import org.fossify.commons.extensions.getAlertDialogBuilder 6 | import org.fossify.commons.extensions.setupDialogStuff 7 | import org.fossify.commons.extensions.viewBinding 8 | import org.fossify.commons.helpers.isQPlus 9 | import org.fossify.commons.views.MyAppCompatCheckbox 10 | import org.fossify.musicplayer.databinding.DialogManageVisibleTabsBinding 11 | import org.fossify.musicplayer.extensions.config 12 | import org.fossify.musicplayer.helpers.* 13 | 14 | class ManageVisibleTabsDialog(val activity: BaseSimpleActivity, val callback: (result: Int) -> Unit) { 15 | private val binding by activity.viewBinding(DialogManageVisibleTabsBinding::inflate) 16 | private val tabs = LinkedHashMap() 17 | 18 | init { 19 | tabs.apply { 20 | put(TAB_PLAYLISTS, binding.manageVisibleTabsPlaylists) 21 | put(TAB_FOLDERS, binding.manageVisibleTabsFolders) 22 | put(TAB_ARTISTS, binding.manageVisibleTabsArtists) 23 | put(TAB_ALBUMS, binding.manageVisibleTabsAlbums) 24 | put(TAB_TRACKS, binding.manageVisibleTabsTracks) 25 | put(TAB_GENRES, binding.manageVisibleTabsGenres) 26 | } 27 | 28 | if (!isQPlus()) { 29 | tabs.remove(TAB_FOLDERS) 30 | binding.manageVisibleTabsFolders.beGone() 31 | } 32 | 33 | val showTabs = activity.config.showTabs 34 | for ((key, value) in tabs) { 35 | value.isChecked = showTabs and key != 0 36 | } 37 | 38 | activity.getAlertDialogBuilder() 39 | .setPositiveButton(org.fossify.commons.R.string.ok) { _, _ -> dialogConfirmed() } 40 | .setNegativeButton(org.fossify.commons.R.string.cancel, null) 41 | .apply { 42 | activity.setupDialogStuff(binding.root, this) 43 | } 44 | } 45 | 46 | private fun dialogConfirmed() { 47 | var result = 0 48 | for ((key, value) in tabs) { 49 | if (value.isChecked) { 50 | result += key 51 | } 52 | } 53 | 54 | if (result == 0) { 55 | result = allTabsMask 56 | } 57 | 58 | callback(result) 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/dialogs/RemovePlaylistDialog.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.dialogs 2 | 3 | import android.app.Activity 4 | import org.fossify.commons.extensions.getAlertDialogBuilder 5 | import org.fossify.commons.extensions.setupDialogStuff 6 | import org.fossify.commons.extensions.viewBinding 7 | import org.fossify.musicplayer.R 8 | import org.fossify.musicplayer.databinding.DialogRemovePlaylistBinding 9 | import org.fossify.musicplayer.models.Playlist 10 | 11 | class RemovePlaylistDialog(val activity: Activity, val playlist: Playlist? = null, val callback: (deleteFiles: Boolean) -> Unit) { 12 | private val binding by activity.viewBinding(DialogRemovePlaylistBinding::inflate) 13 | 14 | init { 15 | binding.removePlaylistDescription.text = getDescriptionText() 16 | activity.getAlertDialogBuilder() 17 | .setPositiveButton(org.fossify.commons.R.string.ok) { _, _ -> callback(binding.removePlaylistCheckbox.isChecked) } 18 | .setNegativeButton(org.fossify.commons.R.string.cancel, null) 19 | .apply { 20 | activity.setupDialogStuff(binding.root, this, R.string.remove_playlist) 21 | } 22 | } 23 | 24 | private fun getDescriptionText(): String { 25 | return if (playlist == null) { 26 | activity.getString(R.string.remove_playlist_description) 27 | } else 28 | String.format(activity.resources.getString(R.string.remove_playlist_description_placeholder), playlist.title) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/dialogs/SleepTimerCustomDialog.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.dialogs 2 | 3 | import android.app.Activity 4 | import androidx.appcompat.app.AlertDialog 5 | import org.fossify.commons.extensions.* 6 | import org.fossify.musicplayer.databinding.DialogCustomSleepTimerPickerBinding 7 | 8 | class SleepTimerCustomDialog(val activity: Activity, val callback: (seconds: Int) -> Unit) { 9 | private var dialog: AlertDialog? = null 10 | private val binding by activity.viewBinding(DialogCustomSleepTimerPickerBinding::inflate) 11 | 12 | init { 13 | binding.minutesHint.hint = activity.getString(org.fossify.commons.R.string.minutes_raw).replaceFirstChar { it.uppercaseChar() } 14 | activity.getAlertDialogBuilder() 15 | .setPositiveButton(org.fossify.commons.R.string.ok) { _, _ -> dialogConfirmed() } 16 | .setNegativeButton(org.fossify.commons.R.string.cancel, null) 17 | .apply { 18 | activity.setupDialogStuff(binding.root, this, org.fossify.commons.R.string.sleep_timer) { alertDialog -> 19 | dialog = alertDialog 20 | alertDialog.showKeyboard(binding.minutes) 21 | } 22 | } 23 | } 24 | 25 | private fun dialogConfirmed() { 26 | val value = binding.minutes.value 27 | val minutes = Integer.valueOf(value.ifEmpty { "0" }) 28 | callback(minutes * 60) 29 | activity.hideKeyboard() 30 | dialog?.dismiss() 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/extensions/Future.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.extensions 2 | 3 | import com.google.common.util.concurrent.ListenableFuture 4 | import java.util.concurrent.CancellationException 5 | import java.util.concurrent.ExecutionException 6 | import java.util.concurrent.TimeUnit 7 | import java.util.concurrent.TimeoutException 8 | 9 | fun ListenableFuture.getOrNull(timeout: Long = 15000L, unit: TimeUnit = TimeUnit.MILLISECONDS) = try { 10 | get(timeout, unit) as T 11 | } catch (e: CancellationException) { 12 | null 13 | } catch (e: ExecutionException) { 14 | null 15 | } catch (e: TimeoutException) { 16 | null 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/extensions/Looper.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.extensions 2 | 3 | import android.os.Handler 4 | import android.os.Looper 5 | 6 | fun Looper.post(callback: () -> Unit) = Handler(this).post(callback) 7 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/extensions/LottieAnimationView.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.extensions 2 | 3 | import android.graphics.PorterDuff 4 | import android.graphics.PorterDuffColorFilter 5 | import com.airbnb.lottie.LottieAnimationView 6 | import com.airbnb.lottie.LottieProperty 7 | import com.airbnb.lottie.model.KeyPath 8 | 9 | fun LottieAnimationView.updatePlayPauseIcon(isPlaying: Boolean, color: Int) { 10 | val wasNull = tag == null 11 | if (tag != isPlaying) { 12 | speed = if (isPlaying) 2.5f else -2.5f 13 | 14 | if (wasNull) { 15 | progress = if (isPlaying) 1f else 0f 16 | } else { 17 | playAnimation() 18 | } 19 | 20 | tag = isPlaying 21 | } 22 | 23 | addValueCallback( 24 | KeyPath("**"), 25 | LottieProperty.COLOR_FILTER 26 | ) { PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN) } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/extensions/MediaController.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.extensions 2 | 3 | import android.os.Bundle 4 | import androidx.media3.session.MediaController 5 | import org.fossify.musicplayer.playback.CustomCommands 6 | 7 | fun MediaController.sendCommand(command: CustomCommands, extras: Bundle = Bundle.EMPTY) = sendCustomCommand(command.sessionCommand, extras) 8 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/extensions/MutableList.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.extensions 2 | 3 | fun MutableList.sortSafely(comparator: Comparator) { 4 | try { 5 | sortWith(comparator) 6 | } catch (ignored: Exception) { 7 | } 8 | } 9 | 10 | fun MutableList.move(currentIndex: Int, newIndex: Int) { 11 | val itemToMove = removeAt(currentIndex) 12 | if (currentIndex > newIndex) { 13 | add(newIndex, itemToMove) 14 | } else { 15 | add(newIndex - 1, itemToMove) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/extensions/RecyclerView.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.extensions 2 | 3 | import androidx.recyclerview.widget.LinearLayoutManager 4 | import androidx.recyclerview.widget.RecyclerView 5 | 6 | fun RecyclerView.lazySmoothScroll(scrollToPosition: Int) { 7 | val layoutManager = layoutManager 8 | if (layoutManager is LinearLayoutManager) { 9 | if (scrollToPosition in layoutManager.findFirstCompletelyVisibleItemPosition()..layoutManager.findLastCompletelyVisibleItemPosition()) { 10 | return 11 | } 12 | } 13 | 14 | if (scrollToPosition > 100) { 15 | post { 16 | scrollToPosition(scrollToPosition - 25) 17 | smoothScrollToPosition(scrollToPosition) 18 | } 19 | } else { 20 | smoothScrollToPosition(scrollToPosition) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/extensions/Resources.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.extensions 2 | 3 | import android.content.res.Resources 4 | import android.graphics.Bitmap 5 | import android.graphics.drawable.BitmapDrawable 6 | import android.graphics.drawable.Drawable 7 | import org.fossify.commons.extensions.applyColorFilter 8 | import org.fossify.musicplayer.R 9 | 10 | fun Resources.getSmallPlaceholder(color: Int): Drawable { 11 | val placeholder = getDrawable(R.drawable.ic_headset_padded) 12 | val resized = resizeDrawable(placeholder, getDimension(R.dimen.song_image_size).toInt()) 13 | resized.applyColorFilter(color) 14 | return resized 15 | } 16 | 17 | fun Resources.getBiggerPlaceholder(color: Int): Drawable { 18 | val placeholder = getDrawable(R.drawable.ic_headset) 19 | val resized = resizeDrawable(placeholder, getDimension(R.dimen.artist_image_size).toInt()) 20 | resized.applyColorFilter(color) 21 | return resized 22 | } 23 | 24 | fun Resources.resizeDrawable(drawable: Drawable, size: Int): Drawable { 25 | val bitmap = (drawable as BitmapDrawable).bitmap 26 | val bitmapResized = Bitmap.createScaledBitmap(bitmap, size, size, false) 27 | return BitmapDrawable(this, bitmapResized) 28 | } 29 | 30 | private var coverArtHeight: Int = 0 31 | fun Resources.getCoverArtHeight(): Int { 32 | return if (coverArtHeight == 0) { 33 | getDimension(R.dimen.top_art_height).toInt() 34 | } else { 35 | coverArtHeight 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/extensions/View.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.extensions 2 | 3 | import android.view.View 4 | import androidx.viewbinding.ViewBinding 5 | 6 | inline fun View.viewBinding(crossinline bind: (View) -> T) = 7 | lazy(LazyThreadSafetyMode.NONE) { 8 | bind(this) 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/fragments/MyViewPagerFragment.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.fragments 2 | 3 | import android.content.Context 4 | import android.util.AttributeSet 5 | import android.widget.RelativeLayout 6 | import org.fossify.commons.activities.BaseSimpleActivity 7 | import org.fossify.musicplayer.activities.SimpleActivity 8 | import org.fossify.musicplayer.activities.SimpleControllerActivity 9 | import org.fossify.musicplayer.models.Track 10 | 11 | abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : RelativeLayout(context, attributeSet) { 12 | abstract fun setupFragment(activity: BaseSimpleActivity) 13 | 14 | abstract fun finishActMode() 15 | 16 | abstract fun onSearchQueryChanged(text: String) 17 | 18 | abstract fun onSearchClosed() 19 | 20 | abstract fun onSortOpen(activity: SimpleActivity) 21 | 22 | abstract fun setupColors(textColor: Int, adjustedPrimaryColor: Int) 23 | 24 | fun prepareAndPlay(tracks: List, startIndex: Int = 0, startPositionMs: Long = 0, startActivity: Boolean = true) { 25 | (context as SimpleControllerActivity).prepareAndPlay(tracks, startIndex, startPositionMs, startActivity) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/helpers/M3uExporter.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.helpers 2 | 3 | import org.fossify.commons.activities.BaseSimpleActivity 4 | import org.fossify.commons.extensions.showErrorToast 5 | import org.fossify.commons.extensions.toast 6 | import org.fossify.commons.extensions.writeLn 7 | import org.fossify.musicplayer.models.Track 8 | import java.io.OutputStream 9 | 10 | class M3uExporter(val activity: BaseSimpleActivity) { 11 | var failedEvents = 0 12 | var exportedEvents = 0 13 | 14 | enum class ExportResult { 15 | EXPORT_FAIL, EXPORT_OK, EXPORT_PARTIAL 16 | } 17 | 18 | fun exportPlaylist( 19 | outputStream: OutputStream?, 20 | tracks: ArrayList, 21 | callback: (result: ExportResult) -> Unit 22 | ) { 23 | if (outputStream == null) { 24 | callback(ExportResult.EXPORT_FAIL) 25 | return 26 | } 27 | 28 | activity.toast(org.fossify.commons.R.string.exporting) 29 | 30 | try { 31 | outputStream.bufferedWriter().use { out -> 32 | out.writeLn(M3U_HEADER) 33 | for (track in tracks) { 34 | out.writeLn(M3U_ENTRY + track.duration + M3U_DURATION_SEPARATOR + track.artist + " - " + track.title) 35 | out.writeLn(track.path) 36 | exportedEvents++ 37 | } 38 | } 39 | } catch (e: Exception) { 40 | failedEvents++ 41 | activity.showErrorToast(e) 42 | } finally { 43 | outputStream.close() 44 | } 45 | 46 | callback( 47 | when { 48 | exportedEvents == 0 -> ExportResult.EXPORT_FAIL 49 | failedEvents > 0 -> ExportResult.EXPORT_PARTIAL 50 | else -> ExportResult.EXPORT_OK 51 | } 52 | ) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/helpers/M3uImporter.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.helpers 2 | 3 | import net.bjoernpetersen.m3u.M3uParser 4 | import net.bjoernpetersen.m3u.model.M3uEntry 5 | import org.fossify.commons.extensions.showErrorToast 6 | import org.fossify.musicplayer.activities.SimpleActivity 7 | import org.fossify.musicplayer.extensions.audioHelper 8 | import org.fossify.musicplayer.models.Track 9 | import java.io.File 10 | 11 | class M3uImporter( 12 | val activity: SimpleActivity, 13 | val callback: (result: ImportResult) -> Unit 14 | ) { 15 | var failedEvents = 0 16 | var exportedEvents = 0 17 | 18 | enum class ImportResult { 19 | IMPORT_FAIL, IMPORT_OK, IMPORT_PARTIAL 20 | } 21 | 22 | fun importPlaylist(path: String, playListId: Int) { 23 | val inputStream = if (path.contains("/")) { 24 | File(path).inputStream() 25 | } else { 26 | activity.assets.open(path) 27 | } 28 | 29 | try { 30 | val m3uEntries: List = M3uParser.parse(inputStream.reader()) 31 | 32 | val existingTracks = activity.audioHelper.getAllTracks() 33 | .filter { it.playListId == 0 } 34 | 35 | val playlistItems = mutableListOf() 36 | for (m3uEntry in m3uEntries) { 37 | for (track in existingTracks) { 38 | if (m3uEntry.location.toString() == track.path || m3uEntry.title == track.title) { 39 | val copy = track.copy(id = 0, playListId = playListId) 40 | playlistItems.add(copy) 41 | } 42 | } 43 | } 44 | 45 | activity.audioHelper.insertTracks(playlistItems) 46 | exportedEvents = playlistItems.size 47 | } catch (e: Exception) { 48 | failedEvents++ 49 | activity.showErrorToast(e) 50 | } finally { 51 | inputStream.close() 52 | } 53 | 54 | callback( 55 | when { 56 | exportedEvents == 0 -> ImportResult.IMPORT_FAIL 57 | failedEvents > 0 -> ImportResult.IMPORT_PARTIAL 58 | else -> ImportResult.IMPORT_OK 59 | } 60 | ) 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/helpers/PlaybackSetting.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.helpers 2 | 3 | import androidx.annotation.DrawableRes 4 | import androidx.annotation.StringRes 5 | import org.fossify.musicplayer.R 6 | 7 | enum class PlaybackSetting( 8 | @DrawableRes val iconRes: Int, 9 | @StringRes val descriptionStringRes: Int 10 | ) { 11 | REPEAT_OFF( 12 | iconRes = R.drawable.ic_repeat_playlist_vector, 13 | descriptionStringRes = R.string.repeat_off 14 | ), 15 | REPEAT_PLAYLIST( 16 | iconRes = R.drawable.ic_repeat_playlist_vector, 17 | descriptionStringRes = R.string.repeat_playlist 18 | ), 19 | REPEAT_TRACK( 20 | iconRes = R.drawable.ic_repeat_one_song_vector, 21 | descriptionStringRes = R.string.repeat_song 22 | ), 23 | STOP_AFTER_CURRENT_TRACK( 24 | iconRes = R.drawable.ic_play_one_song_vector, 25 | descriptionStringRes = R.string.stop_playback_after_current_song 26 | ); 27 | 28 | val contentDescriptionStringRes: Int 29 | @StringRes get() = nextPlaybackOption.descriptionStringRes 30 | 31 | val nextPlaybackOption: PlaybackSetting 32 | get() = when (this) { 33 | REPEAT_OFF -> REPEAT_PLAYLIST 34 | REPEAT_PLAYLIST -> REPEAT_TRACK 35 | REPEAT_TRACK -> STOP_AFTER_CURRENT_TRACK 36 | STOP_AFTER_CURRENT_TRACK -> REPEAT_OFF 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/inlines/Int.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.inlines 2 | 3 | inline fun Collection.indexOfFirstOrNull(predicate: (T) -> Boolean): Int? { 4 | for ((index, item) in this.withIndex()) { 5 | if (predicate(item)) 6 | return index 7 | } 8 | return null 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/interfaces/AlbumsDao.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.interfaces 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import org.fossify.musicplayer.models.Album 8 | 9 | @Dao 10 | interface AlbumsDao { 11 | @Insert(onConflict = OnConflictStrategy.REPLACE) 12 | fun insert(album: Album): Long 13 | 14 | @Insert(onConflict = OnConflictStrategy.REPLACE) 15 | fun insertAll(albums: List) 16 | 17 | @Query("SELECT * FROM albums") 18 | fun getAll(): List 19 | 20 | @Query("SELECT * FROM albums WHERE id = :id") 21 | fun getAlbumWithId(id: Long): Album? 22 | 23 | @Query("SELECT * FROM albums WHERE artist_id = :artistId") 24 | fun getArtistAlbums(artistId: Long): List 25 | 26 | @Query("DELETE FROM albums WHERE id = :id") 27 | fun deleteAlbum(id: Long) 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/interfaces/ArtistsDao.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.interfaces 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import org.fossify.musicplayer.models.Artist 8 | 9 | @Dao 10 | interface ArtistsDao { 11 | @Insert(onConflict = OnConflictStrategy.REPLACE) 12 | fun insert(artist: Artist): Long 13 | 14 | @Insert(onConflict = OnConflictStrategy.REPLACE) 15 | fun insertAll(artists: List) 16 | 17 | @Query("SELECT * FROM artists") 18 | fun getAll(): List 19 | 20 | @Query("DELETE FROM artists WHERE id = :id") 21 | fun deleteArtist(id: Long) 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/interfaces/GenresDao.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.interfaces 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import org.fossify.musicplayer.models.Genre 8 | 9 | @Dao 10 | interface GenresDao { 11 | @Insert(onConflict = OnConflictStrategy.REPLACE) 12 | fun insert(genre: Genre): Long 13 | 14 | @Query("SELECT * FROM genres") 15 | fun getAll(): List 16 | 17 | @Query("DELETE FROM genres WHERE id = :id") 18 | fun deleteGenre(id: Long) 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/interfaces/PlaybackSpeedListener.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.interfaces 2 | 3 | interface PlaybackSpeedListener { 4 | fun updatePlaybackSpeed(speed: Float) 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/interfaces/PlaylistsDao.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.interfaces 2 | 3 | import androidx.room.* 4 | import org.fossify.musicplayer.models.Playlist 5 | 6 | @Dao 7 | interface PlaylistsDao { 8 | @Insert(onConflict = OnConflictStrategy.REPLACE) 9 | fun insert(playlist: Playlist): Long 10 | 11 | @Delete 12 | fun deletePlaylists(playlists: List) 13 | 14 | @Query("SELECT * FROM playlists") 15 | fun getAll(): List 16 | 17 | @Query("SELECT * FROM playlists WHERE title = :title COLLATE NOCASE") 18 | fun getPlaylistWithTitle(title: String): Playlist? 19 | 20 | @Query("SELECT * FROM playlists WHERE id = :id") 21 | fun getPlaylistWithId(id: Int): Playlist? 22 | 23 | @Update 24 | fun update(playlist: Playlist) 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/interfaces/QueueItemsDao.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.interfaces 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import org.fossify.musicplayer.models.QueueItem 8 | 9 | @Dao 10 | interface QueueItemsDao { 11 | @Insert(onConflict = OnConflictStrategy.REPLACE) 12 | fun insertAll(queueItems: List) 13 | 14 | @Query("SELECT * FROM queue_items ORDER BY track_order") 15 | fun getAll(): List 16 | 17 | @Query("UPDATE queue_items SET is_current = 0") 18 | fun resetCurrent() 19 | 20 | @Query("SELECT * FROM queue_items WHERE is_current = 1") 21 | fun getCurrent(): QueueItem? 22 | 23 | @Query("UPDATE queue_items SET is_current = 1 WHERE track_id = :trackId") 24 | fun saveCurrentTrack(trackId: Long) 25 | 26 | @Query("UPDATE queue_items SET is_current = 1, last_position = :lastPosition WHERE track_id = :trackId") 27 | fun saveCurrentTrackProgress(trackId: Long, lastPosition: Int) 28 | 29 | @Query("UPDATE queue_items SET track_order = :order WHERE track_id = :trackId") 30 | fun setOrder(trackId: Long, order: Int) 31 | 32 | @Query("DELETE FROM queue_items WHERE track_id = :trackId") 33 | fun removeQueueItem(trackId: Long) 34 | 35 | @Query("DELETE FROM queue_items") 36 | fun deleteAllItems() 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/interfaces/SongsDao.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.interfaces 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.OnConflictStrategy 6 | import androidx.room.Query 7 | import org.fossify.musicplayer.models.Track 8 | 9 | @Dao 10 | interface SongsDao { 11 | @Insert(onConflict = OnConflictStrategy.REPLACE) 12 | fun insert(track: Track) 13 | 14 | @Insert(onConflict = OnConflictStrategy.REPLACE) 15 | fun insertAll(tracks: List) 16 | 17 | @Query("SELECT * FROM tracks") 18 | fun getAll(): List 19 | 20 | @Query("SELECT * FROM tracks WHERE playlist_id = :playlistId") 21 | fun getTracksFromPlaylist(playlistId: Int): List 22 | 23 | @Query("SELECT * FROM tracks WHERE artist_id = :artistId") 24 | fun getTracksFromArtist(artistId: Long): List 25 | 26 | @Query("SELECT * FROM tracks WHERE album_id = :albumId") 27 | fun getTracksFromAlbum(albumId: Long): List 28 | 29 | @Query("SELECT COUNT(*) FROM tracks WHERE playlist_id = :playlistId") 30 | fun getTracksCountFromPlaylist(playlistId: Int): Int 31 | 32 | @Query("SELECT * FROM tracks WHERE folder_name = :folderName COLLATE NOCASE GROUP BY media_store_id") 33 | fun getTracksFromFolder(folderName: String): List 34 | 35 | @Query("SELECT * FROM tracks WHERE media_store_id = :mediaStoreId") 36 | fun getTrackWithMediaStoreId(mediaStoreId: Long): Track? 37 | 38 | @Query("SELECT * FROM tracks WHERE genre_id = :genreId") 39 | fun getGenreTracks(genreId: Long): List 40 | 41 | @Query("DELETE FROM tracks WHERE media_store_id = :mediaStoreId") 42 | fun removeTrack(mediaStoreId: Long) 43 | 44 | @Query("DELETE FROM tracks WHERE playlist_id = :playlistId") 45 | fun removePlaylistSongs(playlistId: Int) 46 | 47 | @Query("UPDATE tracks SET path = :newPath, artist = :artist, title = :title WHERE path = :oldPath") 48 | fun updateSongInfo(newPath: String, artist: String, title: String, oldPath: String) 49 | 50 | @Query("UPDATE tracks SET cover_art = :coverArt WHERE media_store_id = :id") 51 | fun updateCoverArt(coverArt: String, id: Long) 52 | 53 | @Query("UPDATE tracks SET order_in_playlist = :index WHERE id = :id") 54 | fun updateOrderInPlaylist(index: Int, id: Long) 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/models/AlbumHeader.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.models 2 | 3 | data class AlbumHeader(val id: Long, val title: String, val coverArt: Any, val year: Int, val trackCnt: Int, val duration: Int, val artist: String) : ListItem() 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/models/AlbumSection.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.models 2 | 3 | data class AlbumSection(val title: String) : ListItem() 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/models/Artist.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.models 2 | 3 | import android.provider.MediaStore 4 | import androidx.room.ColumnInfo 5 | import androidx.room.Entity 6 | import androidx.room.Index 7 | import androidx.room.PrimaryKey 8 | import org.fossify.commons.helpers.AlphanumericComparator 9 | import org.fossify.commons.helpers.SORT_DESCENDING 10 | import org.fossify.musicplayer.extensions.sortSafely 11 | import org.fossify.musicplayer.helpers.PLAYER_SORT_BY_ALBUM_COUNT 12 | import org.fossify.musicplayer.helpers.PLAYER_SORT_BY_TITLE 13 | 14 | @Entity(tableName = "artists", indices = [(Index(value = ["id"], unique = true))]) 15 | data class Artist( 16 | @PrimaryKey(autoGenerate = true) var id: Long, 17 | @ColumnInfo(name = "title") val title: String, 18 | @ColumnInfo(name = "album_cnt") var albumCnt: Int, 19 | @ColumnInfo(name = "track_cnt") var trackCnt: Int, 20 | @ColumnInfo(name = "album_art") var albumArt: String 21 | ) { 22 | companion object { 23 | fun getComparator(sorting: Int) = Comparator { first, second -> 24 | var result = when { 25 | sorting and PLAYER_SORT_BY_TITLE != 0 -> { 26 | when { 27 | first.title == MediaStore.UNKNOWN_STRING && second.title != MediaStore.UNKNOWN_STRING -> 1 28 | first.title != MediaStore.UNKNOWN_STRING && second.title == MediaStore.UNKNOWN_STRING -> -1 29 | else -> AlphanumericComparator().compare(first.title.lowercase(), second.title.lowercase()) 30 | } 31 | } 32 | 33 | sorting and PLAYER_SORT_BY_ALBUM_COUNT != 0 -> first.albumCnt.compareTo(second.albumCnt) 34 | else -> first.trackCnt.compareTo(second.trackCnt) 35 | } 36 | 37 | if (sorting and SORT_DESCENDING != 0) { 38 | result *= -1 39 | } 40 | 41 | return@Comparator result 42 | } 43 | } 44 | 45 | fun getBubbleText(sorting: Int) = when { 46 | sorting and PLAYER_SORT_BY_TITLE != 0 -> title 47 | sorting and PLAYER_SORT_BY_ALBUM_COUNT != 0 -> albumCnt.toString() 48 | else -> trackCnt.toString() 49 | } 50 | } 51 | 52 | fun ArrayList.sortSafely(sorting: Int) = sortSafely(Artist.getComparator(sorting)) 53 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/models/Events.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.models 2 | 3 | class Events { 4 | class SleepTimerChanged(val seconds: Int) 5 | class PlaylistsUpdated 6 | class RefreshFragments 7 | class RefreshTracks 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/models/Folder.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.models 2 | 3 | import org.fossify.commons.helpers.AlphanumericComparator 4 | import org.fossify.commons.helpers.SORT_DESCENDING 5 | import org.fossify.musicplayer.extensions.sortSafely 6 | import org.fossify.musicplayer.helpers.PLAYER_SORT_BY_TITLE 7 | 8 | data class Folder(val title: String, val trackCount: Int, val path: String) { 9 | companion object { 10 | fun getComparator(sorting: Int) = Comparator { first, second -> 11 | var result = when { 12 | sorting and PLAYER_SORT_BY_TITLE != 0 -> AlphanumericComparator().compare(first.title.lowercase(), second.title.lowercase()) 13 | else -> first.trackCount.compareTo(second.trackCount) 14 | } 15 | 16 | if (sorting and SORT_DESCENDING != 0) { 17 | result *= -1 18 | } 19 | 20 | return@Comparator result 21 | } 22 | } 23 | 24 | fun getBubbleText(sorting: Int) = when { 25 | sorting and PLAYER_SORT_BY_TITLE != 0 -> title 26 | else -> trackCount.toString() 27 | } 28 | } 29 | 30 | fun ArrayList.sortSafely(sorting: Int) = sortSafely(Folder.getComparator(sorting)) 31 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/models/Genre.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.models 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.Index 6 | import androidx.room.PrimaryKey 7 | import org.fossify.commons.helpers.AlphanumericComparator 8 | import org.fossify.commons.helpers.SORT_DESCENDING 9 | import org.fossify.musicplayer.extensions.sortSafely 10 | import org.fossify.musicplayer.helpers.PLAYER_SORT_BY_TITLE 11 | 12 | @Entity("genres", indices = [(Index(value = ["id"], unique = true))]) 13 | data class Genre( 14 | @PrimaryKey(autoGenerate = true) var id: Long, 15 | @ColumnInfo(name = "title") val title: String, 16 | @ColumnInfo(name = "track_cnt") var trackCnt: Int, 17 | @ColumnInfo(name = "album_art") var albumArt: String 18 | ) { 19 | companion object { 20 | fun getComparator(sorting: Int) = Comparator { first, second -> 21 | var result = when { 22 | sorting and PLAYER_SORT_BY_TITLE != 0 -> AlphanumericComparator().compare(first.title.lowercase(), second.title.lowercase()) 23 | else -> first.trackCnt.compareTo(second.trackCnt) 24 | } 25 | 26 | if (sorting and SORT_DESCENDING != 0) { 27 | result *= -1 28 | } 29 | 30 | return@Comparator result 31 | } 32 | } 33 | 34 | fun getBubbleText(sorting: Int) = when { 35 | sorting and PLAYER_SORT_BY_TITLE != 0 -> title 36 | else -> trackCnt.toString() 37 | } 38 | } 39 | 40 | fun ArrayList.sortSafely(sorting: Int) = sortSafely(Genre.getComparator(sorting)) 41 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/models/ListItem.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.models 2 | 3 | open class ListItem 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/models/Playlist.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.models 2 | 3 | import androidx.room.* 4 | import org.fossify.commons.helpers.AlphanumericComparator 5 | import org.fossify.commons.helpers.SORT_DESCENDING 6 | import org.fossify.musicplayer.extensions.sortSafely 7 | import org.fossify.musicplayer.helpers.PLAYER_SORT_BY_TITLE 8 | 9 | @Entity(tableName = "playlists", indices = [(Index(value = ["id"], unique = true))]) 10 | data class Playlist( 11 | @PrimaryKey(autoGenerate = true) var id: Int, 12 | @ColumnInfo(name = "title") var title: String, 13 | 14 | @Ignore var trackCount: Int = 0 15 | ) { 16 | constructor() : this(0, "", 0) 17 | 18 | companion object { 19 | fun getComparator(sorting: Int) = Comparator { first, second -> 20 | var result = when { 21 | sorting and PLAYER_SORT_BY_TITLE != 0 -> AlphanumericComparator().compare(first.title.lowercase(), second.title.lowercase()) 22 | else -> first.trackCount.compareTo(second.trackCount) 23 | } 24 | 25 | if (sorting and SORT_DESCENDING != 0) { 26 | result *= -1 27 | } 28 | 29 | return@Comparator result 30 | } 31 | } 32 | 33 | fun getBubbleText(sorting: Int) = when { 34 | sorting and PLAYER_SORT_BY_TITLE != 0 -> title 35 | else -> trackCount.toString() 36 | } 37 | } 38 | 39 | fun ArrayList.sortSafely(sorting: Int) = sortSafely(Playlist.getComparator(sorting)) 40 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/models/QueueItem.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.models 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | 6 | @Entity(tableName = "queue_items", primaryKeys = ["track_id"]) 7 | data class QueueItem( 8 | @ColumnInfo(name = "track_id") var trackId: Long, 9 | @ColumnInfo(name = "track_order") var trackOrder: Int, 10 | @ColumnInfo(name = "is_current") var isCurrent: Boolean, 11 | @ColumnInfo(name = "last_position") var lastPosition: Int 12 | ) { 13 | companion object { 14 | fun from(id: Long, position: Int = 0): QueueItem { 15 | return QueueItem(id, 0, true, position) 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/objects/MyExecutor.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.objects 2 | 3 | import java.util.concurrent.Executors 4 | 5 | object MyExecutor { 6 | val myExecutor = Executors.newSingleThreadExecutor() 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/playback/CustomCommands.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.playback 2 | 3 | import android.content.Context 4 | import android.os.Bundle 5 | import androidx.media3.session.CommandButton 6 | import androidx.media3.session.SessionCommand 7 | import org.fossify.musicplayer.helpers.PATH 8 | 9 | /** 10 | * Enum class representing custom commands that are used within the app and by media controller clients (e.g. system media controls). 11 | */ 12 | enum class CustomCommands(val customAction: String) { 13 | CLOSE_PLAYER(customAction = PATH + "CLOSE_PLAYER"), 14 | RELOAD_CONTENT(customAction = PATH + "RELOAD_CONTENT"), 15 | TOGGLE_SLEEP_TIMER(customAction = PATH + "TOGGLE_SLEEP_TIMER"), 16 | SET_NEXT_ITEM(customAction = PATH + "SET_NEXT_ITEM"), 17 | SET_SHUFFLE_ORDER(customAction = PATH + "SET_SHUFFLE_ORDER"); 18 | 19 | val sessionCommand = SessionCommand(customAction, Bundle.EMPTY) 20 | 21 | companion object { 22 | fun fromSessionCommand(sessionCommand: SessionCommand): CustomCommands? { 23 | return values().find { it.customAction == sessionCommand.customAction } 24 | } 25 | } 26 | } 27 | 28 | internal val customCommands = CustomCommands.values().map { it.sessionCommand } 29 | 30 | internal fun Context.getCustomLayout(): List { 31 | return listOf( 32 | CommandButton.Builder() 33 | .setDisplayName(getString(org.fossify.commons.R.string.close)) 34 | .setSessionCommand(CustomCommands.CLOSE_PLAYER.sessionCommand) 35 | .setIconResId(org.fossify.commons.R.drawable.ic_cross_vector) 36 | .build() 37 | ) 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/playback/SimpleEqualizer.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.playback 2 | 3 | import android.content.Context 4 | import android.media.audiofx.Equalizer 5 | import androidx.media3.common.util.UnstableApi 6 | import com.google.gson.Gson 7 | import com.google.gson.reflect.TypeToken 8 | import org.fossify.commons.extensions.toast 9 | import org.fossify.musicplayer.extensions.config 10 | import org.fossify.musicplayer.helpers.EQUALIZER_PRESET_CUSTOM 11 | import org.fossify.musicplayer.playback.player.SimpleMusicPlayer 12 | 13 | @UnstableApi 14 | object SimpleEqualizer { 15 | lateinit var instance: Equalizer 16 | internal set 17 | 18 | fun setupEqualizer(context: Context, player: SimpleMusicPlayer) { 19 | try { 20 | val preset = context.config.equalizerPreset 21 | instance = Equalizer(0, player.getAudioSessionId()) 22 | if (!instance.enabled) { 23 | instance.enabled = true 24 | } 25 | 26 | if (preset != EQUALIZER_PRESET_CUSTOM) { 27 | instance.usePreset(preset.toShort()) 28 | } else { 29 | val minValue = instance.bandLevelRange[0] 30 | val bandType = object : TypeToken>() {}.type 31 | val equalizerBands = Gson().fromJson>(context.config.equalizerBands, bandType) ?: HashMap() 32 | 33 | for ((key, value) in equalizerBands) { 34 | val newValue = value + minValue 35 | if (instance.getBandLevel(key) != newValue.toShort()) { 36 | instance.setBandLevel(key, newValue.toShort()) 37 | } 38 | } 39 | } 40 | } catch (ignored: Exception) { 41 | context.toast(org.fossify.commons.R.string.unknown_error_occurred) 42 | } 43 | } 44 | 45 | fun release() { 46 | if (::instance.isInitialized) { 47 | instance.release() 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/playback/SleepTimer.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.playback 2 | 3 | import android.os.CountDownTimer 4 | import org.fossify.musicplayer.extensions.config 5 | import org.fossify.musicplayer.models.Events 6 | import org.greenrobot.eventbus.EventBus 7 | 8 | private var isActive = false 9 | private var sleepTimer: CountDownTimer? = null 10 | 11 | internal fun PlaybackService.toggleSleepTimer() { 12 | if (isActive) { 13 | stopSleepTimer() 14 | } else { 15 | startSleepTimer() 16 | } 17 | } 18 | 19 | internal fun PlaybackService.startSleepTimer() { 20 | val millisInFuture = config.sleepInTS - System.currentTimeMillis() + 1000L 21 | sleepTimer?.cancel() 22 | sleepTimer = object : CountDownTimer(millisInFuture, 1000) { 23 | override fun onTick(millisUntilFinished: Long) { 24 | val seconds = (millisUntilFinished / 1000).toInt() 25 | EventBus.getDefault().post(Events.SleepTimerChanged(seconds)) 26 | } 27 | 28 | override fun onFinish() { 29 | config.sleepInTS = 0 30 | EventBus.getDefault().post(Events.SleepTimerChanged(0)) 31 | stopSleepTimer() 32 | stopService() 33 | } 34 | } 35 | 36 | sleepTimer?.start() 37 | isActive = true 38 | } 39 | 40 | internal fun PlaybackService.stopSleepTimer() { 41 | sleepTimer?.cancel() 42 | sleepTimer = null 43 | isActive = false 44 | config.sleepInTS = 0 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/playback/player/PlayerListener.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.playback.player 2 | 3 | import android.widget.Toast 4 | import androidx.media3.common.MediaItem 5 | import androidx.media3.common.PlaybackException 6 | import androidx.media3.common.Player 7 | import androidx.media3.common.util.UnstableApi 8 | import org.fossify.commons.extensions.toast 9 | import org.fossify.musicplayer.extensions.config 10 | import org.fossify.musicplayer.extensions.getPlaybackSetting 11 | import org.fossify.musicplayer.helpers.PlaybackSetting 12 | import org.fossify.musicplayer.playback.PlaybackService 13 | 14 | @UnstableApi 15 | internal fun PlaybackService.getPlayerListener() = object : Player.Listener { 16 | 17 | override fun onPlayerError(error: PlaybackException) = toast(org.fossify.commons.R.string.unknown_error_occurred, Toast.LENGTH_LONG) 18 | 19 | override fun onEvents(player: Player, events: Player.Events) { 20 | if ( 21 | events.containsAny( 22 | Player.EVENT_POSITION_DISCONTINUITY, 23 | Player.EVENT_MEDIA_ITEM_TRANSITION, 24 | Player.EVENT_TRACKS_CHANGED, 25 | Player.EVENT_TIMELINE_CHANGED, 26 | Player.EVENT_PLAYBACK_STATE_CHANGED, 27 | Player.EVENT_IS_PLAYING_CHANGED, 28 | Player.EVENT_PLAYLIST_METADATA_CHANGED 29 | ) 30 | ) { 31 | updatePlaybackState() 32 | } 33 | } 34 | 35 | override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) { 36 | // customize repeat mode behaviour as the default behaviour doesn't align with our requirements. 37 | withPlayer { 38 | if (reason == Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT) { 39 | if (config.playbackSetting == PlaybackSetting.STOP_AFTER_CURRENT_TRACK) { 40 | seekTo(0) 41 | pause() 42 | } 43 | } 44 | } 45 | } 46 | 47 | override fun onRepeatModeChanged(repeatMode: Int) { 48 | if (config.playbackSetting != PlaybackSetting.STOP_AFTER_CURRENT_TRACK) { 49 | config.playbackSetting = getPlaybackSetting(repeatMode) 50 | } 51 | } 52 | 53 | override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) { 54 | config.isShuffleEnabled = shuffleModeEnabled 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/kotlin/org/fossify/musicplayer/views/MarqueeTextView.kt: -------------------------------------------------------------------------------- 1 | package org.fossify.musicplayer.views 2 | 3 | import android.content.Context 4 | import android.graphics.Rect 5 | import android.text.TextUtils 6 | import android.util.AttributeSet 7 | import android.view.View 8 | import androidx.appcompat.widget.AppCompatTextView 9 | 10 | class MarqueeTextView(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : AppCompatTextView(context!!, attrs, defStyleAttr), 11 | View.OnLayoutChangeListener { 12 | 13 | constructor(context: Context?) : this(context, null) 14 | 15 | constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0) 16 | 17 | init { 18 | setSingleLine() 19 | ellipsize = TextUtils.TruncateAt.MARQUEE 20 | marqueeRepeatLimit = -1 21 | isSelected = true 22 | addOnLayoutChangeListener(this) 23 | } 24 | 25 | override fun isFocused() = true 26 | 27 | override fun onWindowFocusChanged(hasWindowFocus: Boolean) { 28 | if (hasWindowFocus) super.onWindowFocusChanged(hasWindowFocus) 29 | } 30 | 31 | override fun onFocusChanged(focused: Boolean, direction: Int, previouslyFocusedRect: Rect?) { 32 | if (focused) super.onFocusChanged(focused, direction, previouslyFocusedRect) 33 | } 34 | 35 | override fun onLayoutChange(v: View?, left: Int, top: Int, right: Int, bottom: Int, oldLeft: Int, oldTop: Int, oldRight: Int, oldBottom: Int) { 36 | val layoutParams = layoutParams 37 | layoutParams.height = bottom - top 38 | layoutParams.width = right - left 39 | removeOnLayoutChangeListener(this) 40 | setLayoutParams(layoutParams) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_headset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-hdpi/ic_headset.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_headset_padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-hdpi/ic_headset_padded.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_headset_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-hdpi/ic_headset_small.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_headset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-mdpi/ic_headset.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/img_widget_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-nodpi/img_widget_preview.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_headset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-xhdpi/ic_headset.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_headset_padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-xhdpi/ic_headset_padded.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_headset_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-xhdpi/ic_headset_small.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_headset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-xxhdpi/ic_headset.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_headset_padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-xxhdpi/ic_headset_padded.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_headset_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-xxhdpi/ic_headset_small.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_headset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-xxxhdpi/ic_headset.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_headset_padded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-xxxhdpi/ic_headset_padded.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_headset_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/drawable-xxxhdpi/ic_headset_small.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_album_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_equalizer_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_folders_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_genre_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_music_note_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_next_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_one_song_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_playback_speed_slow_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_playback_speed_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_playlist_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_previous_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_repeat_one_song_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_repeat_playlist_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_shuffle_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/layout-land/item_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 26 | 27 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_albums.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 23 | 24 | 29 | 30 | 37 | 38 | 39 | 40 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_excluded_folders.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 23 | 24 | 31 | 32 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_custom_sleep_timer_picker.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_export_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | 22 | 23 | 32 | 33 | 38 | 39 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_new_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_remove_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 20 | 21 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_select_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 18 | 19 | 26 | 27 | 36 | 37 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /app/src/main/res/layout/equalizer_band.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 17 | 18 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_albums.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 21 | 22 | 26 | 27 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_artists.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 21 | 22 | 26 | 27 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_folders.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 21 | 22 | 33 | 34 | 38 | 39 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_genres.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 21 | 22 | 26 | 27 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_playback_speed.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 26 | 27 | 36 | 37 | 45 | 46 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_playlists.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 20 | 21 | 22 | 23 | 36 | 37 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_tracks.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 21 | 22 | 26 | 27 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_album.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 22 | 23 | 39 | 40 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_artist.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 22 | 23 | 38 | 39 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_excluded_folder.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 18 | 19 | 29 | 30 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_folder.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 27 | 28 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 27 | 28 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_section.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_select_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_transparent.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/small_radio_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/small_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_controls.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 28 | 29 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cab_albums.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 11 | 16 | 21 | 26 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cab_albums_tracks.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 17 | 23 | 29 | 34 | 39 | 44 | 49 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cab_artists.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 17 | 22 | 27 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cab_folders.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cab_genres.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 11 | 16 | 21 | 26 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cab_playlists.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 18 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cab_queue.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 18 | 23 | 29 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cab_tracks.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 18 | 23 | 29 | 34 | 39 | 44 | 49 | 54 | 55 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cab_tracks_header.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 17 | 23 | 29 | 34 | 39 | 44 | 49 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 11 | 16 | 21 | 26 | 31 | 36 | 41 | 46 | 51 | 56 | 57 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 17 | 22 | 27 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_queue.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_orange.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_amber.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_amber.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_blue.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_brown.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_brown.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_cyan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_cyan.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_indigo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_indigo.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_light_green.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_light_green.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_lime.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_lime.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_orange.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_pink.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_pink.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_purple.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_red.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_red.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_teal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_teal.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_yellow.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-hdpi/ic_launcher_yellow.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_amber.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_amber.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_blue.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_brown.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_brown.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_cyan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_indigo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_light_green.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_lime.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_lime.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_orange.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_pink.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_pink.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_purple.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_red.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_red.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_teal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_teal.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_yellow.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_amber.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_amber.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_blue.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_brown.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_brown.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_lime.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_lime.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_orange.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_pink.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_pink.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_purple.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_red.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_red.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_teal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_teal.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_orange.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_red.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_red.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_orange.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_orange.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.webp -------------------------------------------------------------------------------- /app/src/main/res/values-b+es+419/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-bn-rBD/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-bn/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | শব্দ 4 | -------------------------------------------------------------------------------- /app/src/main/res/values-br/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-bs/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-ckb/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-cr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-cy/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Uchder sain 4 | Cyflymder chwarae 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-en-rGB/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-en-rIN/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-es-rUS/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-fil/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-ia/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Volumine 4 | Repeter toto 5 | Reproductor de musica 6 | Repeter le canto actual 7 | Stoppar le reproduction depost le canto actual 8 | Renominar canto 9 | Tu lista de reproduction es vacue 10 | Velocitate de reproduction 11 | Adder un file al lista de reproduction 12 | Adder un dossier al lista de reproduction 13 | Gerer le listas de reproduction 14 | Listas de reproduction 15 | Crear un nove lista de reproduction 16 | Renominar le lista de reproduction 17 | Un lista de reproduction con ille nomine jam existe 18 | Deler le lista de reproduction 19 | Isto solmente removera le listas de reproduction seligite, non le files actual. 20 | Isto solmente delera le lista de reproduction \"%s\". Le files actual non essera delite. 21 | Remover ab le lista de reproduction 22 | Tamben deler le files 23 | Aperir lista de reproduction 24 | Le lista de reproduction \"Tote le cantos\" non pote esser delite 25 | Le lista de reproduction actual es vacue 26 | Tote le cantos 27 | Deler le canto actual 28 | Si le titulo non es disponibile 29 | Tote le tracias 30 | Adder al lista de reproduction 31 | -------------------------------------------------------------------------------- /app/src/main/res/values-kn/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-kr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 200dp 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values-ltg/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-lv/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-mk/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-my/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-ne/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-or/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-pa/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-sat/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-si/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-ta/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-te/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-th/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | %d Album 5 | 6 | 7 | %d Track 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-zgh/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-zh-rHK/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 60dp 3 | 400dp 4 | 40dp 5 | 80dp 6 | 160dp 7 | 50dp 8 | 300dp 9 | 36dp 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/donottranslate.xml: -------------------------------------------------------------------------------- 1 | 2 | org.fossify.musicplayer 3 | Fossify Music Player 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/drawables.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @drawable/ic_play_vector 5 | @drawable/ic_pause_vector 6 | @drawable/ic_next_vector 7 | @drawable/ic_previous_vector 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #106D20 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 2048 3 | 1 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/xml/automotive_app_desc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/xml/searchable.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/xml/widget_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.android).apply(false) 3 | alias(libs.plugins.kotlinAndroid).apply(false) 4 | alias(libs.plugins.ksp).apply(false) 5 | alias(libs.plugins.detekt).apply(false) 6 | } 7 | 8 | tasks.register("clean") { 9 | delete { 10 | rootProject.buildDir 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /fastlane/Appfile: -------------------------------------------------------------------------------- 1 | json_key_file("fastlane/fastlane.json") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one 2 | package_name("org.fossify.musicplayer") # e.g. com.krausefx.app 3 | -------------------------------------------------------------------------------- /fastlane/Fastfile: -------------------------------------------------------------------------------- 1 | default_platform(:android) 2 | 3 | platform :android do 4 | desc 'Run unit & instrumentation tests' 5 | lane(:test) { test_android } 6 | 7 | desc 'Build & deploy AAB to Google Play (includes metadata)' 8 | lane(:deploy) { deploy_android } 9 | 10 | desc 'Push Play Store metadata' 11 | lane(:metadata) { metadata_android } 12 | end 13 | -------------------------------------------------------------------------------- /fastlane/README.md: -------------------------------------------------------------------------------- 1 | fastlane documentation 2 | ---- 3 | 4 | # Installation 5 | 6 | Make sure you have the latest version of the Xcode command line tools installed: 7 | 8 | ```sh 9 | xcode-select --install 10 | ``` 11 | 12 | For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) 13 | 14 | # Available Actions 15 | 16 | ## Android 17 | 18 | ### android test 19 | 20 | ```sh 21 | [bundle exec] fastlane android test 22 | ``` 23 | 24 | Run unit & instrumentation tests 25 | 26 | ### android deploy 27 | 28 | ```sh 29 | [bundle exec] fastlane android deploy 30 | ``` 31 | 32 | Build & deploy AAB to Google Play (includes metadata) 33 | 34 | ### android metadata 35 | 36 | ```sh 37 | [bundle exec] fastlane android metadata 38 | ``` 39 | 40 | Push Play Store metadata 41 | 42 | ---- 43 | 44 | This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. 45 | 46 | More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). 47 | 48 | The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). 49 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ca/short_description.txt: -------------------------------------------------------------------------------- 1 | Reproductor musical lliure d'anuncis amb un giny i un temporitzador de son 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/cs-CZ/short_description.txt: -------------------------------------------------------------------------------- 1 | Open-source hudební přehrávač s přizpůsobitelným widgetem a časovačem 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/da-DK/short_description.txt: -------------------------------------------------------------------------------- 1 | Open source og reklamefri musikafspiller med tilpasselig widget og søvn-timer 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/short_description.txt: -------------------------------------------------------------------------------- 1 | Quelloffener und werbefreier Musikplayer mit anpassbarem Widget und Sleeptimer 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/1.txt: -------------------------------------------------------------------------------- 1 | * Initial release 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2.txt: -------------------------------------------------------------------------------- 1 | Added: 2 | 3 | • Support for displaying disc number in albums 4 | 5 | Changed: 6 | 7 | • Turned off shuffle by default 8 | • Replaced checkboxes with switches 9 | • Previous button now supports replay 10 | 11 | Removed: 12 | 13 | • Dropped support for Android 7 and older versions 14 | 15 | Fixed: 16 | 17 | • Fixed track numbers displaying as 0 18 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/featureGraphic.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/1_en-US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/phoneScreenshots/1_en-US.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/2_en-US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/phoneScreenshots/2_en-US.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/3_en-US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/phoneScreenshots/3_en-US.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/4_en-US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/phoneScreenshots/4_en-US.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/5_en-US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/phoneScreenshots/5_en-US.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/tenInchScreenshots/1_en-US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/tenInchScreenshots/1_en-US.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/tenInchScreenshots/2_en-US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/tenInchScreenshots/2_en-US.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/tenInchScreenshots/3_en-US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/tenInchScreenshots/3_en-US.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/tenInchScreenshots/4_en-US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/tenInchScreenshots/4_en-US.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/tenInchScreenshots/5_en-US.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/fastlane/metadata/android/en-US/images/tenInchScreenshots/5_en-US.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | Open-source and Ad-free Music Player with customizable widget & sleep timer 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | Fossify Music Player 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/eo/short_description.txt: -------------------------------------------------------------------------------- 1 | Malfermitkoda kaj senreklama muzikludilo kun tajlorebla fenestraĵo 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/es-ES/short_description.txt: -------------------------------------------------------------------------------- 1 | Reprodutor sin publicidad y de código abierto, personalizable y con temporizador 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/et/short_description.txt: -------------------------------------------------------------------------------- 1 | Avatud lähtekoodiga reklaamivaba muusikamängija, sh kohandatav vidin + unetaimer 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/eu-ES/short_description.txt: -------------------------------------------------------------------------------- 1 | Kode irekiko eta iragarkirik gabeko musika erreproduzigailua trepetekin 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/fi-FI/short_description.txt: -------------------------------------------------------------------------------- 1 | Avoimen lähdekoodin mainosvapaa Musiikkisoitin widgetillä ja uniajastimella 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/gl-ES/short_description.txt: -------------------------------------------------------------------------------- 1 | Reprodutor sen publi e de Código aberto, personalizable e con temporizador 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/hi-IN/short_description.txt: -------------------------------------------------------------------------------- 1 | अनुकूलनयोग्य विजेट, स्लीप टाइमर, ओपन-सोर्स और विज्ञापन-मुक्त म्यूजिक प्लेयर 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/hu-HU/short_description.txt: -------------------------------------------------------------------------------- 1 | Nyílt forráskódú és reklámmentes zenelejátszó, testreszabható modullal 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/it-IT/short_description.txt: -------------------------------------------------------------------------------- 1 | Lettore musicale privo di pubblicità, con widget personalizzabili e sleep timer 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/iw-IL/short_description.txt: -------------------------------------------------------------------------------- 1 | נגן מוזיקה בקוד פתוח וללא פרסומות עם ווידג'ט וטיימר שינה הניתנים להתאמה אישית 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/nl-NL/short_description.txt: -------------------------------------------------------------------------------- 1 | Opensource en advertentievrije muziekspeler met aanpasbare widget & slaaptimer 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/pl-PL/short_description.txt: -------------------------------------------------------------------------------- 1 | Otwartoźródłowy odtwarzacz muzyki bez reklam, z widżetem i wyłącznikiem czasowym 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru-RU/short_description.txt: -------------------------------------------------------------------------------- 1 | Музыкальный проигрыватель, без рекламы, свободный и с виджетом и таймером сна 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/sv-SE/short_description.txt: -------------------------------------------------------------------------------- 1 | Reklamfri musikspelare med öppen källkod, anpassningsbar widget och sovtimer 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/tr-TR/short_description.txt: -------------------------------------------------------------------------------- 1 | Widget ve uyku zamanlayıcısına sahip açık kaynaklı ve reklamsız müzik oynatıcı 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/uk/short_description.txt: -------------------------------------------------------------------------------- 1 | Музичний плеєр з відкритим вихідним кодом,без реклами, з віджетом і таймером сну 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/full_description.txt: -------------------------------------------------------------------------------- 1 | 隆重推出 Fossify 音乐播放器——您不间断享受音乐的门户。告别侵扰性的广告,迎接无缝的音乐体验,随时随地陪伴您。 2 | 3 | 🚫 无广告聆听: 4 | 我们理解您时间的价值和您音乐体验的神圣性。这就是为什么 Fossify 音乐播放器完全没有广告。没有干扰,只有纯粹的音乐幸福。无论您在家、在路上还是在户外探索,都可以不间断地享受音乐。 5 | 6 | 📶 离线访问: 7 | 无论您走到哪里,甚至去火星,都可以随身携带音乐。Fossify 音乐播放器可离线运行,确保您可以随时随地欣赏您喜爱的曲目,而无需互联网连接。 8 | 9 | 🚀 快速高效: 10 | 担心在沉迷于您最喜爱的音乐时会耗尽电池电量?尽管功能丰富,Fossify 音乐播放器仍保持了较小的应用体积,确保了快速无忧的下载和安装。体验快速导航和无缝演奏,同时沉浸在您最喜欢的旋律中。 11 | 12 | 🎚️ 强大的均衡器: 13 | 使用我们强大的均衡器提升您的聆听体验,提供一系列预设以适应每种流派和音频偏好。根据您的心情、流派甚至音频设置调整音乐效果,以获得身临其境的声音体验。 14 | 15 | 🌙 睡眠定时器,让您安然入眠: 16 | 使用睡眠定时器功能舒缓您的夜晚。选择您最喜欢的音乐,让它们在您入睡时慢慢消失。享受宁静的夜晚,无需担心音乐播放。 17 | 18 | 📜 播放列表管理: 19 | 轻松创建和管理您的播放列表。组织您的音乐库,自定义曲目标签,甚至根据您的喜好编辑歌曲信息。轻松随机播放、重复播放、跳过和快进曲目。 20 | 21 | 🔒 隐私保证: 22 | 您的隐私是我们的首要任务。Fossify 音乐播放器不会收集或与第三方共享任何用户信息。知道您的音乐之旅保持私密且安全,您可以安心享受。 23 | 24 | 🌈 现代设计和用户友好的界面: 25 | 享受简洁、现代的设计和用户友好的界面。本应用具有 Material 设计和深色主题选项,提供视觉上吸引人且舒适的用户体验。 26 | 27 | 🎨 可自定义的界面: 28 | 使用可自定义的微件和界面颜色个性化您的音乐体验。通过状态栏、微件或耳机按钮轻松控制您的音乐,所有这些都是根据您的喜好量身定制的。 29 | 30 | 🌐 开源透明度: 31 | 您的隐私是重中之重。Fossify 音乐播放器完全离线运行,完全没有广告,也不需要不必要的权限。此外,它是完全开源的,让您放心,因为您可以访问源代码进行安全和隐私审核。 32 | 33 | 以应有的方式体验音乐——不间断、个性化和身临其境。立即下载 Fossify 音乐播放器,踏上前所未有的音乐之旅。 34 | 35 | 探索更多 Fossify 应用:https://www.fossify.org 36 | 开源代码:https://www.github.com/FossifyOrg 37 | 加入 Reddit 社区:https://www.reddit.com/r/Fossify 38 | 在 Telegram 上联系:https://t.me/Fossify 39 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/short_description.txt: -------------------------------------------------------------------------------- 1 | 开源且无广告的音乐播放器,具有可自定义的微件和睡眠定时器 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-TW/short_description.txt: -------------------------------------------------------------------------------- 1 | 具備可自訂小工具與睡眠計時器的開源且無廣告音樂播放器 2 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | android.enableJetifier=true 2 | android.useAndroidX=true 3 | org.gradle.jvmargs=-Xmx8192m 4 | 5 | # Versioning 6 | VERSION_NAME=1.1.0 7 | VERSION_CODE=2 8 | APP_ID=org.fossify.musicplayer 9 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /graphics/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/graphics/featureGraphic.png -------------------------------------------------------------------------------- /graphics/foreground.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | -------------------------------------------------------------------------------- /graphics/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | -------------------------------------------------------------------------------- /graphics/icon.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FossifyOrg/Music-Player/944cd5444d21f839b417974bf523158f5c84e137/graphics/icon.webp -------------------------------------------------------------------------------- /keystore.properties_sample: -------------------------------------------------------------------------------- 1 | storePassword=123456 2 | keyPassword=abcdef 3 | keyAlias=myAlias 4 | storeFile=../keystore.jks 5 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | gradlePluginPortal() 4 | google() 5 | mavenCentral() 6 | } 7 | } 8 | dependencyResolutionManagement { 9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 10 | repositories { 11 | google() 12 | mavenCentral() 13 | maven { setUrl("https://jitpack.io") } 14 | } 15 | } 16 | include(":app") 17 | --------------------------------------------------------------------------------