├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ └── android.yml ├── .gitignore ├── LICENSE ├── app ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── java │ │ ├── com │ │ │ └── google │ │ │ │ └── android │ │ │ │ └── material │ │ │ │ └── slider │ │ │ │ ├── BaseOverlaySlider.java │ │ │ │ └── OverlaySlider.java │ │ └── org │ │ │ └── akanework │ │ │ └── gramophone │ │ │ ├── logic │ │ │ ├── GramophoneApplication.kt │ │ │ ├── GramophoneExtensions.kt │ │ │ ├── GramophonePlaybackService.kt │ │ │ ├── comparators │ │ │ │ ├── AlphaNumericComparator.kt │ │ │ │ └── SupportComparator.kt │ │ │ ├── data │ │ │ │ └── db │ │ │ │ │ ├── AppDatabase.kt │ │ │ │ │ ├── dao │ │ │ │ │ ├── MediaItemDao.kt │ │ │ │ │ └── PlaylistDao.kt │ │ │ │ │ └── entity │ │ │ │ │ ├── MediaItem.kt │ │ │ │ │ ├── MediaItemWithPlaylist.kt │ │ │ │ │ ├── Playlist.kt │ │ │ │ │ ├── PlaylistMediaItemCrossRef.kt │ │ │ │ │ └── PlaylistWithMediaItem.kt │ │ │ ├── ui │ │ │ │ ├── CenteredImageSpan.kt │ │ │ │ ├── CoilCrossfade.kt │ │ │ │ ├── CustomSmoothScroller.java │ │ │ │ ├── MyBottomSheetBehavior.kt │ │ │ │ ├── MyRecyclerView.kt │ │ │ │ └── RecyclerViewHelper.kt │ │ │ └── utils │ │ │ │ ├── CalculationUtils.kt │ │ │ │ ├── CircularShuffleOrder.kt │ │ │ │ ├── ColorUtils.kt │ │ │ │ ├── DatabaseUtils.kt │ │ │ │ ├── EnvUtils.kt │ │ │ │ ├── FileOpUtils.kt │ │ │ │ ├── LastPlayedManager.kt │ │ │ │ ├── LrcUtils.kt │ │ │ │ ├── MediaStoreUtils.kt │ │ │ │ ├── RecommendationFactory.kt │ │ │ │ └── exoplayer │ │ │ │ ├── EndedWorkaroundPlayer.kt │ │ │ │ ├── GramophoneExtractorsFactory.kt │ │ │ │ ├── GramophoneMediaSourceFactory.kt │ │ │ │ └── GramophoneRenderFactory.kt │ │ │ └── ui │ │ │ ├── BugHandlerActivity.kt │ │ │ ├── LibraryViewModel.kt │ │ │ ├── MainActivity.kt │ │ │ ├── adapters │ │ │ ├── AlbumAdapter.kt │ │ │ ├── ArtistAdapter.kt │ │ │ ├── BaseAdapter.kt │ │ │ ├── BaseDecorAdapter.kt │ │ │ ├── BlacklistFolderAdapter.kt │ │ │ ├── DateAdapter.kt │ │ │ ├── DetailedFolderAdapter.kt │ │ │ ├── FolderAdapter.kt │ │ │ ├── GenreAdapter.kt │ │ │ ├── HeaderAdapter.kt │ │ │ ├── HomepageCarouselAdapter.kt │ │ │ ├── LibraryCategoryAdapter.kt │ │ │ ├── LibraryHomeAdapter.kt │ │ │ ├── MainPageAdapter.kt │ │ │ ├── PlaylistAdapter.kt │ │ │ ├── RecommendAdapter.kt │ │ │ ├── SongAdapter.kt │ │ │ ├── Sorter.kt │ │ │ └── ViewPager2Adapter.kt │ │ │ ├── components │ │ │ ├── BlendView.kt │ │ │ ├── CustomGridLayoutManager.kt │ │ │ ├── CustomLinearLayoutManager.kt │ │ │ ├── CustomTextView.kt │ │ │ ├── FadingVerticalEdgeLayout.kt │ │ │ ├── FullBottomSheet.kt │ │ │ ├── GridPaddingDecoration.kt │ │ │ ├── GridPaddingDecorationLibrary.kt │ │ │ ├── ItemSnapHelper.kt │ │ │ ├── LyricPaddingDecoration.kt │ │ │ ├── MarqueeTextView.kt │ │ │ └── PlayerBottomSheet.kt │ │ │ └── fragments │ │ │ ├── AboutContributorFragment.kt │ │ │ ├── AboutFragment.kt │ │ │ ├── AdapterFragment.kt │ │ │ ├── ArtistSubFragment.kt │ │ │ ├── BaseElevatedFragment.kt │ │ │ ├── BaseFragment.kt │ │ │ ├── BasePreferenceFragment.kt │ │ │ ├── BaseSettingFragment.kt │ │ │ ├── BaseWrapperFragment.kt │ │ │ ├── BrowseFragment.kt │ │ │ ├── DetailDialogFragment.kt │ │ │ ├── GeneralSubFragment.kt │ │ │ ├── HomepageFragment.kt │ │ │ ├── LibraryAlbumSubFragment.kt │ │ │ ├── LibraryFragment.kt │ │ │ ├── LibrarySongSubFragment.kt │ │ │ ├── SearchFragment.kt │ │ │ ├── ViewPagerFragment.kt │ │ │ └── settings │ │ │ ├── AppearanceSettingsTopFragment.kt │ │ │ ├── AudioSettingsTopFragment.kt │ │ │ ├── BehaviorSettingsTopFragment.kt │ │ │ ├── BlacklistSettingsFragment.kt │ │ │ ├── ExperimentalSettingsTopFragment.kt │ │ │ └── MainSettingsTopFragment.kt │ └── res │ │ ├── anim │ │ ├── slide_in_left.xml │ │ ├── slide_in_right.xml │ │ ├── slide_out_left.xml │ │ └── slide_out_right.xml │ │ ├── color │ │ ├── sl_check_button.xml │ │ ├── sl_check_button_playlist_bg.xml │ │ ├── sl_check_button_playlist_icon_tint.xml │ │ └── sl_fav_button.xml │ │ ├── drawable │ │ ├── accord_mix_1.webp │ │ ├── accord_mix_1_banner.xml │ │ ├── accord_mix_2.webp │ │ ├── accord_mix_2_banner.xml │ │ ├── accord_mix_3.webp │ │ ├── accord_mix_3_banner.xml │ │ ├── accord_mix_4.webp │ │ ├── accord_mix_4_banner.xml │ │ ├── afs_popup_background.xml │ │ ├── akane_avatar.webp │ │ ├── apple_lossless_seeklogo.xml │ │ ├── awainatsu.webp │ │ ├── baseline_arrow_downward_24.xml │ │ ├── baseline_arrow_upward_24.xml │ │ ├── baseline_keyboard_double_arrow_down_24.xml │ │ ├── bg_pause_anim.xml │ │ ├── bg_play_anim.xml │ │ ├── duo3.webp │ │ ├── fastscroller_thumb.xml │ │ ├── ic_accord_logo_alt.xml │ │ ├── ic_alarm_off.xml │ │ ├── ic_alarm_on.xml │ │ ├── ic_album.xml │ │ ├── ic_album_fixed.xml │ │ ├── ic_album_sort.xml │ │ ├── ic_align_center.xml │ │ ├── ic_apple_next.xml │ │ ├── ic_apple_pause.xml │ │ ├── ic_apple_play.xml │ │ ├── ic_apple_previous.xml │ │ ├── ic_apple_sort.xml │ │ ├── ic_arrow_back.xml │ │ ├── ic_arrow_back_ios.xml │ │ ├── ic_article.xml │ │ ├── ic_artist_sort.xml │ │ ├── ic_bullet_list_24dp.xml │ │ ├── ic_calendar.xml │ │ ├── ic_calendar_add.xml │ │ ├── ic_character.xml │ │ ├── ic_chevron_right.xml │ │ ├── ic_close.xml │ │ ├── ic_collections_bookmark.xml │ │ ├── ic_colors.xml │ │ ├── ic_contributors.xml │ │ ├── ic_dashboard_customize.xml │ │ ├── ic_default_cover.xml │ │ ├── ic_default_cover_artist.xml │ │ ├── ic_default_cover_date.xml │ │ ├── ic_default_cover_favourite.xml │ │ ├── ic_default_cover_fixed.xml │ │ ├── ic_default_cover_genre.xml │ │ ├── ic_default_cover_manuscript.xml │ │ ├── ic_default_cover_playlist.xml │ │ ├── ic_dot.xml │ │ ├── ic_draw_abstract.xml │ │ ├── ic_edit.xml │ │ ├── ic_equalizer.xml │ │ ├── ic_expand_more.xml │ │ ├── ic_experiment.xml │ │ ├── ic_favourite.xml │ │ ├── ic_folder.xml │ │ ├── ic_format_align_center.xml │ │ ├── ic_format_bold.xml │ │ ├── ic_genres.xml │ │ ├── ic_gramophone_monochrome.xml │ │ ├── ic_gramophone_notification.xml │ │ ├── ic_groups.xml │ │ ├── ic_headphones.xml │ │ ├── ic_infinity.xml │ │ ├── ic_info.xml │ │ ├── ic_jigsaw.xml │ │ ├── ic_launcher_foreground.xml │ │ ├── ic_layout_type.xml │ │ ├── ic_library_link_icon_album.xml │ │ ├── ic_library_link_icon_artists.xml │ │ ├── ic_library_link_icon_playlists.xml │ │ ├── ic_library_link_icon_songs.xml │ │ ├── ic_lyrics.xml │ │ ├── ic_lyrics_btn.xml │ │ ├── ic_manufacturing.xml │ │ ├── ic_media_pause_anim.xml │ │ ├── ic_media_play_anim.xml │ │ ├── ic_more_vert_alt.xml │ │ ├── ic_more_vert_bold.xml │ │ ├── ic_music_note_24dp.xml │ │ ├── ic_nowplaying_favorite.xml │ │ ├── ic_nowplaying_favorited.xml │ │ ├── ic_nowplaying_lyrics.xml │ │ ├── ic_nowplaying_lyricson.xml │ │ ├── ic_nowplaying_more.xml │ │ ├── ic_nowplaying_more_fill.xml │ │ ├── ic_nowplaying_mp_fforward.xml │ │ ├── ic_nowplaying_mp_pause.xml │ │ ├── ic_nowplaying_mp_play.xml │ │ ├── ic_nowplaying_queue.xml │ │ ├── ic_nowplaying_queueon.xml │ │ ├── ic_palette.xml │ │ ├── ic_pause_filled.xml │ │ ├── ic_play_arrow.xml │ │ ├── ic_play_arrow_filled.xml │ │ ├── ic_playlist_play.xml │ │ ├── ic_playlist_play_filled.xml │ │ ├── ic_queue_btn.xml │ │ ├── ic_quote_bubble_24dp.xml │ │ ├── ic_refresh.xml │ │ ├── ic_remove.xml │ │ ├── ic_repeat.xml │ │ ├── ic_repeat_off.xml │ │ ├── ic_repeat_one.xml │ │ ├── ic_rounded_corner.xml │ │ ├── ic_schedule.xml │ │ ├── ic_script.xml │ │ ├── ic_script_filled.xml │ │ ├── ic_search.xml │ │ ├── ic_settings.xml │ │ ├── ic_shuffle.xml │ │ ├── ic_shuffle_off.xml │ │ ├── ic_skip_next.xml │ │ ├── ic_skip_next_filled.xml │ │ ├── ic_skip_previous.xml │ │ ├── ic_skip_previous_filled.xml │ │ ├── ic_speaker_24dp.xml │ │ ├── ic_speaker_wave_3_24dp.xml │ │ ├── ic_star.xml │ │ ├── ic_star_filled.xml │ │ ├── ic_text_fields.xml │ │ ├── ic_timer_24dp.xml │ │ ├── ic_transparent.xml │ │ ├── ic_warning.xml │ │ ├── lazar.webp │ │ ├── luka.webp │ │ ├── media_seekbar_thumb.xml │ │ ├── nick.webp │ │ ├── popup_background.xml │ │ ├── rp_buttons.xml │ │ ├── rp_buttons_dynamic.xml │ │ ├── selected_chip_background.xml │ │ ├── skyd.webp │ │ ├── sl_check_timer.xml │ │ ├── sp_shadow.xml │ │ ├── tab_browse.xml │ │ ├── tab_home.xml │ │ ├── tab_library.xml │ │ └── tab_search.xml │ │ ├── layout-land │ │ └── full_player.xml │ │ ├── layout │ │ ├── activity_bug_handler.xml │ │ ├── activity_main.xml │ │ ├── adapter_blacklist_folder_card.xml │ │ ├── adapter_folder_card.xml │ │ ├── adapter_grid_card.xml │ │ ├── adapter_list_card.xml │ │ ├── adapter_list_card_artist.xml │ │ ├── adapter_list_card_larger.xml │ │ ├── adapter_list_card_playlist.xml │ │ ├── blend_background.xml │ │ ├── bottom_sheet.xml │ │ ├── dialog_about.xml │ │ ├── fragment_about.xml │ │ ├── fragment_about_inner.xml │ │ ├── fragment_blacklist_settings.xml │ │ ├── fragment_browse.xml │ │ ├── fragment_general_sub.xml │ │ ├── fragment_homepage.xml │ │ ├── fragment_info_song.xml │ │ ├── fragment_library.xml │ │ ├── fragment_recyclerview.xml │ │ ├── fragment_search.xml │ │ ├── fragment_top_settings.xml │ │ ├── fragment_viewpager.xml │ │ ├── fragment_wrapper.xml │ │ ├── full_player.xml │ │ ├── general_decor.xml │ │ ├── homepage_carousel.xml │ │ ├── homepage_recommend_card.xml │ │ ├── library_entry.xml │ │ ├── lyric_common.xml │ │ ├── lyric_common_translation.xml │ │ ├── lyric_content.xml │ │ ├── lyric_syllable.xml │ │ ├── lyric_syllable_translation.xml │ │ ├── preference_basic.xml │ │ ├── preference_category_md.xml │ │ ├── preference_dropdown_md.xml │ │ ├── preference_icon.xml │ │ ├── preference_seekbar.xml │ │ ├── preference_switch.xml │ │ ├── preference_switch_widget.xml │ │ └── recently_added.xml │ │ ├── menu │ │ ├── bottom_nav.xml │ │ ├── home_menu.xml │ │ ├── more_menu.xml │ │ ├── more_menu_less.xml │ │ ├── navigation_menu.xml │ │ └── sort_menu.xml │ │ ├── mipmap-anydpi │ │ └── ic_launcher.xml │ │ ├── raw │ │ └── keep.xml │ │ ├── resources.properties │ │ ├── values-ar │ │ └── strings.xml │ │ ├── values-be │ │ └── strings.xml │ │ ├── values-bn │ │ └── strings.xml │ │ ├── values-cs │ │ └── strings.xml │ │ ├── values-de │ │ └── strings.xml │ │ ├── values-es │ │ └── strings.xml │ │ ├── values-fa │ │ └── strings.xml │ │ ├── values-fr │ │ └── strings.xml │ │ ├── values-hu │ │ └── strings.xml │ │ ├── values-ia │ │ └── strings.xml │ │ ├── values-in │ │ └── strings.xml │ │ ├── values-it │ │ └── strings.xml │ │ ├── values-ja │ │ └── strings.xml │ │ ├── values-nb-rNO │ │ └── strings.xml │ │ ├── values-ne │ │ └── strings.xml │ │ ├── values-night │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── theme_overlays.xml │ │ └── themes.xml │ │ ├── values-pl │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ └── strings.xml │ │ ├── values-pt │ │ └── strings.xml │ │ ├── values-ro │ │ └── strings.xml │ │ ├── values-ru │ │ └── strings.xml │ │ ├── values-tr │ │ └── strings.xml │ │ ├── values-uk │ │ └── strings.xml │ │ ├── values-v31 │ │ └── themes.xml │ │ ├── values-vi │ │ └── strings.xml │ │ ├── values-zh-rCN │ │ └── strings.xml │ │ ├── values-zh-rTW │ │ └── strings.xml │ │ ├── values │ │ ├── arrays.xml │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── drawables.xml │ │ ├── ic_launcher_background.xml │ │ ├── integers.xml │ │ ├── strings.xml │ │ ├── theme_overlays.xml │ │ └── themes.xml │ │ └── xml │ │ ├── backup_rules.xml │ │ ├── data_extraction_rules.xml │ │ ├── settings_about.xml │ │ ├── settings_appearance.xml │ │ ├── settings_audio.xml │ │ ├── settings_behavior.xml │ │ ├── settings_experimental.xml │ │ └── settings_top.xml │ └── test │ └── java │ └── org │ └── akanework │ └── gramophone │ └── LrcUtilsTest.kt ├── build.gradle.kts ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── libs └── lib-decoder-ffmpeg-release.aar ├── readme.md ├── recyclerview ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro ├── res-public │ └── values │ │ └── public_attrs.xml ├── res │ └── values │ │ ├── attrs.xml │ │ ├── dimens.xml │ │ └── ids.xml └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ ├── androidx │ └── recyclerview │ │ └── widget │ │ ├── AdapterHelper.java │ │ ├── AdapterListUpdateCallback.java │ │ ├── AsyncDifferConfig.java │ │ ├── AsyncListDiffer.java │ │ ├── AsyncListUtil.java │ │ ├── BatchingListUpdateCallback.java │ │ ├── ChildHelper.java │ │ ├── ConcatAdapter.java │ │ ├── ConcatAdapterController.java │ │ ├── DefaultItemAnimator.java │ │ ├── DiffUtil.java │ │ ├── DividerItemDecoration.java │ │ ├── FastScroller.java │ │ ├── GapWorker.java │ │ ├── GridLayoutManager.java │ │ ├── ItemTouchHelper.java │ │ ├── ItemTouchUIUtil.java │ │ ├── ItemTouchUIUtilImpl.java │ │ ├── LayoutState.java │ │ ├── LinearLayoutManager.java │ │ ├── LinearSmoothScroller.java │ │ ├── LinearSnapHelper.java │ │ ├── ListAdapter.java │ │ ├── ListUpdateCallback.java │ │ ├── MessageThreadUtil.java │ │ ├── NestedAdapterWrapper.java │ │ ├── OpReorderer.java │ │ ├── OrientationHelper.java │ │ ├── PagerSnapHelper.java │ │ ├── RecyclerView.java │ │ ├── RecyclerViewAccessibilityDelegate.java │ │ ├── ScrollbarHelper.java │ │ ├── SimpleItemAnimator.java │ │ ├── SnapHelper.java │ │ ├── SortedList.java │ │ ├── SortedListAdapterCallback.java │ │ ├── StableIdStorage.java │ │ ├── StaggeredGridLayoutManager.java │ │ ├── ThreadUtil.java │ │ ├── TileList.java │ │ ├── ViewBoundsCheck.java │ │ ├── ViewInfoStore.java │ │ └── ViewTypeStorage.java │ └── org │ └── helixform │ └── fluidrecyclerview │ ├── EdgeEffectAdapter.kt │ ├── FluidRubberBand.kt │ ├── FluidScroller.kt │ ├── FluidSpringBack.kt │ ├── FluidVelocityTracker.kt │ ├── OverScrollerAdapter.kt │ ├── SystemVelocityTrackerAdapter.kt │ ├── VelocityTracker.kt │ └── VelocityTrackerFactory.kt └── settings.gradle.kts /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: need confirm 6 | assignees: AkaneTan, nift4 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Smartphone (please complete the following information):** 27 | - Device: [e.g. iPhone6] 28 | - OS: [e.g. iOS8.1] 29 | - App Version: [e.g. 22] 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: AkaneTan 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | .idea 4 | .kotlin 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | .cxx 10 | local.properties 11 | package.properties 12 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /schemas 3 | /release 4 | /debug 5 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | -keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | # -renamesourcefileattribute SourceFile 22 | 23 | # Enable more agressive optimizations changing access of classes and methods 24 | -allowaccessmodification 25 | 26 | -assumenosideeffects class android.util.Log { 27 | public static int v(...); 28 | public static int i(...); 29 | public static int w(...); 30 | public static int d(...); 31 | public static int e(...); 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/logic/data/db/AppDatabase.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.logic.data.db 2 | 3 | import android.content.Context 4 | import androidx.room.Database 5 | import androidx.room.Room 6 | import androidx.room.RoomDatabase 7 | import org.akanework.gramophone.logic.data.db.dao.MediaItemDao 8 | import org.akanework.gramophone.logic.data.db.dao.PlaylistDao 9 | import org.akanework.gramophone.logic.data.db.entity.MediaItem 10 | import org.akanework.gramophone.logic.data.db.entity.Playlist 11 | import org.akanework.gramophone.logic.data.db.entity.PlaylistMediaItemCrossRef 12 | 13 | const val APP_DATABASE_FILE_NAME = "app.db" 14 | 15 | @Database( 16 | entities = [ 17 | Playlist::class, 18 | MediaItem::class, 19 | PlaylistMediaItemCrossRef::class, 20 | ], 21 | version = 1, 22 | ) 23 | abstract class AppDatabase : RoomDatabase() { 24 | 25 | abstract fun playlistDao(): PlaylistDao 26 | abstract fun mediaItemDao(): MediaItemDao 27 | 28 | companion object { 29 | @Volatile 30 | private var instance: AppDatabase? = null 31 | 32 | fun getInstance(context: Context): AppDatabase { 33 | return instance ?: synchronized(this) { 34 | instance ?: Room.databaseBuilder( 35 | context.applicationContext, 36 | AppDatabase::class.java, 37 | APP_DATABASE_FILE_NAME 38 | ) 39 | .build() 40 | .apply { instance = this } 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/logic/data/db/dao/PlaylistDao.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.logic.data.db.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Delete 5 | import androidx.room.Insert 6 | import androidx.room.OnConflictStrategy 7 | import androidx.room.Query 8 | import androidx.room.Transaction 9 | import org.akanework.gramophone.logic.data.db.entity.PLAYLIST_TABLE_NAME 10 | import org.akanework.gramophone.logic.data.db.entity.Playlist 11 | import org.akanework.gramophone.logic.data.db.entity.PlaylistWithMediaItem 12 | 13 | @Dao 14 | interface PlaylistDao { 15 | /** 16 | * Add a new playlist. 17 | */ 18 | @Transaction 19 | @Insert(onConflict = OnConflictStrategy.IGNORE) 20 | fun addPlaylist(playlist: Playlist) 21 | 22 | /** 23 | * Delete playlist. 24 | */ 25 | @Transaction 26 | @Delete 27 | fun removePlaylist(playlist: Playlist): Int 28 | 29 | /** 30 | * Delete playlist with playlist ID. 31 | */ 32 | @Transaction 33 | @Query("DELETE FROM `$PLAYLIST_TABLE_NAME` WHERE ${Playlist.PLAYLIST_ID_COLUMN} = :playlistId") 34 | fun removePlaylistById(playlistId: Long): Int 35 | 36 | /** 37 | * Get all playlist and their media items. 38 | */ 39 | @Transaction 40 | @Query("SELECT * FROM `$PLAYLIST_TABLE_NAME`") 41 | fun getAllPlaylists(): List 42 | 43 | /** 44 | * Get playlist and its song with given playlist ID. 45 | */ 46 | @Transaction 47 | @Query("SELECT * FROM `$PLAYLIST_TABLE_NAME` WHERE `${Playlist.PLAYLIST_ID_COLUMN}` = :playlistId") 48 | fun getPlaylistWithMediaItems(playlistId: Long): PlaylistWithMediaItem 49 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/logic/data/db/entity/MediaItem.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.logic.data.db.entity 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | 7 | const val MEDIA_ITEM_TABLE_NAME = "mediaItemTable" 8 | 9 | @Entity(tableName = MEDIA_ITEM_TABLE_NAME) 10 | data class MediaItem( 11 | @PrimaryKey 12 | @ColumnInfo(name = MEDIA_ITEM_ID_COLUMN) 13 | val mediaItemId: Long, 14 | ) { 15 | companion object { 16 | const val MEDIA_ITEM_ID_COLUMN = "mediaItemId" 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/logic/data/db/entity/MediaItemWithPlaylist.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.logic.data.db.entity 2 | 3 | import androidx.room.Embedded 4 | import androidx.room.Junction 5 | import androidx.room.Relation 6 | 7 | /** 8 | * A [mediaItem] contains many [playlists]. 9 | */ 10 | data class MediaItemWithPlaylist( 11 | @Embedded 12 | val mediaItem: MediaItem, 13 | @Relation( 14 | parentColumn = MediaItem.MEDIA_ITEM_ID_COLUMN, 15 | entityColumn = Playlist.PLAYLIST_ID_COLUMN, 16 | associateBy = Junction(PlaylistMediaItemCrossRef::class) 17 | ) 18 | val playlists: List, 19 | ) 20 | -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/logic/data/db/entity/Playlist.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.logic.data.db.entity 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | 7 | const val PLAYLIST_TABLE_NAME = "playlistTable" 8 | 9 | @Entity(tableName = PLAYLIST_TABLE_NAME) 10 | data class Playlist( 11 | @PrimaryKey(autoGenerate = false) 12 | @ColumnInfo(name = PLAYLIST_ID_COLUMN) 13 | val playlistId: Long = 0, 14 | @ColumnInfo(name = NAME_COLUMN) 15 | val name: String, 16 | @ColumnInfo(name = PLAYLIST_COVER_COLUMN) 17 | val playlistCover: String?, 18 | ) { 19 | companion object { 20 | const val PLAYLIST_ID_COLUMN = "playlistId" 21 | const val NAME_COLUMN = "name" 22 | const val PLAYLIST_COVER_COLUMN = "playlistCover" 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/logic/data/db/entity/PlaylistMediaItemCrossRef.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.logic.data.db.entity 2 | 3 | import androidx.room.ColumnInfo 4 | import androidx.room.Entity 5 | import androidx.room.ForeignKey 6 | import androidx.room.Index 7 | 8 | const val PLAYLIST_MEDIA_ITEM_CROSS_REF_TABLE_NAME = "playlistMediaItemCrossRef" 9 | 10 | @Entity( 11 | tableName = PLAYLIST_MEDIA_ITEM_CROSS_REF_TABLE_NAME, 12 | primaryKeys = [ 13 | PlaylistMediaItemCrossRef.PLAYLIST_ID_COLUMN, 14 | PlaylistMediaItemCrossRef.MEDIA_ITEM_ID_COLUMN, 15 | ], 16 | foreignKeys = [ 17 | ForeignKey( 18 | entity = Playlist::class, 19 | parentColumns = [Playlist.PLAYLIST_ID_COLUMN], 20 | childColumns = [PlaylistMediaItemCrossRef.PLAYLIST_ID_COLUMN], 21 | onDelete = ForeignKey.CASCADE 22 | ), 23 | ForeignKey( 24 | entity = MediaItem::class, 25 | parentColumns = [MediaItem.MEDIA_ITEM_ID_COLUMN], 26 | childColumns = [PlaylistMediaItemCrossRef.MEDIA_ITEM_ID_COLUMN], 27 | onDelete = ForeignKey.CASCADE 28 | ) 29 | ], 30 | indices = [ 31 | Index(PlaylistMediaItemCrossRef.MEDIA_ITEM_ID_COLUMN), 32 | ] 33 | ) 34 | data class PlaylistMediaItemCrossRef( 35 | @ColumnInfo(name = PLAYLIST_ID_COLUMN) 36 | val playlistId: Long, 37 | @ColumnInfo(name = MEDIA_ITEM_ID_COLUMN) 38 | val mediaItemId: Long, 39 | ) { 40 | companion object { 41 | const val PLAYLIST_ID_COLUMN = "playlistId" 42 | const val MEDIA_ITEM_ID_COLUMN = "mediaItemId" 43 | } 44 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/logic/data/db/entity/PlaylistWithMediaItem.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.logic.data.db.entity 2 | 3 | import androidx.room.Embedded 4 | import androidx.room.Junction 5 | import androidx.room.Relation 6 | 7 | /** 8 | * A [playlist] contains many [mediaItems]. 9 | */ 10 | data class PlaylistWithMediaItem( 11 | @Embedded 12 | val playlist: Playlist, 13 | @Relation( 14 | parentColumn = Playlist.PLAYLIST_ID_COLUMN, 15 | entityColumn = MediaItem.MEDIA_ITEM_ID_COLUMN, 16 | associateBy = Junction(PlaylistMediaItemCrossRef::class) 17 | ) 18 | val mediaItems: MutableList 19 | ) 20 | -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/logic/ui/CenteredImageSpan.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.logic.ui 2 | 3 | import android.graphics.Canvas 4 | import android.graphics.Paint 5 | import android.graphics.drawable.Drawable 6 | import android.text.style.ImageSpan 7 | import androidx.core.graphics.withTranslation 8 | 9 | class CenteredImageSpan(private val drawable: Drawable) : ImageSpan(drawable) { 10 | 11 | override fun draw( 12 | canvas: Canvas, 13 | text: CharSequence, 14 | start: Int, 15 | end: Int, 16 | x: Float, 17 | top: Int, 18 | y: Int, 19 | bottom: Int, 20 | paint: Paint 21 | ) { 22 | val drawable = drawable 23 | val fontMetrics = paint.fontMetricsInt 24 | val transY = (y + fontMetrics.ascent + y + fontMetrics.descent) / 2 - drawable.bounds.bottom / 2 25 | canvas.withTranslation(x, transY.toFloat()) { 26 | drawable.draw(this) 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/logic/utils/EnvUtils.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.logic.utils 2 | 3 | import android.content.Context 4 | import android.content.res.Configuration 5 | 6 | object EnvUtils { 7 | 8 | fun isDarkMode(context: Context): Boolean = 9 | context.resources.configuration.uiMode and 10 | Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES 11 | 12 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/logic/utils/exoplayer/GramophoneRenderFactory.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.logic.utils.exoplayer 2 | 3 | import android.content.Context 4 | import android.os.Handler 5 | import android.os.Looper 6 | import androidx.annotation.OptIn 7 | import androidx.media3.common.util.UnstableApi 8 | import androidx.media3.exoplayer.DefaultRenderersFactory 9 | import androidx.media3.exoplayer.Renderer 10 | import androidx.media3.exoplayer.mediacodec.MediaCodecSelector 11 | import androidx.media3.exoplayer.text.TextOutput 12 | import androidx.media3.exoplayer.video.VideoRendererEventListener 13 | 14 | @OptIn(UnstableApi::class) 15 | class GramophoneRenderFactory(context: Context) : DefaultRenderersFactory(context) { 16 | override fun buildTextRenderers( 17 | context: Context, 18 | output: TextOutput, 19 | outputLooper: Looper, 20 | extensionRendererMode: Int, 21 | out: ArrayList 22 | ) { 23 | // empty 24 | } 25 | 26 | override fun buildVideoRenderers( 27 | context: Context, 28 | extensionRendererMode: Int, 29 | mediaCodecSelector: MediaCodecSelector, 30 | enableDecoderFallback: Boolean, 31 | eventHandler: Handler, 32 | eventListener: VideoRendererEventListener, 33 | allowedVideoJoiningTimeMs: Long, 34 | out: java.util.ArrayList 35 | ) { 36 | // empty 37 | } 38 | 39 | override fun buildImageRenderers(out: java.util.ArrayList) { 40 | // empty 41 | } 42 | 43 | override fun buildCameraMotionRenderers( 44 | context: Context, 45 | extensionRendererMode: Int, 46 | out: java.util.ArrayList 47 | ) { 48 | // empty 49 | } 50 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/ui/adapters/HeaderAdapter.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.ui.adapters 2 | 3 | import android.view.LayoutInflater 4 | import android.view.View 5 | import android.view.ViewGroup 6 | import androidx.recyclerview.widget.RecyclerView 7 | 8 | class HeaderAdapter(private val viewResId: Int) : RecyclerView.Adapter() { 9 | 10 | class HeaderViewHolder(view: View) : RecyclerView.ViewHolder(view) 11 | 12 | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HeaderViewHolder { 13 | val view = LayoutInflater.from(parent.context).inflate(viewResId, parent, false) 14 | return HeaderViewHolder(view) 15 | } 16 | 17 | override fun onBindViewHolder(holder: HeaderViewHolder, position: Int) { 18 | } 19 | 20 | override fun getItemCount(): Int = 1 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/ui/adapters/MainPageAdapter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Akane Foundation 3 | * 4 | * Gramophone is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * Gramophone is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | package org.akanework.gramophone.ui.adapters 19 | 20 | import androidx.fragment.app.Fragment 21 | import androidx.fragment.app.FragmentManager 22 | import androidx.lifecycle.Lifecycle 23 | import androidx.viewpager2.adapter.FragmentStateAdapter 24 | import org.akanework.gramophone.ui.fragments.BaseWrapperFragment 25 | 26 | /** 27 | * This is the ViewPager2 adapter. 28 | */ 29 | class MainPageAdapter( 30 | fragmentManager: FragmentManager, 31 | lifecycle: Lifecycle, 32 | ) : FragmentStateAdapter(fragmentManager, lifecycle) { 33 | 34 | override fun getItemCount(): Int = 4 35 | 36 | override fun createFragment(position: Int): Fragment = 37 | BaseWrapperFragment(position) 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/ui/components/CustomGridLayoutManager.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Akane Foundation 3 | * 4 | * Gramophone is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * Gramophone is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | package org.akanework.gramophone.ui.components 19 | 20 | import android.content.Context 21 | import androidx.recyclerview.widget.GridLayoutManager 22 | 23 | /** 24 | * CustomGridLayoutManager: 25 | * A grid layout manager for making the grid view 26 | * intact. 27 | * 28 | * @author AkaneTan 29 | */ 30 | class CustomGridLayoutManager( 31 | context: Context, 32 | spanCount: Int, 33 | ) : GridLayoutManager(context, spanCount) { 34 | init { 35 | spanSizeLookup = 36 | object : SpanSizeLookup() { 37 | override fun getSpanSize(position: Int): Int = 38 | if (position == 0) { 39 | spanCount 40 | } else { 41 | 1 42 | } 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/ui/components/CustomLinearLayoutManager.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.ui.components 2 | 3 | import android.content.Context 4 | import androidx.recyclerview.widget.LinearLayoutManager 5 | import androidx.recyclerview.widget.RecyclerView 6 | import org.akanework.gramophone.logic.dpToPx 7 | 8 | class CustomLinearLayoutManager(private val context: Context) : LinearLayoutManager(context) { 9 | override fun calculateExtraLayoutSpace(state: RecyclerView.State, extraLayoutSpace: IntArray) { 10 | extraLayoutSpace[0] = 512.dpToPx(context) 11 | extraLayoutSpace[1] = 512.dpToPx(context) 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/ui/components/CustomTextView.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.ui.components 2 | 3 | import android.content.Context 4 | import android.graphics.Canvas 5 | import android.graphics.Color 6 | import android.graphics.LinearGradient 7 | import android.graphics.Matrix 8 | import android.graphics.Shader 9 | import android.util.AttributeSet 10 | import androidx.appcompat.widget.AppCompatTextView 11 | 12 | class CustomTextView @JvmOverloads constructor( 13 | context: Context, 14 | attrs: AttributeSet? = null, 15 | defStyleAttr: Int = 0, 16 | val colors: IntArray = intArrayOf(Color.WHITE), 17 | val durationStart: Long = -1L, 18 | val durationEnd: Long = -1L, 19 | val contentHash: Int = 10721 20 | ) : AppCompatTextView(context, attrs, defStyleAttr) { 21 | 22 | var gradient: LinearGradient? = null 23 | val localMatrix = Matrix() 24 | var currentProgress = 0f 25 | 26 | fun setProgress( 27 | percent: Float, 28 | invalidate: Boolean = true 29 | ) { 30 | currentProgress = percent 31 | localMatrix.setTranslate(percent * width, height.toFloat()) 32 | gradient?.setLocalMatrix(localMatrix) 33 | if (invalidate) invalidate() 34 | } 35 | 36 | fun setDefaultGradient() = updateGradient(colors) 37 | 38 | fun updateGradient(colors: IntArray) { 39 | gradient = LinearGradient( 40 | -width / 1f, 41 | 0f, 42 | 0f, 43 | 0f, 44 | colors, 45 | null, 46 | Shader.TileMode.CLAMP 47 | ) 48 | } 49 | 50 | override fun onDraw(canvas: Canvas) { 51 | paint.shader = gradient 52 | super.onDraw(canvas) 53 | paint.shader = null 54 | } 55 | 56 | override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { 57 | super.onLayout(changed, left, top, right, bottom) 58 | setDefaultGradient() 59 | } 60 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/ui/components/GridPaddingDecorationLibrary.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.ui.components 2 | 3 | import android.content.Context 4 | import android.content.res.Configuration 5 | import android.graphics.Rect 6 | import android.view.View 7 | import androidx.recyclerview.widget.ConcatAdapter 8 | import androidx.recyclerview.widget.RecyclerView 9 | import org.akanework.gramophone.R 10 | 11 | class GridPaddingDecorationLibrary(context: Context) : RecyclerView.ItemDecoration() { 12 | private var mPadding = context.resources.getDimensionPixelSize(R.dimen.grid_card_side_padding) 13 | private val columnSize = if (context.resources.configuration.orientation 14 | == Configuration.ORIENTATION_PORTRAIT 15 | ) 2 else 4 16 | 17 | override fun getItemOffsets( 18 | outRect: Rect, 19 | view: View, 20 | parent: RecyclerView, 21 | state: RecyclerView.State 22 | ) { 23 | var itemPosition = parent.getChildAdapterPosition(view) 24 | itemPosition -= ((parent.adapter as ConcatAdapter).adapters[0].itemCount + (parent.adapter as ConcatAdapter).adapters[1].itemCount) 25 | if (itemPosition < 0) return 26 | (parent.adapter as ConcatAdapter).adapters[1]?.let { 27 | if (itemPosition % columnSize == 0) { 28 | outRect.left = mPadding 29 | } else if (itemPosition % columnSize - 1 == 0) { 30 | outRect.right = mPadding 31 | } else { 32 | return@getItemOffsets 33 | } 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/ui/components/LyricPaddingDecoration.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.ui.components 2 | 3 | import android.content.Context 4 | import android.graphics.Rect 5 | import android.view.View 6 | import androidx.recyclerview.widget.RecyclerView 7 | import org.akanework.gramophone.R 8 | 9 | class LyricPaddingDecoration(context: Context) : RecyclerView.ItemDecoration() { 10 | 11 | private val topPadding = context.resources.getDimensionPixelSize(R.dimen.lyric_top_padding) 12 | private val bottomPadding = context.resources.getDimensionPixelSize(R.dimen.lyric_bottom_padding) 13 | 14 | override fun getItemOffsets( 15 | outRect: Rect, 16 | view: View, 17 | parent: RecyclerView, 18 | state: RecyclerView.State 19 | ) { 20 | super.getItemOffsets(outRect, view, parent, state) 21 | val itemPosition = parent.getChildAdapterPosition(view) 22 | if (itemPosition == 0) { 23 | outRect.top = topPadding 24 | } else if (itemPosition == parent.adapter!!.itemCount - 1) { 25 | outRect.bottom = bottomPadding 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/ui/fragments/AboutContributorFragment.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.ui.fragments 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import androidx.core.widget.NestedScrollView 8 | import com.google.android.material.appbar.AppBarLayout 9 | import com.google.android.material.appbar.MaterialToolbar 10 | import org.akanework.gramophone.R 11 | import org.akanework.gramophone.logic.enableEdgeToEdgePaddingListener 12 | 13 | class AboutContributorFragment : BaseElevatedFragment(null) { 14 | override fun onCreateView( 15 | inflater: LayoutInflater, 16 | container: ViewGroup?, 17 | savedInstanceState: Bundle? 18 | ): View? { 19 | val rootView = inflater.inflate(R.layout.fragment_about_inner, container, false) 20 | val appBarLayout = rootView.findViewById(R.id.appbarlayout) 21 | val materialToolbar = rootView.findViewById(R.id.topAppBar) 22 | val nestedScrollView = rootView.findViewById(R.id.nested) 23 | 24 | appBarLayout.enableEdgeToEdgePaddingListener() 25 | nestedScrollView.enableEdgeToEdgePaddingListener() 26 | 27 | materialToolbar.setNavigationOnClickListener { 28 | requireActivity().supportFragmentManager.popBackStack() 29 | } 30 | 31 | return rootView 32 | } 33 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/ui/fragments/BaseSettingFragment.kt: -------------------------------------------------------------------------------- 1 | package org.akanework.gramophone.ui.fragments 2 | 3 | import android.os.Bundle 4 | import android.view.LayoutInflater 5 | import android.view.View 6 | import android.view.ViewGroup 7 | import com.google.android.material.appbar.AppBarLayout 8 | import com.google.android.material.appbar.MaterialToolbar 9 | import org.akanework.gramophone.R 10 | import org.akanework.gramophone.logic.enableEdgeToEdgePaddingListener 11 | 12 | abstract class BaseSettingFragment( 13 | private val str: Int, 14 | private val fragmentCreator: () -> BasePreferenceFragment 15 | ) : BaseFragment(false) { 16 | override fun onCreateView( 17 | inflater: LayoutInflater, 18 | container: ViewGroup?, 19 | savedInstanceState: Bundle?, 20 | ): View? { 21 | val rootView = inflater.inflate(R.layout.fragment_top_settings, container, false) 22 | val topAppBar = rootView.findViewById(R.id.topAppBar) 23 | 24 | rootView.findViewById(R.id.appbarlayout).enableEdgeToEdgePaddingListener() 25 | topAppBar.title = getString(str) 26 | topAppBar.setNavigationOnClickListener { 27 | requireActivity().supportFragmentManager.popBackStack() 28 | } 29 | 30 | childFragmentManager 31 | .beginTransaction() 32 | .addToBackStack(System.currentTimeMillis().toString()) 33 | .add(R.id.settings, fragmentCreator()) 34 | .commit() 35 | 36 | return rootView 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/ui/fragments/settings/AudioSettingsTopFragment.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Akane Foundation 3 | * 4 | * Gramophone is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * Gramophone is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | package org.akanework.gramophone.ui.fragments.settings 19 | 20 | import android.os.Bundle 21 | import org.akanework.gramophone.R 22 | import org.akanework.gramophone.ui.fragments.BasePreferenceFragment 23 | import org.akanework.gramophone.ui.fragments.BaseSettingFragment 24 | 25 | class AudioSettingsFragment : BaseSettingFragment(R.string.settings_audio, 26 | { AudioSettingsTopFragment() }) 27 | 28 | class AudioSettingsTopFragment : BasePreferenceFragment() { 29 | override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { 30 | setPreferencesFromResource(R.xml.settings_audio, rootKey) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/org/akanework/gramophone/ui/fragments/settings/ExperimentalSettingsTopFragment.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2024 Akane Foundation 3 | * 4 | * Gramophone is free software: you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation, either version 3 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * Gramophone is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program. If not, see . 16 | */ 17 | 18 | package org.akanework.gramophone.ui.fragments.settings 19 | 20 | import android.os.Bundle 21 | import androidx.preference.Preference 22 | import org.akanework.gramophone.R 23 | import org.akanework.gramophone.ui.fragments.BasePreferenceFragment 24 | import org.akanework.gramophone.ui.fragments.BaseSettingFragment 25 | 26 | class ExperimentalSettingsFragment : BaseSettingFragment(R.string.settings_experimental_settings, 27 | { ExperimentalSettingsTopFragment() }) 28 | 29 | class ExperimentalSettingsTopFragment : BasePreferenceFragment() { 30 | 31 | private lateinit var e: Exception 32 | 33 | override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { 34 | setPreferencesFromResource(R.xml.settings_experimental, rootKey) 35 | e = RuntimeException("skill issue") 36 | } 37 | 38 | override fun onPreferenceTreeClick(preference: Preference): Boolean { 39 | if (preference.key == "crash") { 40 | throw IllegalArgumentException("I crashed your app >:)", e) 41 | } 42 | return super.onPreferenceTreeClick(preference) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_left.xml: -------------------------------------------------------------------------------- 1 | 19 | 20 | 23 | 27 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_in_right.xml: -------------------------------------------------------------------------------- 1 | 19 | 20 | 23 | 27 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_left.xml: -------------------------------------------------------------------------------- 1 | 19 | 20 | 23 | 27 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_out_right.xml: -------------------------------------------------------------------------------- 1 | 19 | 20 | 23 | 27 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/color/sl_check_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/sl_check_button_playlist_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/sl_check_button_playlist_icon_tint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/color/sl_fav_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/accord_mix_1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/res/drawable/accord_mix_1.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/accord_mix_1_banner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/accord_mix_2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/res/drawable/accord_mix_2.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/accord_mix_2_banner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/accord_mix_3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/res/drawable/accord_mix_3.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/accord_mix_3_banner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/accord_mix_4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/res/drawable/accord_mix_4.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/accord_mix_4_banner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/afs_popup_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 23 | 26 | 27 | 31 | 32 | 35 | 36 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/akane_avatar.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/res/drawable/akane_avatar.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/apple_lossless_seeklogo.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/awainatsu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/res/drawable/awainatsu.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_arrow_downward_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_arrow_upward_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_keyboard_double_arrow_down_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | 12 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/duo3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/res/drawable/duo3.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/fastscroller_thumb.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18 | 19 | 23 | 26 | 27 | 28 | 29 | 32 | 33 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_accord_logo_alt.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 12 | 15 | 18 | 21 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_album.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_album_fixed.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_album_sort.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_align_center.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_apple_next.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_apple_pause.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_apple_play.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_apple_previous.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_apple_sort.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_back_ios.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_article.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_artist_sort.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bullet_list_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_character.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_chevron_right.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_collections_bookmark.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_colors.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_contributors.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 13 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dashboard_customize.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_default_cover.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_default_cover_artist.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_default_cover_date.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_default_cover_favourite.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_default_cover_fixed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_default_cover_genre.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_default_cover_manuscript.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_default_cover_playlist.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dot.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_edit.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 13 | 14 | 15 | 16 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_equalizer.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_expand_more.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_experiment.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_favourite.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_folder.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_format_align_center.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_format_bold.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_genres.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_gramophone_monochrome.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 14 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_gramophone_notification.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 14 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_groups.xml: -------------------------------------------------------------------------------- 1 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_headphones.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_infinity.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 15 | 19 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_layout_type.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_library_link_icon_album.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_library_link_icon_artists.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_library_link_icon_playlists.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_library_link_icon_songs.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lyrics.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_lyrics_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_manufacturing.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_media_play_anim.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 10 | 14 | 19 | 20 | 21 | 22 | 23 | 24 | 31 | 32 | 33 | 34 | 35 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more_vert_alt.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more_vert_bold.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_music_note_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_favorited.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_lyrics.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_lyricson.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_more.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_more_fill.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_mp_fforward.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_mp_pause.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_mp_play.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_queue.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_nowplaying_queueon.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_palette.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pause_filled.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_arrow.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_play_arrow_filled.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_playlist_play.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_playlist_play_filled.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_queue_btn.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_quote_bubble_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_refresh.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_remove.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_repeat.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_repeat_off.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rounded_corner.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_schedule.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_script.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_script_filled.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings.xml: -------------------------------------------------------------------------------- 1 | 8 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_skip_next.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_skip_next_filled.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_skip_previous.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_skip_previous_filled.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_speaker_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_speaker_wave_3_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 14 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_star.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_star_filled.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_text_fields.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_timer_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_transparent.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_warning.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/lazar.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/res/drawable/lazar.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/luka.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/res/drawable/luka.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/nick.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/res/drawable/nick.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/popup_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rp_buttons.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rp_buttons_dynamic.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selected_chip_background.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/skyd.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FoedusProgramme/AccordLegacy/9a47dd475e668ad66d632b93115bd67ab6d2ae63/app/src/main/res/drawable/skyd.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/sl_check_timer.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/sp_shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_browse.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_home.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_library.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_search.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/src/main/res/layout/adapter_blacklist_folder_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 18 | 19 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_about.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 19 | 20 | 21 | 26 | 27 | 33 | 34 | 41 | 42 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_recyclerview.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_viewpager.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_wrapper.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/homepage_recommend_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 20 | 21 | 26 | 27 | 28 | 29 | 36 | 37 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/layout/library_entry.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 22 | 23 | 34 | 35 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/layout/lyric_common.xml: -------------------------------------------------------------------------------- 1 | 2 | 18 | 19 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/lyric_content.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/lyric_syllable.xml: -------------------------------------------------------------------------------- 1 | 2 | 18 | 19 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_category_md.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 24 | 25 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_icon.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 26 | 27 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_switch_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/layout/recently_added.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/menu/bottom_nav.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 15 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/menu/home_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 14 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/menu/more_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 12 | 15 | 18 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/menu/more_menu_less.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/raw/keep.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/resources.properties: -------------------------------------------------------------------------------- 1 | unqualifiedResLocale=en-US -------------------------------------------------------------------------------- /app/src/main/res/values-it/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 0 4 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |