├── gradle.properties ├── fastlane └── metadata │ ├── android │ ├── en-US │ │ ├── title.txt │ │ ├── short_description.txt │ │ ├── images │ │ │ ├── icon.png │ │ │ ├── featureGraphic.png │ │ │ └── phoneScreenshots │ │ │ │ ├── 1.png │ │ │ │ ├── 10.png │ │ │ │ ├── 11.png │ │ │ │ ├── 12.png │ │ │ │ ├── 13.png │ │ │ │ ├── 14.png │ │ │ │ ├── 15.png │ │ │ │ ├── 2.png │ │ │ │ ├── 3.png │ │ │ │ ├── 4.png │ │ │ │ ├── 5.png │ │ │ │ ├── 6.png │ │ │ │ ├── 7.png │ │ │ │ ├── 8.png │ │ │ │ └── 9.png │ │ ├── changelogs │ │ │ ├── 7.txt │ │ │ ├── 13.txt │ │ │ ├── 8.txt │ │ │ ├── 6.txt │ │ │ ├── 14.txt │ │ │ ├── 9.txt │ │ │ └── 10.txt │ │ └── full_description.txt │ └── de-DE │ │ ├── short_description.txt │ │ ├── images │ │ ├── featureGraphic.png │ │ └── phoneScreenshots │ │ │ ├── 1.png │ │ │ ├── 10.png │ │ │ ├── 11.png │ │ │ ├── 12.png │ │ │ ├── 13.png │ │ │ ├── 14.png │ │ │ ├── 15.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ ├── 5.png │ │ │ ├── 6.png │ │ │ ├── 7.png │ │ │ ├── 8.png │ │ │ └── 9.png │ │ └── full_description.txt │ └── org.hollowbamboo.chordreader2.yml ├── gimp └── feature.xcf ├── app ├── src │ ├── main │ │ ├── res │ │ │ ├── raw │ │ │ │ ├── bgrd_vid.mp4 │ │ │ │ ├── about_body_en.htm │ │ │ │ ├── about_body_es.htm │ │ │ │ ├── about_body_de.htm │ │ │ │ └── about_body_fr.htm │ │ │ ├── drawable │ │ │ │ ├── blue_glow.9.png │ │ │ │ ├── ic_menu_add.png │ │ │ │ ├── ic_menu_edit.png │ │ │ │ ├── ic_menu_save.png │ │ │ │ ├── ic_menu_stop.png │ │ │ │ ├── ic_btn_delete.png │ │ │ │ ├── ic_btn_search.png │ │ │ │ ├── ic_dialog_info.png │ │ │ │ ├── ic_menu_delete.png │ │ │ │ ├── ic_menu_manage.png │ │ │ │ ├── ic_menu_refresh.png │ │ │ │ ├── ic_menu_search.png │ │ │ │ ├── ic_menu_upload.png │ │ │ │ ├── ic_btn_next_song.png │ │ │ │ ├── ic_dialog_cancel.png │ │ │ │ ├── ic_menu_music_up.png │ │ │ │ ├── ic_btn_blue_glow.9.png │ │ │ │ ├── ic_btn_previous_song.png │ │ │ │ ├── ic_menu_info_details.png │ │ │ │ ├── ic_menu_preferences.png │ │ │ │ ├── ic_menu_select_all.png │ │ │ │ ├── ic_btn_autoscroll_play.png │ │ │ │ ├── ic_btn_autoscroll_faster.png │ │ │ │ ├── ic_btn_autoscroll_pause.png │ │ │ │ ├── ic_btn_autoscroll_slower.png │ │ │ │ ├── ic_btn_blue_glow_pressed.9.png │ │ │ │ ├── dialog_divider_horizontal_light.9.png │ │ │ │ ├── popup_background.xml │ │ │ │ ├── ic_baseline_drag_handle_24.xml │ │ │ │ ├── button_blue_glow_selector.xml │ │ │ │ ├── ic_baseline_delete_24.xml │ │ │ │ ├── baseline_check_48.xml │ │ │ │ ├── round_button.xml │ │ │ │ ├── ic_check_box.xml │ │ │ │ ├── focused_shape.xml │ │ │ │ ├── pressed_shape.xml │ │ │ │ ├── edit_text_border.xml │ │ │ │ ├── baseline_share_24.xml │ │ │ │ ├── app_selector_android.xml │ │ │ │ ├── app_selector.xml │ │ │ │ └── app_selector_light.xml │ │ │ ├── drawable-hdpi │ │ │ │ ├── ic_media_next.png │ │ │ │ ├── ic_media_previous.png │ │ │ │ └── dialog_divider_horizontal_light.9.png │ │ │ ├── drawable-mdpi │ │ │ │ ├── ic_media_next.png │ │ │ │ └── ic_media_previous.png │ │ │ ├── drawable-xhdpi │ │ │ │ ├── ic_media_next.png │ │ │ │ └── ic_media_previous.png │ │ │ ├── drawable-xxhdpi │ │ │ │ ├── ic_media_next.png │ │ │ │ └── ic_media_previous.png │ │ │ ├── mipmap-hdpi │ │ │ │ ├── chord_reader_icon.png │ │ │ │ ├── chord_reader_icon_round.png │ │ │ │ ├── chord_reader_icon_background.png │ │ │ │ └── chord_reader_icon_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── chord_reader_icon.png │ │ │ │ ├── chord_reader_icon_round.png │ │ │ │ ├── chord_reader_icon_background.png │ │ │ │ └── chord_reader_icon_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── chord_reader_icon.png │ │ │ │ ├── chord_reader_icon_round.png │ │ │ │ ├── chord_reader_icon_background.png │ │ │ │ └── chord_reader_icon_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── chord_reader_icon.png │ │ │ │ ├── chord_reader_icon_round.png │ │ │ │ ├── chord_reader_icon_background.png │ │ │ │ └── chord_reader_icon_foreground.png │ │ │ ├── drawable-xxxhdpi │ │ │ │ └── drawer_shadow.9.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── chord_reader_icon.png │ │ │ │ ├── chord_reader_icon_round.png │ │ │ │ ├── chord_reader_icon_background.png │ │ │ │ └── chord_reader_icon_foreground.png │ │ │ ├── xml │ │ │ │ ├── provider_paths.xml │ │ │ │ └── settings.xml │ │ │ ├── values-hdpi │ │ │ │ └── dimensions.xml │ │ │ ├── layout │ │ │ │ ├── spinner_chord_edit.xml │ │ │ │ ├── settings.xml │ │ │ │ ├── spinner_custom_style.xml │ │ │ │ ├── guitar_chord_dialog.xml │ │ │ │ ├── intro_dialog.xml │ │ │ │ ├── content_main.xml │ │ │ │ ├── fragment_help.xml │ │ │ │ ├── app_bar_main.xml │ │ │ │ ├── drawer_list_item.xml │ │ │ │ ├── list_item_drawer.xml │ │ │ │ ├── activity_main.xml │ │ │ │ ├── nav_header_main.xml │ │ │ │ ├── simple_list_item.xml │ │ │ │ ├── list_item_simple.xml │ │ │ │ ├── enhanced_seek_bar.xml │ │ │ │ ├── drawer_n_activity.xml │ │ │ │ ├── fragment_draggable_list.xml │ │ │ │ ├── spinner_dropdown_filename.xml │ │ │ │ ├── confirm_chords_dialog.xml │ │ │ │ ├── simple_dropdown_item_2line.xml │ │ │ │ ├── checkbox_dropdown_filename.xml │ │ │ │ ├── popup_chord.xml │ │ │ │ ├── transpose_dialog.xml │ │ │ │ ├── list_item_setlist_songs.xml │ │ │ │ ├── about.xml │ │ │ │ ├── fragment_start.xml │ │ │ │ ├── fragment_list.xml │ │ │ │ └── fragment_song_view.xml │ │ │ ├── values-xhdpi │ │ │ │ └── dimensions.xml │ │ │ ├── anim │ │ │ │ ├── slide_top_to_bottom.xml │ │ │ │ ├── blink_anim.xml │ │ │ │ ├── blink_infinite_anim.xml │ │ │ │ ├── grow_from_top.xml │ │ │ │ ├── grow_from_bottom.xml │ │ │ │ ├── shrink_from_bottom.xml │ │ │ │ ├── shrink_from_top.xml │ │ │ │ ├── scale_fade_in.xml │ │ │ │ ├── scale_fade_out.xml │ │ │ │ └── blink_metronome.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── chord_reader_icon.xml │ │ │ │ └── chord_reader_icon_round.xml │ │ │ ├── values-mdpi │ │ │ │ └── dimensions.xml │ │ │ ├── values │ │ │ │ ├── dimensions.xml │ │ │ │ ├── attrs.xml │ │ │ │ ├── colors.xml │ │ │ │ ├── styles.xml │ │ │ │ └── arrays.xml │ │ │ ├── drawable-anydpi │ │ │ │ ├── ic_media_next.xml │ │ │ │ └── ic_media_previous.xml │ │ │ ├── menu │ │ │ │ ├── set_list_menu.xml │ │ │ │ ├── web_view_menu.xml │ │ │ │ ├── activity_main_drawer.xml │ │ │ │ ├── song_view_menu.xml │ │ │ │ └── list_view_menu.xml │ │ │ └── layout-large │ │ │ │ ├── list_item_drawer.xml │ │ │ │ ├── simple_list_item.xml │ │ │ │ ├── drawer_list_item.xml │ │ │ │ └── fragment_start.xml │ │ ├── chord_reader_icon-playstore.png │ │ ├── java │ │ │ └── org │ │ │ │ └── hollowbamboo │ │ │ │ └── chordreader2 │ │ │ │ ├── ChordWebpage.java │ │ │ │ ├── interfaces │ │ │ │ ├── OnItemClickListener.java │ │ │ │ └── StartDragListener.java │ │ │ │ ├── util │ │ │ │ ├── ListUtil.java │ │ │ │ ├── Pair.java │ │ │ │ ├── InternalURLSpan.java │ │ │ │ ├── EnumMultiMapBuilder.java │ │ │ │ ├── UtilLogger.java │ │ │ │ ├── StringUtil.java │ │ │ │ └── ItemMoveCallback.java │ │ │ │ ├── chords │ │ │ │ ├── ChordRoot.java │ │ │ │ ├── regex │ │ │ │ │ ├── ChordRegex.java │ │ │ │ │ ├── TokenInText.java │ │ │ │ │ ├── ChordInText.java │ │ │ │ │ └── ChordRegexes.java │ │ │ │ ├── ChordQuality.java │ │ │ │ ├── ChordAdded.java │ │ │ │ ├── ChordSuspended.java │ │ │ │ ├── NoteNaming.java │ │ │ │ ├── Chord.java │ │ │ │ └── ChordExtended.java │ │ │ │ ├── db │ │ │ │ └── Transposition.java │ │ │ │ ├── helper │ │ │ │ ├── PackageHelper.java │ │ │ │ ├── MetadataExtractionHelper.kt │ │ │ │ └── TransposeHelper.java │ │ │ │ ├── model │ │ │ │ └── DataViewModel.java │ │ │ │ ├── adapter │ │ │ │ ├── BasicTwoLineAdapter.java │ │ │ │ └── ChordPagerAdapter.java │ │ │ │ ├── data │ │ │ │ └── ColorScheme.java │ │ │ │ └── ui │ │ │ │ └── HelpFragment.java │ │ └── AndroidManifest.xml │ └── test │ │ └── java │ │ └── org │ │ └── hollowbamboo │ │ └── chordreader2 │ │ ├── StringUtilTest.kt │ │ └── MetadataExtractionHelperTest.kt └── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── settings.gradle ├── .github ├── workflows │ └── test-pull-requests-targeting-master.yml └── FUNDING.yml ├── .gitignore ├── Disclaimer ├── README.md └── gradlew.bat /gradle.properties: -------------------------------------------------------------------------------- 1 | android.useAndroidX=true -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | ChordReader 2 -------------------------------------------------------------------------------- /gimp/feature.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/gimp/feature.xcf -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | A digital music book to fetch online and store locally chords and lyrics -------------------------------------------------------------------------------- /app/src/main/res/raw/bgrd_vid.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/raw/bgrd_vid.mp4 -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/short_description.txt: -------------------------------------------------------------------------------- 1 | Ein digitales Musikbuch um Songs im Web zu Suchen und lokal zu Speichern 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable/blue_glow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/blue_glow.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_add.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_edit.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_save.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_stop.png -------------------------------------------------------------------------------- /app/src/main/chord_reader_icon-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/chord_reader_icon-playstore.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_btn_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_btn_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dialog_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_dialog_info.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_delete.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_manage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_manage.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_refresh.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_upload.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_next_song.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_btn_next_song.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_dialog_cancel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_dialog_cancel.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_music_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_music_up.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_media_next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable-hdpi/ic_media_next.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_media_next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable-mdpi/ic_media_next.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_media_next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable-xhdpi/ic_media_next.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_media_next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable-xxhdpi/ic_media_next.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_blue_glow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_btn_blue_glow.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_previous_song.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_btn_previous_song.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_info_details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_info_details.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_preferences.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_menu_select_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_menu_select_all.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/chord_reader_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-hdpi/chord_reader_icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/chord_reader_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-mdpi/chord_reader_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_media_previous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable-hdpi/ic_media_previous.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_media_previous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable-mdpi/ic_media_previous.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_autoscroll_play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_btn_autoscroll_play.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/chord_reader_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xhdpi/chord_reader_icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/chord_reader_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xxhdpi/chord_reader_icon.png -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/ChordWebpage.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2; 2 | 3 | public enum ChordWebpage { 4 | 5 | Chordie 6 | 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_media_previous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable-xhdpi/ic_media_previous.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_media_previous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable-xxhdpi/ic_media_previous.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/drawer_shadow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable-xxxhdpi/drawer_shadow.9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_autoscroll_faster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_btn_autoscroll_faster.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_autoscroll_pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_btn_autoscroll_pause.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_autoscroll_slower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_btn_autoscroll_slower.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/chord_reader_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xxxhdpi/chord_reader_icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/7.txt: -------------------------------------------------------------------------------- 1 | - New Feature: Share files - active song, selection from song list, active setlist 2 | - Improve behaviour saving of setlist -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_btn_blue_glow_pressed.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/ic_btn_blue_glow_pressed.9.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/chord_reader_icon_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-hdpi/chord_reader_icon_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/chord_reader_icon_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-mdpi/chord_reader_icon_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/chord_reader_icon_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xhdpi/chord_reader_icon_round.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/featureGraphic.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/featureGraphic.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/chord_reader_icon_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xxhdpi/chord_reader_icon_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/chord_reader_icon_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xxxhdpi/chord_reader_icon_round.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/13.txt: -------------------------------------------------------------------------------- 1 | - Sorting by date or name in ListView added 2 | - Edit mode for setlist view added 3 | - fixed missing song names in setlist view 4 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/chord_reader_icon_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-hdpi/chord_reader_icon_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/chord_reader_icon_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-hdpi/chord_reader_icon_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/chord_reader_icon_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-mdpi/chord_reader_icon_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/chord_reader_icon_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-mdpi/chord_reader_icon_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/chord_reader_icon_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xhdpi/chord_reader_icon_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/chord_reader_icon_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xhdpi/chord_reader_icon_foreground.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/10.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/11.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/12.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/13.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/14.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/15.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/6.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/7.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/8.png -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/images/phoneScreenshots/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/de-DE/images/phoneScreenshots/9.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/10.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/11.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/12.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/13.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/14.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/15.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/8.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/9.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/dialog_divider_horizontal_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable/dialog_divider_horizontal_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/chord_reader_icon_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xxhdpi/chord_reader_icon_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/chord_reader_icon_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xxhdpi/chord_reader_icon_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/chord_reader_icon_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xxxhdpi/chord_reader_icon_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/chord_reader_icon_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/mipmap-xxxhdpi/chord_reader_icon_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/dialog_divider_horizontal_light.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndInTheClouds/chordreader2/HEAD/app/src/main/res/drawable-hdpi/dialog_divider_horizontal_light.9.png -------------------------------------------------------------------------------- /app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/interfaces/OnItemClickListener.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.interfaces; 2 | 3 | public interface OnItemClickListener { 4 | void onItemClick(String item); 5 | } 6 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/8.txt: -------------------------------------------------------------------------------- 1 | - New feature: Open shared URLs 2 | - New feature: New theme "Automatic" follows Android's "Night Mode" 3 | - Change transposition by tapping the labels next to the seek bar 4 | - Improved filenames for chords from ultimate-guitar.com -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Jun 08 19:21:47 CEST 2023 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-hdpi/dimensions.xml: -------------------------------------------------------------------------------- 1 | 2 | 22dp 3 | 16sp 4 | 14dp 5 | 5dp 6 | 32dp 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/interfaces/StartDragListener.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.interfaces; 2 | 3 | import androidx.recyclerview.widget.RecyclerView; 4 | 5 | public interface StartDragListener { 6 | void requestDrag(RecyclerView.ViewHolder viewHolder); 7 | } 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/spinner_chord_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-xhdpi/dimensions.xml: -------------------------------------------------------------------------------- 1 | 2 | 22dp 3 | 16sp 4 | 14dp 5 | 5dp 6 | 32dp 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/anim/slide_top_to_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/layout/settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/chord_reader_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/chord_reader_icon_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-mdpi/dimensions.xml: -------------------------------------------------------------------------------- 1 | 2 | 40dp 3 | 380dp 4 | 24sp 5 | 18dp 6 | 16dp 7 | 40dp 8 | 9 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/6.txt: -------------------------------------------------------------------------------- 1 | - Changelog added to F-Droid 2 | - Web extraction: now extracts BPM if provided 3 | - Bug fixes: 4 | > Save setlist only when changed, 5 | > catch null pointers while wakelock acquiring and restore app from background, 6 | > Improve Web extraction - fixed lost whitespaces after multiple new lines -------------------------------------------------------------------------------- /app/src/main/res/drawable/popup_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/spinner_custom_style.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_drag_handle_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/14.txt: -------------------------------------------------------------------------------- 1 | - bugfix newlines added below *** header line when saving a song #60 2 | - feat Preference for Minutes to keep screen on 3 | - refactor bulk deletion of files 4 | - bugfix adapt autoscroll velocity after update per EditView 5 | - bugfix text scaling on older tablets in SongView 6 | - bugfix and optimization of sorting by date in ListView -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/9.txt: -------------------------------------------------------------------------------- 1 | - spanish translation added 2 | - Chord parsing for unicode # and b added 3 | - New Feature: transposition data now stored to song file, not app database 4 | - Note naming selection added to confirmation chords dialog (web search) and transposition dialog (song view) added 5 | - removed auto save: always prompt for saving changes of song -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_blue_glow_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | gradlePluginPortal() 6 | } 7 | } 8 | dependencyResolutionManagement { 9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 10 | repositories { 11 | google() 12 | mavenCentral() 13 | } 14 | } 15 | rootProject.name = "chordreader2" 16 | include ':app' 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_baseline_delete_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_check_48.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimensions.xml: -------------------------------------------------------------------------------- 1 | 2 | 22dp 3 | 340dp 4 | 18sp 5 | 14sp 6 | 8sp 7 | 50sp 8 | 8dp 9 | 32dp 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/round_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/util/ListUtil.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.util; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class ListUtil { 7 | 8 | public static List concatenate(List left, List right) { 9 | List result = new ArrayList(left.size() + right.size()); 10 | result.addAll(left); 11 | result.addAll(right); 12 | return result; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/anim/blink_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/ic_media_next.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-anydpi/ic_media_previous.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/anim/blink_infinite_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/layout/guitar_chord_dialog.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_check_box.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/focused_shape.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 14 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/chords/ChordRoot.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.chords; 2 | 3 | 4 | /** 5 | * Class representing the main, root note of a chord. Note that this can be overriden, e.g. with a chord 6 | * like "C/F." But it still counts as the main, defining note of the chord 7 | * @author nolan 8 | * 9 | */ 10 | public enum ChordRoot { 11 | 12 | A, 13 | Bb, 14 | B, 15 | C, 16 | Db, 17 | D, 18 | Eb, 19 | E, 20 | F, 21 | Gb, 22 | G, 23 | Ab, 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/db/Transposition.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.db; 2 | 3 | public class Transposition { 4 | 5 | private int capo; 6 | private int transpose; 7 | 8 | public int getCapo() { 9 | return capo; 10 | } 11 | public void setCapo(int capo) { 12 | this.capo = capo; 13 | } 14 | public int getTranspose() { 15 | return transpose; 16 | } 17 | public void setTranspose(int transpose) { 18 | this.transpose = transpose; 19 | } 20 | 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pressed_shape.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 9 | 14 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/util/Pair.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.util; 2 | 3 | public class Pair { 4 | 5 | private final E first; 6 | private final T second; 7 | public Pair(E first, T second) { 8 | super(); 9 | this.first = first; 10 | this.second = second; 11 | } 12 | public E getFirst() { 13 | return first; 14 | } 15 | public T getSecond() { 16 | return second; 17 | } 18 | public String toString() { 19 | return "<" + first + ", " + second + ">"; 20 | } 21 | 22 | 23 | 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/edit_text_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/anim/grow_from_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/anim/grow_from_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/anim/shrink_from_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/anim/shrink_from_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /.github/workflows/test-pull-requests-targeting-master.yml: -------------------------------------------------------------------------------- 1 | name: Test pull requests targeting `master` 2 | on: 3 | pull_request: 4 | branches: [master] 5 | 6 | jobs: 7 | test: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v3 11 | 12 | - name: Set up Java 13 | uses: actions/setup-java@v1 14 | with: 15 | java-version: 1.8 16 | 17 | - name: Run unit tests 18 | run: ./gradlew testDebugUnitTest 19 | 20 | - name: Process the test report 21 | uses: asadmansr/android-test-report-action@v1.2.0 22 | if: ${{ always() }} 23 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/10.txt: -------------------------------------------------------------------------------- 1 | - fixed app crash at startup 2 | - fixed Nextcloud/Network file open error 3 | - Note naming English with sharps added 4 | - switch to searx.work for default search engine 5 | - keep the screen active for 5 min even in pure viewing mode 6 | - missing chords added for visualisation 7 | - reduce size of guitar_chords.json 8 | - Ukulele (4-string, standard tuning) for chord visualisation added 9 | - Laterality for chord visualisation added 10 | - ukulele chords added 11 | - fixed unnecessary prompt for zero transposition data in song view 12 | - fixed missing saving of setlist after item removal -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | #built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # files for the dex VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # generated files 12 | bin/ 13 | gen/ 14 | 15 | # Local configuration file (sdk path, etc) 16 | local.properties 17 | 18 | # Windows thumbnail db 19 | Thumbs.db 20 | 21 | # OSX files 22 | .DS_Store 23 | 24 | # Android Studio 25 | *.iml 26 | .idea 27 | #.idea/workspace.xml - remove # and delete .idea if it better suit your needs. 28 | .gradle 29 | build/ 30 | .navigation 31 | captures/ 32 | output.json 33 | 34 | #NDK 35 | obj/ 36 | .externalNativeBuild 37 | /java_pid5002.hprof 38 | /app/release/ 39 | -------------------------------------------------------------------------------- /app/src/main/res/anim/scale_fade_in.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 15 | 16 | 17 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/anim/scale_fade_out.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 15 | 16 | 17 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/chords/regex/ChordRegex.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.chords.regex; 2 | 3 | import java.util.regex.Pattern; 4 | 5 | public class ChordRegex { 6 | 7 | private Pattern pattern; 8 | private Pattern patternWithParens; 9 | 10 | public Pattern getPattern() { 11 | return pattern; 12 | } 13 | public void setPattern(Pattern pattern) { 14 | this.pattern = pattern; 15 | } 16 | public Pattern getPatternWithParens() { 17 | return patternWithParens; 18 | } 19 | public void setPatternWithParens(Pattern patternWithParens) { 20 | this.patternWithParens = patternWithParens; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/res/anim/blink_metronome.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/util/InternalURLSpan.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.util; 2 | 3 | import android.text.TextPaint; 4 | import android.text.style.ClickableSpan; 5 | import android.view.View; 6 | import android.view.View.OnClickListener; 7 | 8 | public class InternalURLSpan extends ClickableSpan { 9 | final OnClickListener mListener; 10 | 11 | public InternalURLSpan(OnClickListener listener) { 12 | mListener = listener; 13 | } 14 | 15 | @Override 16 | public void onClick(View widget) { 17 | mListener.onClick(widget); 18 | } 19 | 20 | @Override 21 | public void updateDrawState(TextPaint ds) { 22 | this.updateDrawState(ds); 23 | } 24 | 25 | } 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baseline_share_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/helper/PackageHelper.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.helper; 2 | 3 | import android.content.Context; 4 | import android.content.pm.PackageManager.NameNotFoundException; 5 | import org.hollowbamboo.chordreader2.util.UtilLogger; 6 | 7 | public class PackageHelper { 8 | 9 | private static final UtilLogger log = new UtilLogger(org.hollowbamboo.chordreader2.helper.PackageHelper.class); 10 | 11 | public static String getVersionName(Context context) { 12 | try { 13 | return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; 14 | } catch (NameNotFoundException e) { 15 | // should never happen 16 | log.d(e, "unexpected exception"); 17 | return ""; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username e.g., user1 5 | open_collective: # Replace with a single Open Collective username e.g., user1 6 | ko_fi: # Replace with a single Ko-fi username e.g., user1 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username e.g., user1 10 | issuehunt: # Replace with a single IssueHunt username e.g., user1 11 | otechie: # Replace with a single Otechie username e.g., user1 12 | custom: ['https://paypal.me/hollowbamboo'] 13 | -------------------------------------------------------------------------------- /app/src/main/res/menu/set_list_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 12 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/intro_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/util/EnumMultiMapBuilder.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.util; 2 | 3 | import java.util.Arrays; 4 | import java.util.EnumMap; 5 | import java.util.List; 6 | 7 | /** 8 | * convenience class for creating EnumMaps whose values are lists. 9 | * @author nolan 10 | * 11 | */ 12 | public class EnumMultiMapBuilder,T> { 13 | 14 | private final EnumMap> map; 15 | 16 | public EnumMultiMapBuilder(Class clazz) { 17 | map = new EnumMap>(clazz); 18 | } 19 | 20 | @SafeVarargs 21 | public final org.hollowbamboo.chordreader2.util.EnumMultiMapBuilder put(E key, T... values) { 22 | map.put(key, Arrays.asList(values)); 23 | return this; 24 | } 25 | 26 | public EnumMap> build() { 27 | return map; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/menu/web_view_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 14 | 15 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/chords/regex/TokenInText.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.chords.regex; 2 | 3 | public class TokenInText { 4 | 5 | private String token; 6 | private int startIndex; 7 | private int endIndex; 8 | public String getToken() { 9 | return token; 10 | } 11 | public int getStartIndex() { 12 | return startIndex; 13 | } 14 | public int getEndIndex() { 15 | return endIndex; 16 | } 17 | 18 | public static org.hollowbamboo.chordreader2.chords.regex.TokenInText newTokenInText(String token, int startIndex, int endIndex) { 19 | 20 | org.hollowbamboo.chordreader2.chords.regex.TokenInText tokenInText = new org.hollowbamboo.chordreader2.chords.regex.TokenInText(); 21 | 22 | tokenInText.token = token; 23 | tokenInText.startIndex = startIndex; 24 | tokenInText.endIndex = endIndex; 25 | 26 | return tokenInText; 27 | } 28 | 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/app_selector_android.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 13 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/app_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 13 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/app_selector_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 13 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_help.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 13 | 14 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/helper/MetadataExtractionHelper.kt: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.helper 2 | 3 | import android.net.Uri 4 | 5 | class MetadataExtractionHelper { 6 | fun extractSuggestedFilename(url: String, html: String): String? { 7 | val uri = Uri.parse(url) 8 | 9 | if (uri.host == ULTIMATE_GUITAR_HOST) { 10 | return getFilenameFromUltimateGuitarHTML(html) 11 | } 12 | 13 | return null 14 | } 15 | 16 | private fun getFilenameFromUltimateGuitarHTML(html: String): String? { 17 | val pattern = " 2 | 5 | 6 | 7 | 10 | 13 | 16 | 17 | 18 | 21 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | Chord Reader 2 is an enhanced version of Chord Reader, developed by Nolan Lawson. 2 | 3 | It's an app that: 4 |
    5 |
  • fetches chord charts and tabulatures for your favorite songs from the Internet,
  • 6 |
  • saves them to a local file,
  • 7 |
  • displays them in an easy-to-read format with the chords highlighted in an autoscroll view,
  • 8 |
  • transposes the identified chords up or down, or you can add a capo,
  • 9 |
  • provides common chord variations,
  • 10 |
  • provides a setlist mode to play your songs subsequently in a predefined order.
  • 11 |
12 | 13 | License: 14 | Chord Reader 2 is a free and open-source app under GPLv3+ license. 15 | 16 | Source Code: 17 | The source code is available here. 18 | Any bugs can be reported at the Issue Tracker. 19 | 20 | Donation: 21 | If you would like to donate, visit paypal.me/hollowbamboo. 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/app_bar_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FF333333 4 | #0099dd 5 | 6 | #FFf26700 7 | #FFff9000 8 | #FFfbad00 9 | #FFffc600 10 | 11 | @android:color/darker_gray 12 | #0C0C0C 13 | #FF333333 14 | #0099dd 15 | 16 | @android:color/primary_text_light_nodisable 17 | #F3F3F3 18 | #330000BB 19 | #0099dd 20 | 21 | 22 | #C1C1C1 23 | #FFA4C639 24 | @android:color/black 25 | #FF007799 26 | 27 | 28 | -------------------------------------------------------------------------------- /Disclaimer: -------------------------------------------------------------------------------- 1 | [ Disclaimer of Warranty ] 2 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION 3 | 4 | 5 | [ Limitation of Liability ] 6 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Chord Reader 2 2 | ChordReader 2 is an enhanced version of ChordReader, developed by Nolan Lawson. It's intended to keep compatibility to old devices, as old tablets still serves well as book of music. ;) 3 | 4 | It's an app that: 5 | - fetches chord charts and tabulatures for your favorite songs from the Internet, 6 | - saves them to a local file, 7 | - displays them in an easy-to-read format with the chords highlighted in an autoscroll view, 8 | - transposes the identified chords up or down, or you can add a capo, 9 | - provides common chord variations. 10 | 11 | 12 | [Get it on F-Droid](https://f-droid.org/packages/org.hollowbamboo.chordreader2/) 15 | 16 | ## Status 17 | This is a fork of the abandoned ChordReader app by Nolan Lawson, and Marcel Klehr respectively. 18 | > It's my first project at all. Every comment or support is welcomed. 19 | 20 | ## License 21 | [GNU GPLv3+][1] 22 | 23 | [1]: https://opensource.org/licenses/GPL-3.0 24 | 25 | ## Donation 26 | If you would like to donate, visit 27 | [paypal.me/hollowbamboo][2]. 28 | 29 | [2]: https://paypal.me/hollowbamboo 30 | 31 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de-DE/full_description.txt: -------------------------------------------------------------------------------- 1 | Chord Reader 2 ist eine weiterentwickelte Version von Chord Reader, entwickelt von Nolan Lawson. 2 | 3 | Es ist eine App, die: 4 |
    5 |
  • Akkordtabellen und Tabulaturen für Ihre Lieblingssongs aus dem Internet abruft,
  • 6 |
  • sie in einer lokalen Datei speichert,
  • 7 |
  • sie in einem einfach zu lesenden Format mit hervorgehobenen Akkorden in einer Autoscroll-Ansicht anzeigt,
  • 8 |
  • die identifizierten Akkorde nach oben oder unten transponiert, oder einen Kapodaster berücksichtigt,
  • 9 |
  • gängige Akkordvariationen bietet,
  • 10 |
  • einen Setlist-Modus bietet, um deine Songs in einer vordefinierten Reihenfolge abzuspielen.
  • 11 |
12 | 13 | Lizenz: 14 | Chord Reader 2 ist eine kostenlose Open-Source App unter GPLv3+ Lizenz. 15 | 16 | Quell Code: 17 | Der Quellcode ist hier verfügbar. 18 | Jedwede Fehler können mittels dem Issue Tracker mitgeteilt werden. 19 | 20 | Spenden: 21 | Wenn du etwas spenden möchtest, besuche paypal.me/hollowbamboo. 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/drawer_list_item.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_item_drawer.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout-large/list_item_drawer.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 13 | 14 | 19 | 20 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout-large/simple_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout-large/drawer_list_item.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/nav_header_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 20 | 21 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 15 | 16 | 25 | 26 | 30 | 31 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/helper/TransposeHelper.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.helper; 2 | 3 | import org.hollowbamboo.chordreader2.chords.Chord; 4 | import org.hollowbamboo.chordreader2.chords.ChordRoot; 5 | 6 | public class TransposeHelper { 7 | 8 | /** 9 | * Transpose a chord given what fret the capo is on, and how many half steps we're transposing beyond that. 10 | * @param chord 11 | * @param capoFret 12 | * @param transposeHalfSteps 13 | * @return 14 | */ 15 | public static Chord transposeChord(Chord chord, int capoFret, int transposeHalfSteps) { 16 | 17 | int trueTranspose = capoFret - transposeHalfSteps; 18 | 19 | Chord newChord = (Chord) chord.clone(); 20 | 21 | newChord.setRoot(transposeRoot(newChord.getRoot(), trueTranspose)); 22 | 23 | if (newChord.getOverridingRoot() != null) { 24 | newChord.setOverridingRoot(transposeRoot(newChord.getOverridingRoot(), trueTranspose)); 25 | } 26 | 27 | return newChord; 28 | 29 | } 30 | 31 | private static ChordRoot transposeRoot(ChordRoot root, int trueTranspose) { 32 | 33 | int ordinal = root.ordinal(); 34 | ordinal += trueTranspose; 35 | 36 | int numChordRoots = ChordRoot.values().length; 37 | while (ordinal >= numChordRoots) { 38 | ordinal -= numChordRoots; 39 | } 40 | while (ordinal < 0) { 41 | ordinal += numChordRoots; 42 | } 43 | 44 | return ChordRoot.values()[ordinal]; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/res/layout/simple_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_item_simple.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/enhanced_seek_bar.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 10 | 13 | 17 | 18 | 19 | 23 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/layout/drawer_n_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 10 | 14 | 15 | 21 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/test/java/org/hollowbamboo/chordreader2/StringUtilTest.kt: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2 2 | 3 | import org.hollowbamboo.chordreader2.util.StringUtil 4 | import org.junit.Assert 5 | import org.junit.Test 6 | 7 | class StringUtilTest { 8 | @Test 9 | fun split() { 10 | // Given 11 | val input = "lorem\nipsum" 12 | val delimeter = "\n" 13 | 14 | // When 15 | val actual = StringUtil.split(input, delimeter) 16 | 17 | // Then 18 | Assert.assertEquals(arrayOf("lorem", "ipsum"), actual) 19 | } 20 | 21 | @Test 22 | fun replace() { 23 | // Given 24 | val originalString = "a1a1a1a1a1" 25 | val searchString = "a" 26 | val replaceString = "b" 27 | 28 | // When 29 | val actual = StringUtil.replace(originalString, searchString, replaceString) 30 | 31 | // Then 32 | Assert.assertEquals("b1b1b1b1b1", actual) 33 | } 34 | 35 | @Test 36 | fun isAllWhitespace_true() { 37 | // Given 38 | val input = " " 39 | 40 | // When 41 | val actual = StringUtil.isAllWhitespace(input) 42 | 43 | // Then 44 | Assert.assertTrue(actual) 45 | } 46 | 47 | @Test 48 | fun isAllWhitespace_false() { 49 | // Given 50 | val input = " lorem ipsum" 51 | 52 | // When 53 | val actual = StringUtil.isAllWhitespace(input) 54 | 55 | // Then 56 | Assert.assertFalse(actual) 57 | } 58 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_draggable_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 32 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/model/DataViewModel.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.model; 2 | 3 | import androidx.lifecycle.MutableLiveData; 4 | import androidx.lifecycle.ViewModel; 5 | 6 | import java.util.ArrayList; 7 | 8 | public class DataViewModel extends ViewModel { 9 | 10 | public String mode; 11 | public ArrayList setListSongs; 12 | public boolean isSetListChanged; 13 | 14 | private MutableLiveData setListMLD = new MutableLiveData<>(); 15 | public MutableLiveData> setListSongsMLD; 16 | private final MutableLiveData deleteFileMLD = new MutableLiveData<>(); 17 | 18 | 19 | public void setSetListMLD(String setlist) { 20 | if (setListMLD == null) 21 | setListMLD = new MutableLiveData<>(); 22 | 23 | setListMLD.setValue(setlist); 24 | 25 | setListSongsMLD.setValue(setListSongs); 26 | } 27 | 28 | public MutableLiveData getSetListMLD() { 29 | return setListMLD; 30 | } 31 | 32 | public MutableLiveData> getSetListSongsMLD() { return setListSongsMLD; } 33 | 34 | public MutableLiveData getDeleteFileMLD() { return deleteFileMLD; } 35 | 36 | public void setSetListSongs(ArrayList setListSongs) { 37 | this.setListSongs = setListSongs; 38 | 39 | if (setListSongsMLD == null) 40 | setListSongsMLD = new MutableLiveData<>(); 41 | 42 | setListSongsMLD.setValue(setListSongs); 43 | } 44 | 45 | public void resetData() { 46 | setListSongs = null; 47 | setListMLD = null; 48 | setListSongsMLD = null; 49 | } 50 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/spinner_dropdown_filename.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 18 | 22 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/confirm_chords_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 21 | 22 | 27 | 28 | 29 | 30 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/simple_dropdown_item_2line.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 18 | 23 | 28 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/chords/regex/ChordInText.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.chords.regex; 2 | 3 | import org.hollowbamboo.chordreader2.chords.Chord; 4 | 5 | import java.util.Comparator; 6 | 7 | public class ChordInText { 8 | 9 | private Chord chord; 10 | private int startIndex; 11 | private int endIndex; 12 | 13 | public Chord getChord() { 14 | return chord; 15 | } 16 | 17 | 18 | public void setChord(Chord chord) { 19 | this.chord = chord; 20 | } 21 | 22 | 23 | public int getStartIndex() { 24 | return startIndex; 25 | } 26 | 27 | public int getEndIndex() { 28 | return endIndex; 29 | } 30 | 31 | 32 | public static org.hollowbamboo.chordreader2.chords.regex.ChordInText newChordInText(Chord chord, int startIndex, int endIndex) { 33 | 34 | org.hollowbamboo.chordreader2.chords.regex.ChordInText result = new org.hollowbamboo.chordreader2.chords.regex.ChordInText(); 35 | 36 | result.chord = chord; 37 | result.startIndex = startIndex; 38 | result.endIndex = endIndex; 39 | 40 | return result; 41 | } 42 | 43 | public static Comparator sortByStartIndex() { 44 | return new Comparator() { 45 | 46 | @Override 47 | public int compare(org.hollowbamboo.chordreader2.chords.regex.ChordInText object1, org.hollowbamboo.chordreader2.chords.regex.ChordInText object2) { 48 | return object1.getStartIndex() - object2.getStartIndex(); 49 | }}; 50 | } 51 | 52 | @Override 53 | public String toString() { 54 | return "ChordInText [chord=" + chord + ", endIndex=" + endIndex 55 | + ", startIndex=" + startIndex + "]"; 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/res/menu/song_view_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 14 | 21 | 22 | 29 | 30 | 36 | 37 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/chords/ChordQuality.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.chords; 2 | 3 | import java.util.*; 4 | 5 | /** 6 | * Class represeting the quality of a chord, e.g. maj/min/aug/dim. 7 | * @author nolan 8 | * 9 | */ 10 | public enum ChordQuality { 11 | 12 | Major (Arrays.asList("", "major", "maj", "M")), 13 | Minor (Arrays.asList("m", "minor", "min")), 14 | Augmented (Arrays.asList("aug","augmented","+","#5")), 15 | Diminished (Arrays.asList("dim","diminished")); 16 | 17 | private final List aliases; 18 | 19 | ChordQuality (List aliases) { 20 | this.aliases = aliases; 21 | } 22 | 23 | public List getAliases() { 24 | return aliases; 25 | } 26 | 27 | public static List getAllAliases() { 28 | List result = new ArrayList(); 29 | 30 | for (org.hollowbamboo.chordreader2.chords.ChordQuality chordQuality : values()) { 31 | result.addAll(chordQuality.aliases); 32 | } 33 | 34 | return result; 35 | } 36 | 37 | 38 | private static final Map lookupMap = new HashMap(); 39 | 40 | static { 41 | for (org.hollowbamboo.chordreader2.chords.ChordQuality value : values()) { 42 | for (String alias : value.aliases) { 43 | lookupMap.put(alias.toLowerCase(), value); 44 | } 45 | } 46 | } 47 | 48 | public static org.hollowbamboo.chordreader2.chords.ChordQuality findByAlias(String alias) { 49 | 50 | // special case for 'm' 51 | if (alias.equals("m")) { 52 | return Minor; 53 | } else if (alias.equals("M")) { 54 | return Major; 55 | } 56 | 57 | return lookupMap.get(alias.toLowerCase()); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/res/layout/checkbox_dropdown_filename.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 18 | 19 | 30 | 35 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/util/UtilLogger.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.util; 2 | 3 | import android.util.Log; 4 | 5 | import java.util.Arrays; 6 | 7 | /** 8 | * Easier way to interact with logcat. 9 | * @author nolan 10 | */ 11 | public class UtilLogger { 12 | 13 | public static final boolean DEBUG_MODE = false; 14 | 15 | private final String tag; 16 | 17 | public UtilLogger(Class clazz) { 18 | this.tag = clazz.getSimpleName(); 19 | } 20 | 21 | public void i(String format, Object... more) { 22 | if(DEBUG_MODE) { 23 | Log.i(tag, smartFormat(format,more)); 24 | } 25 | } 26 | 27 | public void e(String format, Object... more) { 28 | Log.e(tag, smartFormat(format,more)); 29 | } 30 | 31 | public void e(Exception e, String format, Object... more) { 32 | Log.e(tag, smartFormat(format,more), e); 33 | } 34 | 35 | public void d(String format, Object... more) { 36 | if(DEBUG_MODE) { 37 | for (int i = 0; i < more.length; i++) { 38 | if(more[i] instanceof int[]) { 39 | more[i] = Arrays.toString((int[])more[i]); 40 | } else if(more[i] instanceof String[]) { 41 | more[i] = Arrays.toString((String[])more[i]); 42 | } 43 | } 44 | Log.d(tag, smartFormat(format,more)); 45 | } 46 | } 47 | 48 | public void d(Exception e, String format, Object... more) { 49 | if(DEBUG_MODE) { 50 | for (int i = 0; i < more.length; i++) { 51 | if(more[i] instanceof int[]) { 52 | more[i] = Arrays.toString((int[])more[i]); 53 | } else if(more[i] instanceof String[]) { 54 | more[i] = Arrays.toString((String[])more[i]); 55 | } 56 | } 57 | Log.d(tag, smartFormat(format,more), e); 58 | } 59 | } 60 | 61 | private static String smartFormat(String format, Object... more) { 62 | return more.length > 0 ? String.format(format, more) : format; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/adapter/BasicTwoLineAdapter.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.adapter; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.ArrayAdapter; 8 | import android.widget.CheckedTextView; 9 | import android.widget.TextView; 10 | import org.hollowbamboo.chordreader2.R; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | * Simple adapter that displays two lines for each item 16 | * @author nolan 17 | * 18 | */ 19 | public class BasicTwoLineAdapter extends ArrayAdapter { 20 | 21 | private static final int RES_ID = R.layout.simple_dropdown_item_2line; 22 | 23 | private final List firstLines; 24 | private final List secondLines; 25 | private final int checked; 26 | 27 | 28 | public BasicTwoLineAdapter(Context context, List firstLines, List secondLines, int checked) { 29 | super(context, RES_ID, firstLines); 30 | 31 | this.firstLines = firstLines; 32 | this.secondLines = secondLines; 33 | this.checked = checked; 34 | 35 | } 36 | 37 | @Override 38 | public View getView(int position, View view, ViewGroup parent) { 39 | 40 | Context context = parent.getContext(); 41 | 42 | if (view == null) { 43 | LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 44 | view = inflater.inflate(RES_ID, parent, false); 45 | } 46 | 47 | CheckedTextView text1 = (CheckedTextView) view.findViewById(android.R.id.text1); 48 | TextView text2 = (TextView) view.findViewById(android.R.id.text2); 49 | 50 | text1.setText(firstLines.get(position)); 51 | text2.setText(secondLines.get(position)); 52 | 53 | text1.setChecked(position == checked); 54 | 55 | return view; 56 | } 57 | 58 | 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/chords/ChordAdded.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.chords; 2 | 3 | import java.util.*; 4 | 5 | /** 6 | * Enum for add9, add11, power chords, etc. 7 | * @author nolan 8 | * 9 | */ 10 | public enum ChordAdded { 11 | 12 | Add6 (Arrays.asList("add6")), 13 | Add9 (Arrays.asList("add9", "2")), 14 | Add11 (Arrays.asList("add11", "4")), 15 | Augmented9 (Arrays.asList("aug9","+9")), 16 | AugmentedMajor9 (Arrays.asList("augmaj9","+M9")), 17 | Major6 (Arrays.asList("6","maj6","major6", "M6")), 18 | Major6Flat5 (Arrays.asList("6b5")), 19 | SixNine (Arrays.asList("6/9","6add9","6/add9","69")), 20 | NineFlat5 (Arrays.asList("9b5")), 21 | NineSharp5 (Arrays.asList("9#5")), 22 | PowerChord (Arrays.asList("5")), // duh duh DUH, duh duh DUH-duh, duh duh DUH, duh duh ((c) Deep Purple) 23 | ; 24 | 25 | private final List aliases; 26 | 27 | ChordAdded (List aliases) { 28 | this.aliases = aliases; 29 | } 30 | 31 | public List getAliases() { 32 | return aliases; 33 | } 34 | 35 | public static List getAllAliases() { 36 | List result = new ArrayList(); 37 | 38 | for (org.hollowbamboo.chordreader2.chords.ChordAdded chordAdded : values()) { 39 | result.addAll(chordAdded.aliases); 40 | } 41 | 42 | return result; 43 | } 44 | 45 | private static final Map lookupMap = new HashMap(); 46 | 47 | static { 48 | for (org.hollowbamboo.chordreader2.chords.ChordAdded value : values()) { 49 | for (String alias : value.aliases) { 50 | lookupMap.put(alias.toLowerCase(), value); 51 | } 52 | } 53 | } 54 | 55 | public static org.hollowbamboo.chordreader2.chords.ChordAdded findByAlias(String alias) { 56 | return lookupMap.get(alias.toLowerCase()); 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /app/src/test/java/org/hollowbamboo/chordreader2/MetadataExtractionHelperTest.kt: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2 2 | 3 | import android.net.Uri 4 | import org.hollowbamboo.chordreader2.helper.MetadataExtractionHelper 5 | import org.junit.Assert 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | import org.robolectric.RobolectricTestRunner 9 | 10 | @RunWith(RobolectricTestRunner::class) 11 | public class MetadataExtractionHelperTest { 12 | @Test 13 | fun extractSuggestedFilename_when_notUltimateGuitarHost_should_returnNull() { 14 | // Given 15 | val url = "https://example.com" 16 | 17 | // When 18 | val actual = MetadataExtractionHelper().extractSuggestedFilename(url, "") 19 | 20 | // Then 21 | Assert.assertNull(actual) 22 | } 23 | 24 | @Test 25 | fun extractSuggestedFilename_when_ultimateGuitarHost_butNoOGTitleMetaTag_should_returnNull() { 26 | // Given 27 | val url = "https://${MetadataExtractionHelper.ULTIMATE_GUITAR_HOST}" 28 | val html = "" 29 | 30 | // When 31 | val actual = MetadataExtractionHelper().extractSuggestedFilename(url, html) 32 | 33 | // Then 34 | Assert.assertNull(actual) 35 | } 36 | 37 | @Test 38 | fun extractSuggestedFilename_when_ultimateGuitarHost_andOGTitleMetaTagPresent_should_returnTheContent() { 39 | // Given 40 | val url = "https://${MetadataExtractionHelper.ULTIMATE_GUITAR_HOST}" 41 | val metaTagContent = "Lorem ipsum dolor sit" 42 | val html = """ 43 | 44 | 45 | 46 | """.trimIndent() 47 | 48 | // When 49 | val actual = MetadataExtractionHelper().extractSuggestedFilename(url, html) 50 | 51 | // Then 52 | Assert.assertEquals(metaTagContent, actual) 53 | } 54 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/popup_chord.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | 17 | 18 | 25 | 26 | 34 | 35 | 42 | 43 | 44 | 49 | 50 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /app/src/main/res/raw/about_body_en.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | Version %s 6 | 7 |
8 | 9 |
10 | 11 | 12 |

Chord Reader 2 is a free and open-source app under GPLv3+ license. See the source 13 | here. 16 | 17 |

Any bugs can be reported at the 18 | Issue Tracker. 21 | 22 |

If you would like to donate, visit 23 | paypal.me/hollowbamboo. 26 | 27 |

The changelog is provided 28 | here. 31 | 32 |


33 | 34 |
35 | Credits 36 |
37 | 38 |

39 | ChordReader 2 bases on ChordReader, developed by Nolan Lawson. 42 | 43 |

Enhanced by 44 | AndInTheClouds 47 |
48 | 49 | with contributions by: 50 | Marcel Klehr, 53 | wtimme, 56 | HDavo, 59 | shanemd, 62 | Ezelty. 65 | 66 |


67 | 68 |

69 | 70 | -------------------------------------------------------------------------------- /app/src/main/res/raw/about_body_es.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | 5 | Versión %s 6 | 7 |
8 | 9 |
10 | 11 | 12 |

Chord Reader 2 es una aplicación gratuita y open-source sujeta a la licencia GPLv3+. Ver el código fuente 13 | aquí. 16 | 17 |

Los bugs pueden notificarse en el 18 | Issue Tracker. 21 | 22 |

Si deseas hacer una donación, visita 23 | paypal.me/hollowbamboo. 26 | 27 |

El ChangeLog está disponible 28 | aquí. 31 | 32 |


33 | 34 |
35 | Créditos 36 |
37 | 38 |

39 | ChordReader 2 está basada en ChordReader, desarrollada por Nolan Lawson. 42 | 43 |

Mejorada por 44 | AndInTheClouds 47 | 48 |
49 | 50 | con contribuciones de: 51 | Marcel Klehr, 54 | wtimme, 57 | HDavo, 60 | shanemd, 63 | Ezelty 66 | . 67 | 68 |


69 | 70 |

71 | 72 | -------------------------------------------------------------------------------- /app/src/main/res/raw/about_body_de.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 |

4 | 5 | Version %s 6 | 7 |
8 | 9 |
10 | 11 | 12 |

Chord Reader 2 ist eine kostenlose Open-Source App unter GPLv3+ Lizens. Den Quellcode findest du 13 | hier. 16 | 17 |

Jegliche Fehler können beim 18 | Issue Tracker 21 | gemeldet werden. 22 | 23 |

Falls du spenden möchtest, besuche 24 | paypal.me/hollowbamboo. 27 | 28 |

Die Changelogs findest du 29 | hier. 32 | 33 |


34 | 35 |
36 | Danksagung 37 |
38 | 39 |

40 | ChordReader 2 basiert auf ChordReader, entwickelt von Nolan Lawson. 43 | 44 |

Weiterentwickelt von 45 | AndInTheClouds 48 |
49 | 50 | mit Unterstützung von: 51 | Marcel Klehr, 54 | wtimme, 57 | HDavo, 60 | shanemd, 63 | Ezelty 66 | . 67 | 68 |


69 | 70 |

71 | 72 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/util/StringUtil.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.util; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 8 | * @author nolan 9 | */ 10 | public class StringUtil { 11 | 12 | /** 13 | * same as the String.split(), except it doesn't use regexes, so it's faster. 14 | * 15 | * @param str - the string to split up 16 | * @param delimiter the delimiter 17 | * @return the split string 18 | */ 19 | public static String[] split(String str, String delimiter) { 20 | List result = new ArrayList(); 21 | int lastIndex = 0; 22 | int index = str.indexOf(delimiter); 23 | while (index != -1) { 24 | result.add(str.substring(lastIndex, index)); 25 | lastIndex = index + delimiter.length(); 26 | index = str.indexOf(delimiter, index + delimiter.length()); 27 | } 28 | result.add(str.substring(lastIndex, str.length())); 29 | 30 | return result.toArray(new String[result.size()]); 31 | } 32 | 33 | /* 34 | * Replace all occurances of the searchString in the originalString with the replaceString. Faster than the 35 | * String.replace() method. Does not use regexes. 36 | *

37 | * If your searchString is empty, this will spin forever. 38 | * 39 | * 40 | * @param originalString 41 | * @param searchString 42 | * @param replaceString 43 | * @return 44 | */ 45 | public static String replace(String originalString, String searchString, String replaceString) { 46 | StringBuilder sb = new StringBuilder(originalString); 47 | int index = sb.indexOf(searchString); 48 | while (index != -1) { 49 | sb.replace(index, index + searchString.length(), replaceString); 50 | index += replaceString.length(); 51 | index = sb.indexOf(searchString, index); 52 | } 53 | return sb.toString(); 54 | } 55 | 56 | 57 | public static boolean isAllWhitespace(CharSequence str) { 58 | for (int i = 0; i < str.length(); i++) { 59 | if(!Character.isWhitespace(str.charAt(i))) { 60 | return false; 61 | } 62 | } 63 | return true; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 13 | 14 | 15 | 16 | 22 | 23 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 44 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | id 'androidx.navigation.safeargs' 4 | id 'org.jetbrains.kotlin.android' 5 | } 6 | 7 | sourceCompatibility = 1.11 // java version 11 8 | 9 | android { 10 | 11 | compileSdk 34 12 | namespace 'org.hollowbamboo.chordreader2' 13 | 14 | defaultConfig { 15 | applicationId "org.hollowbamboo.chordreader2" 16 | minSdkVersion 19 17 | targetSdkVersion 34 18 | multiDexEnabled true 19 | 20 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 21 | } 22 | 23 | buildTypes { 24 | release { 25 | signingConfig signingConfigs.debug 26 | 27 | // Enables code shrinking, obfuscation, and optimization 28 | minifyEnabled false 29 | 30 | } 31 | } 32 | lint { 33 | abortOnError false 34 | } 35 | kotlinOptions { 36 | jvmTarget = '1.8' 37 | } 38 | buildFeatures { 39 | viewBinding true 40 | dataBinding = true 41 | } 42 | composeOptions { 43 | kotlinCompilerExtensionVersion '1.3.2' 44 | } 45 | testOptions { 46 | unitTests { 47 | includeAndroidResources = true 48 | } 49 | } 50 | } 51 | 52 | dependencies { 53 | implementation "androidx.multidex:multidex:2.0.1" //due to minSdk lower than 20 = exceed 65,536 methods, which is max limit of apk's dex file 54 | implementation 'androidx.appcompat:appcompat:1.6.1' //latest version compatible with minSDK 19 55 | implementation 'androidx.constraintlayout:constraintlayout:2.1.4' 56 | implementation 'androidx.recyclerview:recyclerview:1.3.2' 57 | implementation 'com.google.android.material:material:1.12.0' 58 | implementation 'androidx.navigation:navigation-ui:2.7.7' 59 | implementation 'androidx.navigation:navigation-fragment:2.7.7' 60 | implementation 'androidx.preference:preference:1.2.1' 61 | implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.8.4' 62 | implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4' 63 | testImplementation 'junit:junit:4.13.2' 64 | testImplementation 'org.robolectric:robolectric:4.9' 65 | testImplementation 'androidx.test.ext:junit:1.2.1' 66 | androidTestImplementation 'androidx.test.ext:junit:1.2.1' 67 | } 68 | 69 | 70 | -------------------------------------------------------------------------------- /app/src/main/res/layout/transpose_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | 19 | 20 | 25 | 26 | 31 | 32 | 33 | 34 | 41 | 42 | 49 | 50 | 53 | 54 | 60 | 61 | 64 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/chords/ChordSuspended.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.chords; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.Collections; 6 | import java.util.HashMap; 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | /** 11 | * Class to indicate suspended fourth or suspended 2nd 12 | * @author nolan 13 | * 14 | */ 15 | public enum ChordSuspended { 16 | 17 | Sus4 (Arrays.asList("sus4", "suspended", "sus")), 18 | Sus2 (Arrays.asList("sus2", "suspended2")), 19 | SusMajor4 (Arrays.asList("susM4", "susmaj4")), 20 | SusMajor2 (Arrays.asList("susM2", "susmaj2")), 21 | Sus2Sus4 (Collections.singletonList("sus2sus4")), 22 | Sus2Flat5 (Arrays.asList("sus2b5", "2-5", "sus2-5")), 23 | Sus2Sharp5 (Arrays.asList("sus2#5", "sus2(#5)")), 24 | Sus4Seventh (Collections.singletonList("7sus4")), 25 | Sus4Sharp5 (Arrays.asList("sus4#5","sus4(#5)")), 26 | 27 | 28 | SevenSus2 (Arrays.asList("7sus2")), 29 | MajorSevenSus2 (Arrays.asList("M7sus2", "maj7sus2")), 30 | SevenSus4 (Arrays.asList("7sus4")), 31 | MajorSevenSus4 (Arrays.asList("M7sus4", "maj7sus4")), 32 | SevenSus2Sharp5 (Arrays.asList("7sus2#5","7sus2(#5)")), 33 | SevenSus4Sharp5 (Arrays.asList("7sus4#5", "7sus4(#5)")), 34 | MajorSevenSus4Sharp5 (Arrays.asList("M7sus4#5", "M7sus4(#5)","maj7sus4#5", "maj7sus4(#5)")), 35 | SevenSus2Sus4 (Arrays.asList("7sus2sus4")), 36 | MajorSevenSus2Sus4 (Arrays.asList("M7sus2sus4", "maj7sus2sus4")), 37 | 38 | ; 39 | 40 | private final List aliases; 41 | 42 | ChordSuspended (List aliases) { 43 | this.aliases = aliases; 44 | } 45 | 46 | public List getAliases() { 47 | return aliases; 48 | } 49 | 50 | public static List getAllAliases() { 51 | List result = new ArrayList(); 52 | 53 | for (ChordSuspended chordSuspended : values()) { 54 | result.addAll(chordSuspended.aliases); 55 | } 56 | 57 | return result; 58 | } 59 | 60 | 61 | private static final Map lookupMap = new HashMap(); 62 | 63 | static { 64 | for (ChordSuspended value : values()) { 65 | for (String alias : value.aliases) { 66 | lookupMap.put(alias.toLowerCase(), value); 67 | } 68 | } 69 | } 70 | 71 | public static ChordSuspended findByAlias(String alias) { 72 | return lookupMap.get(alias.toLowerCase()); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/res/menu/list_view_menu.xml: -------------------------------------------------------------------------------- 1 | 2 |

5 | 6 | 14 | 15 | 23 | 24 | 32 | 33 | 40 | 41 | 48 | 49 | 56 | 57 | 64 | 65 | -------------------------------------------------------------------------------- /app/src/main/res/layout/list_item_setlist_songs.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 19 | 20 | 29 | 30 | 38 | 39 | 47 | 48 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/data/ColorScheme.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.data; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import android.content.Context; 7 | 8 | import org.hollowbamboo.chordreader2.R; 9 | 10 | 11 | public enum ColorScheme { 12 | 13 | Dark (R.string.pref_scheme_dark, R.color.scheme_dark_background, 14 | R.color.scheme_dark_foreground, R.color.scheme_dark_link 15 | ), 16 | Light (R.string.pref_scheme_light, R.color.scheme_light_background, 17 | R.color.scheme_light_foreground, R.color.scheme_light_link 18 | ), 19 | Android (R.string.pref_scheme_android, R.color.scheme_android_background, 20 | R.color.scheme_android_foreground, R.color.scheme_android_link 21 | ), 22 | ; 23 | 24 | private final int nameResource; 25 | private final int backgroundColorResource; 26 | private final int foregroundColorResource; 27 | private final int linkColorResource; 28 | 29 | private int backgroundColor = -1; 30 | private int foregroundColor = -1; 31 | private int linkColor = -1; 32 | 33 | private static final Map preferenceNameToColorScheme = new HashMap(); 34 | 35 | ColorScheme(int nameResource, int backgroundColorResource, int foregroundColorResource, 36 | int linkColorResource) { 37 | this.nameResource = nameResource; 38 | this.backgroundColorResource = backgroundColorResource; 39 | this.foregroundColorResource = foregroundColorResource; 40 | this.linkColorResource = linkColorResource; 41 | 42 | } 43 | 44 | public int getNameResource() { 45 | return nameResource; 46 | } 47 | 48 | public int getBackgroundColor(Context context) { 49 | if(backgroundColor == -1) { 50 | backgroundColor = context.getResources().getColor(backgroundColorResource); 51 | } 52 | return backgroundColor; 53 | } 54 | 55 | public int getForegroundColor(Context context) { 56 | if(foregroundColor == -1) { 57 | foregroundColor = context.getResources().getColor(foregroundColorResource); 58 | } 59 | return foregroundColor; 60 | } 61 | 62 | 63 | public int getLinkColor(Context context) { 64 | if(linkColor == -1) { 65 | linkColor = context.getResources().getColor(linkColorResource); 66 | } 67 | return linkColor; 68 | } 69 | 70 | public static ColorScheme findByPreferenceName(String name, Context context) { 71 | if(preferenceNameToColorScheme.isEmpty()) { 72 | // initialize map 73 | for (ColorScheme colorScheme : values()) { 74 | preferenceNameToColorScheme.put(context.getText(colorScheme.getNameResource()).toString(), colorScheme); 75 | } 76 | } 77 | return preferenceNameToColorScheme.get(name); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/src/main/java/org/hollowbamboo/chordreader2/util/ItemMoveCallback.java: -------------------------------------------------------------------------------- 1 | package org.hollowbamboo.chordreader2.util; 2 | 3 | import androidx.annotation.NonNull; 4 | import androidx.recyclerview.widget.ItemTouchHelper; 5 | import androidx.recyclerview.widget.RecyclerView; 6 | 7 | import org.hollowbamboo.chordreader2.adapter.RecyclerViewAdapter; 8 | 9 | public class ItemMoveCallback extends ItemTouchHelper.Callback { 10 | 11 | private final ItemTouchHelperContract mAdapter; 12 | 13 | public ItemMoveCallback(ItemTouchHelperContract adapter) { 14 | mAdapter = adapter; 15 | } 16 | 17 | @Override 18 | public boolean isLongPressDragEnabled() { 19 | return false; 20 | } 21 | 22 | @Override 23 | public boolean isItemViewSwipeEnabled() { 24 | return false; 25 | } 26 | 27 | @Override 28 | public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { 29 | } 30 | 31 | @Override 32 | public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 33 | int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; 34 | return makeMovementFlags(dragFlags, 0); 35 | } 36 | 37 | @Override 38 | public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, 39 | RecyclerView.ViewHolder target) { 40 | mAdapter.onRowMoved(viewHolder.getBindingAdapterPosition(), target.getBindingAdapterPosition()); 41 | return true; 42 | } 43 | 44 | @Override 45 | public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 46 | 47 | if(actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 48 | if(viewHolder instanceof RecyclerViewAdapter.ViewHolder) { 49 | RecyclerViewAdapter.ViewHolder myViewHolder = (RecyclerViewAdapter.ViewHolder) viewHolder; 50 | mAdapter.onRowSelected(myViewHolder); 51 | } 52 | } 53 | 54 | super.onSelectedChanged(viewHolder, actionState); 55 | } 56 | 57 | @Override 58 | public void clearView(RecyclerView recyclerView, 59 | RecyclerView.ViewHolder viewHolder) { 60 | super.clearView(recyclerView, viewHolder); 61 | 62 | if(viewHolder instanceof RecyclerViewAdapter.ViewHolder) { 63 | RecyclerViewAdapter.ViewHolder myViewHolder = (RecyclerViewAdapter.ViewHolder) viewHolder; 64 | mAdapter.onRowClear(myViewHolder); 65 | } 66 | } 67 | 68 | public interface ItemTouchHelperContract { 69 | void onRowMoved(int fromPosition, int toPosition); 70 | 71 | void onRowSelected(RecyclerViewAdapter.ViewHolder myViewHolder); 72 | 73 | void onRowClear(RecyclerViewAdapter.ViewHolder myViewHolder); 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/res/layout/about.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 17 | 18 | 28 | 29 | 36 | 37 | 45 | 46 | 47 | 56 | 57 | 58 | 59 | 64 | 65 | 70 | 71 | 77 | 78 |