├── 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 | [ ](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 |
5 |
6 |
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 |
84 |
85 |
86 |
87 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_start.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
12 |
19 |
20 |
29 |
30 |
41 |
42 |
54 |
55 |
67 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/app/src/main/res/layout-large/fragment_start.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
20 |
21 |
27 |
28 |
40 |
41 |
54 |
55 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34 |
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37 |
38 | @rem Find java.exe
39 | if defined JAVA_HOME goto findJavaFromJavaHome
40 |
41 | set JAVA_EXE=java.exe
42 | %JAVA_EXE% -version >NUL 2>&1
43 | if "%ERRORLEVEL%" == "0" goto execute
44 |
45 | echo.
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47 | echo.
48 | echo Please set the JAVA_HOME variable in your environment to match the
49 | echo location of your Java installation.
50 |
51 | goto fail
52 |
53 | :findJavaFromJavaHome
54 | set JAVA_HOME=%JAVA_HOME:"=%
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56 |
57 | if exist "%JAVA_EXE%" goto execute
58 |
59 | echo.
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61 | echo.
62 | echo Please set the JAVA_HOME variable in your environment to match the
63 | echo location of your Java installation.
64 |
65 | goto fail
66 |
67 | :execute
68 | @rem Setup the command line
69 |
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71 |
72 |
73 | @rem Execute Gradle
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
13 |
14 |
15 |
16 |
17 |
18 |
23 |
24 |
29 |
30 |
37 |
38 |
44 |
45 |
46 |
47 |
52 |
53 |
60 |
61 |
68 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/app/src/main/java/org/hollowbamboo/chordreader2/adapter/ChordPagerAdapter.java:
--------------------------------------------------------------------------------
1 | package org.hollowbamboo.chordreader2.adapter;
2 |
3 | import android.view.View;
4 | import android.view.ViewGroup;
5 |
6 | import androidx.annotation.NonNull;
7 | import androidx.viewpager.widget.PagerAdapter;
8 |
9 | import java.util.ArrayList;
10 |
11 | public class ChordPagerAdapter extends PagerAdapter {
12 |
13 | // This holds all the currently displayable views, in order from left to right.
14 | private final ArrayList views = new ArrayList();
15 |
16 | //-----------------------------------------------------------------------------
17 | // Used by ViewPager. "Object" represents the page; tell the ViewPager where the
18 | // page should be displayed, from left-to-right. If the page no longer exists,
19 | // return POSITION_NONE.
20 | @Override
21 | public int getItemPosition (Object object)
22 | {
23 | int index = views.indexOf (object);
24 | if(index == -1)
25 | return POSITION_NONE;
26 | else
27 | return index;
28 | }
29 |
30 | //-----------------------------------------------------------------------------
31 | // Used by ViewPager. Called when ViewPager needs a page to display; it is our job
32 | // to add the page to the container, which is normally the ViewPager itself. Since
33 | // all our pages are persistent, we simply retrieve it from our "views" ArrayList.
34 | @NonNull
35 | @Override
36 | public Object instantiateItem (ViewGroup container, int position)
37 | {
38 | View v = views.get (position);
39 | container.addView (v);
40 | return v;
41 | }
42 |
43 | //-----------------------------------------------------------------------------
44 | // Used by ViewPager. Called when ViewPager no longer needs a page to display; it
45 | // is our job to remove the page from the container, which is normally the
46 | // ViewPager itself. Since all our pages are persistent, we do nothing to the
47 | // contents of our "views" ArrayList.
48 | @Override
49 | public void destroyItem (ViewGroup container, int position, Object object)
50 | {
51 | container.removeView (views.get (position));
52 | }
53 |
54 | //-----------------------------------------------------------------------------
55 | // Used by ViewPager; can be used by app as well.
56 | // Returns the total number of pages that the ViewPage can display. This must
57 | // never be 0.
58 | @Override
59 | public int getCount ()
60 | {
61 | return views.size();
62 | }
63 |
64 | //-----------------------------------------------------------------------------
65 | // Used by ViewPager.
66 | @Override
67 | public boolean isViewFromObject (View view, Object object)
68 | {
69 | return view == object;
70 | }
71 |
72 | //-----------------------------------------------------------------------------
73 | // Add "view" to right end of "views".
74 | // The app should call this to add pages; not used by ViewPager.
75 | public void addView (View v)
76 | {
77 | addView(v, views.size());
78 | }
79 |
80 | //-----------------------------------------------------------------------------
81 | // Add "view" at "position" to "views".
82 | // Returns position of new view.
83 | // The app should call this to add pages; not used by ViewPager.
84 | public int addView (View v, int position)
85 | {
86 | views.add (position, v);
87 | return position;
88 | }
89 |
90 | public View getView (int position)
91 | {
92 | return views.get (position);
93 | }
94 |
95 | }
96 |
--------------------------------------------------------------------------------
/app/src/main/java/org/hollowbamboo/chordreader2/ui/HelpFragment.java:
--------------------------------------------------------------------------------
1 | package org.hollowbamboo.chordreader2.ui;
2 |
3 | /*
4 | Chord Reader 2 - fetch and display chords for your favorite songs from the Internet
5 | Copyright (C) 2021 AndInTheClouds
6 |
7 | This program is free software: you can redistribute it and/or modify it under the terms
8 | of the GNU General Public License as published by the Free Software Foundation, either
9 | version 3 of the License, or any later version.
10 |
11 | This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12 | without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 | See the GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License along with this program.
16 | If not, see .
17 |
18 | */
19 |
20 | import android.os.Bundle;
21 | import android.text.Html;
22 | import android.text.Layout;
23 | import android.view.LayoutInflater;
24 | import android.view.View;
25 | import android.view.ViewGroup;
26 | import android.widget.ScrollView;
27 | import android.widget.TextView;
28 |
29 | import androidx.annotation.NonNull;
30 | import androidx.fragment.app.Fragment;
31 |
32 | import org.hollowbamboo.chordreader2.R;
33 | import org.hollowbamboo.chordreader2.databinding.FragmentHelpBinding;
34 |
35 |
36 | public class HelpFragment extends Fragment {
37 |
38 | ScrollView scrollView;
39 | TextView textView;
40 |
41 | public HelpFragment() {
42 | // Required empty public constructor
43 | }
44 |
45 | @Override
46 | public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
47 | Bundle savedInstanceState) {
48 | org.hollowbamboo.chordreader2.databinding.FragmentHelpBinding binding = FragmentHelpBinding.inflate(inflater, container, false);
49 | View root = binding.getRoot();
50 |
51 | textView = binding.helpPageIntro;
52 | scrollView = binding.scrollView;
53 |
54 | String sectionID = HelpFragmentArgs.fromBundle(getArguments()).getSectionID();
55 |
56 | if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N)
57 | textView.setText(Html.fromHtml(getString(R.string.help_page),Html.FROM_HTML_MODE_LEGACY));
58 | else
59 | textView.setText (Html.fromHtml (getString (R.string.help_page)));
60 |
61 | scrollToSection(sectionID);
62 |
63 | return root;
64 | }
65 |
66 | private void scrollToSection(String sectionID) {
67 |
68 | textView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
69 | @Override
70 | public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
71 | int lineNo = 0;
72 | int start = 0;
73 | int end;
74 |
75 | Layout layout = textView.getLayout();
76 | CharSequence text = textView.getText();
77 |
78 | if (!sectionID.isEmpty()) {
79 | for (int i = 0; i < textView.getLineCount(); i++) {
80 | end = layout.getLineEnd(i);
81 | String slice = text.subSequence(start, end).toString();
82 | if (slice.contains(sectionID)) {
83 | lineNo = i;
84 | break;
85 | }
86 | start = end;
87 | }
88 | }
89 |
90 | int y = layout.getLineTop(lineNo);
91 | scrollView.scrollTo(0, y);
92 | }
93 | });
94 |
95 |
96 | }
97 |
98 | }
99 |
--------------------------------------------------------------------------------
/app/src/main/java/org/hollowbamboo/chordreader2/chords/regex/ChordRegexes.java:
--------------------------------------------------------------------------------
1 | package org.hollowbamboo.chordreader2.chords.regex;
2 |
3 | import android.text.TextUtils;
4 | import org.hollowbamboo.chordreader2.chords.*;
5 | import org.hollowbamboo.chordreader2.util.ListUtil;
6 |
7 | import java.util.*;
8 | import java.util.regex.Pattern;
9 |
10 | public class ChordRegexes {
11 |
12 | private static final Map chordRegexes = initializeChordRegexes();
13 |
14 | public static Pattern getChordPattern(NoteNaming noteNaming) {
15 | return chordRegexes.get(noteNaming).getPattern();
16 | }
17 |
18 | private static Map initializeChordRegexes() {
19 | Map map = new HashMap();
20 | for (NoteNaming noteNaming : NoteNaming.values()) {
21 | map.put(noteNaming, initializeChordRegex(noteNaming));
22 | }
23 | return map;
24 | }
25 |
26 | private static ChordRegex initializeChordRegex(NoteNaming noteNaming) {
27 | ChordRegex chordRegex = new ChordRegex();
28 |
29 | String regexString = createRegexString(noteNaming);
30 | String regexStringWithParens = createRegexStringWithParens(regexString);
31 |
32 | chordRegex.setPattern(Pattern.compile(regexString));
33 | chordRegex.setPatternWithParens(Pattern.compile(regexStringWithParens));
34 |
35 | return chordRegex;
36 | }
37 |
38 | public static Pattern getChordWithParensPattern(NoteNaming noteNaming) {
39 | return chordRegexes.get(noteNaming).getPatternWithParens();
40 | }
41 |
42 | private static String optional(String pattern) {
43 | return "(" + pattern + "?)";
44 | }
45 |
46 | private static String greedyDisjunction(List aliases) {
47 | return greedyDisjunction(aliases, false);
48 | }
49 |
50 | private static String createRegexString(NoteNaming noteNaming) {
51 |
52 | return greedyDisjunction(noteNaming.getAllNames(), true) + // root note
53 | optional(greedyDisjunction(ListUtil.concatenate(
54 | ChordQuality.getAllAliases(),
55 | ChordExtended.getAllAliases()))) + // quality OR seventh
56 | optional(greedyDisjunction(ChordAdded.getAllAliases())) + // add
57 | optional(greedyDisjunction(ChordSuspended.getAllAliases())) + // sus
58 | optional("(?:/" + greedyDisjunction(noteNaming.getAllNames()) + ")") + // overridden root note ("over")
59 | "";
60 | }
61 |
62 | private static String createRegexStringWithParens(String regexString) {
63 | return "[\\(\\[]" + regexString + "[\\)\\]]";
64 | }
65 |
66 | /**
67 | * Take an array of strings and make a greedy disjunction regex pattern out of it,
68 | * with the longest strings first, e.g. ["sus4","sus","sus2"] -->
69 | *
70 | * (sus4|sus2|sus)
71 | * @return
72 | */
73 | private static String greedyDisjunction(List aliases, boolean matchingGroup) {
74 |
75 | aliases = new ArrayList(aliases); // copy
76 |
77 | // sort by longest string first
78 | Collections.sort(aliases, new Comparator(){
79 |
80 | @Override
81 | public int compare(Object o1, Object o2) {
82 | return ((String)o2).length() - ((String)o1).length();
83 | }
84 |
85 |
86 | });
87 |
88 | StringBuilder stringBuilder = new StringBuilder("(");
89 |
90 | if (!matchingGroup) {
91 | stringBuilder.append("?:"); // non-matching group
92 | }
93 |
94 |
95 | for (String alias : aliases) {
96 |
97 | if (TextUtils.isEmpty(alias)) {
98 | continue; // e.g. the "major" quality can be expressed as an empty string, so skip in the regex
99 | }
100 |
101 | stringBuilder.append(Pattern.quote(alias)).append("|");
102 | }
103 |
104 | // get rid of final dangling pipe |
105 | return stringBuilder.substring(0,stringBuilder.length() - 1) + ")";
106 |
107 | }
108 |
109 | }
110 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_list.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
12 |
13 |
29 |
30 |
41 |
42 |
53 |
54 |
62 |
63 |
72 |
73 |
82 |
83 |
--------------------------------------------------------------------------------
/app/src/main/res/values/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - @string/pref_scheme_system
5 | - @string/pref_scheme_dark
6 | - @string/pref_scheme_light
7 | - @string/pref_scheme_android
8 |
9 |
10 |
11 | - @string/pref_note_naming_value_english
12 | - @string/pref_note_naming_value_english_sharps
13 | - @string/pref_note_naming_value_northern
14 | - @string/pref_note_naming_value_southern
15 |
16 |
17 |
18 | - @string/pref_note_naming_english
19 | - @string/pref_note_naming_english_sharps
20 | - @string/pref_note_naming_northern
21 | - @string/pref_note_naming_southern
22 |
23 |
24 |
25 | - @string/pref_note_naming_explanation_english
26 | - @string/pref_note_naming_explanation_english_sharps
27 | - @string/pref_note_naming_explanation_northern
28 | - @string/pref_note_naming_explanation_southern
29 |
30 |
31 |
32 | - Guitar
33 | - Ukulele
34 |
35 |
36 |
37 | - @string/guitar
38 | - @string/ukulele
39 |
40 |
41 |
42 | - right
43 | - left
44 |
45 |
46 |
47 | - @string/right_handed
48 | - @string/left_handed
49 |
50 |
51 |
52 | - x
53 | - 0
54 | - 1
55 | - 2
56 | - 3
57 | - 4
58 | - 5
59 | - 6
60 | - 7
61 | - 8
62 | - 9
63 | - 10
64 | - 11
65 | - 12
66 | - 13
67 | - 14
68 | - 15
69 | - 16
70 | - 17
71 | - 18
72 | - 19
73 | - 20
74 | - 21
75 | - 22
76 | - 23
77 | - 24
78 | - 25
79 |
80 |
81 |
82 | - Web Search
83 | - Songs
84 | - Setlists
85 | - Settings
86 | - About
87 |
88 |
89 |
90 | - 1
91 | - 2
92 | - 3
93 | - 4
94 | - 5
95 | - 6
96 | - 7
97 | - 8
98 | - 9
99 | - 10
100 | - 11
101 | - 12
102 | - 13
103 | - 14
104 | - 15
105 | - 16
106 | - 17
107 | - 18
108 | - 19
109 | - 20
110 | - 21
111 | - 22
112 | - 23
113 | - 24
114 | - 25
115 | - 26
116 | - 27
117 | - 28
118 | - 29
119 | - 30
120 | - 31
121 | - 32
122 | - 33
123 | - 34
124 | - 35
125 | - 36
126 | - 37
127 | - 38
128 | - 39
129 | - 40
130 | - 41
131 | - 42
132 | - 43
133 | - 44
134 | - 45
135 | - 46
136 | - 47
137 | - 48
138 | - 49
139 | - 50
140 | - 51
141 | - 52
142 | - 53
143 | - 54
144 | - 55
145 | - 56
146 | - 57
147 | - 58
148 | - 59
149 | - 60
150 |
151 |
152 |
153 |
--------------------------------------------------------------------------------
/fastlane/metadata/org.hollowbamboo.chordreader2.yml:
--------------------------------------------------------------------------------
1 | Categories:
2 | - Multimedia
3 | - Science & Education
4 | License: GPL-3.0-or-later
5 | AuthorName: AndInTheClouds
6 | SourceCode: https://github.com/AndInTheClouds/chordreader2
7 | IssueTracker: https://github.com/AndInTheClouds/chordreader2/issues
8 |
9 | AutoName: ChordReader2
10 |
11 | RepoType: git
12 | Repo: https://github.com/AndInTheClouds/chordreader2
13 |
14 | Builds:
15 | - versionName: 2.4.1
16 | versionCode: 14
17 | commit: v2.4.1
18 | subdir: app
19 | sudo:
20 | - apt-get update || apt-get update
21 | - apt-get install -y openjdk-17-jdk-headless
22 | - update-alternatives --auto java
23 | gradle:
24 | - yes
25 |
26 | - versionName: 2.4.0
27 | versionCode: 13
28 | commit: v2.4.0
29 | subdir: app
30 | sudo:
31 | - apt-get update || apt-get update
32 | - apt-get install -y openjdk-17-jdk-headless
33 | - update-alternatives --auto java
34 | gradle:
35 | - yes
36 |
37 | - versionName: 2.3.2
38 | versionCode: 12
39 | commit: v2.3.2
40 | subdir: app
41 | sudo:
42 | - apt-get update || apt-get update
43 | - apt-get install -y openjdk-17-jdk-headless
44 | - update-alternatives --auto java
45 | gradle:
46 | - yes
47 |
48 | - versionName: 2.3.1
49 | versionCode: 11
50 | commit: v2.3.1
51 | subdir: app
52 | sudo:
53 | - apt-get update || apt-get update
54 | - apt-get install -y openjdk-17-jdk-headless
55 | - update-alternatives --auto java
56 | gradle:
57 | - yes
58 |
59 | - versionName: 2.3.0
60 | versionCode: 10
61 | commit: v2.3.0
62 | subdir: app
63 | sudo:
64 | - apt-get update || apt-get update
65 | - apt-get install -y openjdk-17-jdk-headless
66 | - update-alternatives --auto java
67 | gradle:
68 | - yes
69 |
70 | - versionName: 2.2.0
71 | versionCode: 9
72 | commit: v2.2.0
73 | subdir: app
74 | sudo:
75 | - apt-get update || apt-get update
76 | - apt-get install -y openjdk-17-jdk-headless
77 | - update-alternatives --auto java
78 | gradle:
79 | - yes
80 |
81 | - versionName: 2.1.6
82 | versionCode: 8
83 | commit: v2.1.6
84 | subdir: app
85 | sudo:
86 | - apt-get update || apt-get update
87 | - apt-get install -y openjdk-17-jdk-headless
88 | - update-alternatives --auto java
89 | gradle:
90 | - yes
91 |
92 | - versionName: 2.1.5
93 | versionCode: 7
94 | commit: v2.1.5
95 | subdir: app
96 | sudo:
97 | - apt-get update || apt-get update
98 | - apt-get install -y openjdk-17-jdk-headless
99 | - update-alternatives --auto java
100 | gradle:
101 | - yes
102 |
103 | - versionName: 2.1.4
104 | versionCode: 6
105 | commit: v2.1.4
106 | subdir: app
107 | sudo:
108 | - apt-get update || apt-get update
109 | - apt-get install -y openjdk-17-jdk-headless
110 | - update-alternatives --auto java
111 | gradle:
112 | - yes
113 |
114 | - versionName: 2.1.3
115 | versionCode: 5
116 | commit: v2.1.3
117 | subdir: app
118 | sudo:
119 | - apt-get update || apt-get update
120 | - apt-get install -y openjdk-11-jdk-headless
121 | - update-alternatives --auto java
122 | gradle:
123 | - yes
124 |
125 | - versionName: 2.1.2
126 | versionCode: 4
127 | commit: v2.1.2
128 | subdir: app
129 | sudo:
130 | - apt-get update || apt-get update
131 | - apt-get install -y openjdk-11-jdk-headless
132 | - update-alternatives --auto java
133 | gradle:
134 | - yes
135 |
136 | - versionName: 2.1.1
137 | versionCode: 3
138 | commit: v2.1.1
139 | subdir: app
140 | sudo:
141 | - apt-get update || apt-get update
142 | - apt-get install -y openjdk-11-jdk-headless
143 | - update-alternatives --auto java
144 | gradle:
145 | - yes
146 |
147 | - versionName: 2.1.0
148 | versionCode: 2
149 | commit: v2.1.0
150 | subdir: app
151 | sudo:
152 | - apt-get update || apt-get update
153 | - apt-get install -y openjdk-11-jdk-headless
154 | - update-alternatives --auto java
155 | gradle:
156 | - yes
157 |
158 | - versionName: 2.0.4
159 | versionCode: 1
160 | commit: v2.0.4
161 | subdir: app
162 | sudo:
163 | - apt-get update || apt-get update
164 | - apt-get install -y openjdk-11-jdk-headless
165 | - update-alternatives --auto java
166 | gradle:
167 | - yes
168 |
169 | AutoUpdateMode: Version v%v
170 | UpdateCheckMode: Tags
171 | CurrentVersion: 2.1.2
172 | CurrentVersionCode: 4
173 |
--------------------------------------------------------------------------------
/app/src/main/java/org/hollowbamboo/chordreader2/chords/NoteNaming.java:
--------------------------------------------------------------------------------
1 | package org.hollowbamboo.chordreader2.chords;
2 |
3 | import org.hollowbamboo.chordreader2.R;
4 | import org.hollowbamboo.chordreader2.util.EnumMultiMapBuilder;
5 |
6 | import java.util.*;
7 |
8 | /**
9 | * Enum for different note naming conventions.
10 | * @author nolan
11 | *
12 | */
13 | public enum NoteNaming {
14 |
15 | English (R.string.pref_note_naming_english,
16 | new EnumMultiMapBuilder(ChordRoot.class)
17 | .put(ChordRoot.A , "A")
18 | .put(ChordRoot.Bb , "Bb", "A#", "Asharp", "Bflat", "A♯", "B♭")
19 | .put(ChordRoot.B , "B", "Cb", "Cflat", "C♭")
20 | .put(ChordRoot.C , "C", "B#", "Bsharp", "B♯")
21 | .put(ChordRoot.Db , "Db", "C#", "Dflat", "Csharp", "C♯", "D♭")
22 | .put(ChordRoot.D , "D")
23 | .put(ChordRoot.Eb , "Eb", "D#", "Eflat", "Dsharp", "D♯", "E♭")
24 | .put(ChordRoot.E , "E", "Fb", "Fflat", "F♭")
25 | .put(ChordRoot.F , "F", "E#", "Esharp", "E♯")
26 | .put(ChordRoot.Gb , "Gb", "F#", "Gflat", "Fsharp", "F♯", "G♭")
27 | .put(ChordRoot.G , "G")
28 | .put(ChordRoot.Ab , "Ab", "G#", "Aflat", "Gsharp", "G♯", "A♭")
29 | .build()),
30 |
31 | EnglishWithSharps (R.string.pref_note_naming_english_sharps,
32 | new EnumMultiMapBuilder(ChordRoot.class)
33 | .put(ChordRoot.A , "A")
34 | .put(ChordRoot.Bb , "Bb", "A#", "Asharp", "Bflat", "A♯", "B♭")
35 | .put(ChordRoot.B , "B", "Cb", "Cflat", "C♭")
36 | .put(ChordRoot.C , "C", "B#", "Bsharp", "B♯")
37 | .put(ChordRoot.Db , "C#", "Db", "Dflat", "Csharp", "C♯", "D♭")
38 | .put(ChordRoot.D , "D")
39 | .put(ChordRoot.Eb , "D#", "Eb", "Eflat", "Dsharp", "D♯", "E♭")
40 | .put(ChordRoot.E , "E", "Fb", "Fflat", "F♭")
41 | .put(ChordRoot.F , "F", "E#", "Esharp", "E♯")
42 | .put(ChordRoot.Gb , "F#", "Gb", "Gflat", "Fsharp", "F♯", "G♭")
43 | .put(ChordRoot.G , "G")
44 | .put(ChordRoot.Ab , "G#", "Ab", "Aflat", "Gsharp", "G♯", "A♭")
45 | .build()),
46 |
47 | NorthernEuropean (R.string.pref_note_naming_northern,
48 | new EnumMultiMapBuilder(ChordRoot.class)
49 | .put(ChordRoot.A , "A")
50 | .put(ChordRoot.Bb , "B", "A#", "Asharp", "A♯")
51 | .put(ChordRoot.B , "H")
52 | .put(ChordRoot.C , "C")
53 | .put(ChordRoot.Db , "C#", "Db", "Dflat", "Csharp", "C♯", "D♭")
54 | .put(ChordRoot.D , "D")
55 | .put(ChordRoot.Eb , "D#", "Eb", "Eflat", "Dsharp", "D♯", "E♭")
56 | .put(ChordRoot.E , "E", "Fb", "Fflat", "F♭")
57 | .put(ChordRoot.F , "F", "E#", "Esharp", "E♯")
58 | .put(ChordRoot.Gb , "F#", "Gb", "Gflat", "Fsharp", "F♯", "G♭")
59 | .put(ChordRoot.G , "G")
60 | .put(ChordRoot.Ab , "G#", "Ab", "Aflat", "Gsharp", "G♯", "A♭")
61 | .build()),
62 |
63 | SouthernEuropean (R.string.pref_note_naming_southern,
64 | new EnumMultiMapBuilder(ChordRoot.class)
65 | .put(ChordRoot.A , "La")
66 | .put(ChordRoot.Bb , "Tib", "La#", "La♯", "Ti♭")
67 | .put(ChordRoot.B , "Ti")
68 | .put(ChordRoot.C , "Do")
69 | .put(ChordRoot.Db , "Reb", "RŽb", "Do#", "Do♯", "Re♭")
70 | .put(ChordRoot.D , "Re", "RŽ")
71 | .put(ChordRoot.Eb , "Mib", "Re#", "Re♯", "Mi♭")
72 | .put(ChordRoot.E , "Mi")
73 | .put(ChordRoot.F , "Fa")
74 | .put(ChordRoot.Gb , "Solb", "Sob", "Fa#", "Fa♯", "So♭")
75 | .put(ChordRoot.G , "Sol", "So")
76 | .put(ChordRoot.Ab , "Lab", "So#", "Sol#", "So♯", "Sol♯", "La♭")
77 | .build()),
78 | ;
79 |
80 | private final EnumMap> noteNames;
81 | private final Map lookupMap = new HashMap();
82 | private final int printableNameResource;
83 |
84 | NoteNaming(int printableNameResource,
85 | EnumMap> noteNames) {
86 | if (noteNames.size() != 12) {
87 | throw new IllegalArgumentException("must have 12 notes");
88 | }
89 | this.noteNames = noteNames;
90 | this.printableNameResource = printableNameResource;
91 |
92 | for (ChordRoot value : ChordRoot.values()) {
93 | for (String alias : noteNames.get(value)) {
94 | lookupMap.put(alias.toLowerCase(), value);
95 | }
96 | }
97 | }
98 |
99 |
100 | public List getAllNames() {
101 | List result = new ArrayList();
102 |
103 | for (ChordRoot chordRoot : ChordRoot.values()) {
104 | result.addAll(noteNames.get(chordRoot));
105 | }
106 |
107 | return result;
108 | }
109 |
110 | public ChordRoot findByAlias(String alias) {
111 | return lookupMap.get(alias.toLowerCase());
112 | }
113 |
114 | public List getNames(ChordRoot chordRoot) {
115 | return noteNames.get(chordRoot);
116 | }
117 |
118 | public int getPrintableNameResource() {
119 | return printableNameResource;
120 | }
121 |
122 | }
123 |
--------------------------------------------------------------------------------
/app/src/main/java/org/hollowbamboo/chordreader2/chords/Chord.java:
--------------------------------------------------------------------------------
1 | package org.hollowbamboo.chordreader2.chords;
2 |
3 | import java.io.Serializable;
4 |
5 | public class Chord implements Cloneable, Serializable {
6 |
7 | private ChordRoot root;
8 | private ChordQuality quality;
9 | private ChordExtended seventh;
10 | private ChordAdded added;
11 | private ChordSuspended suspended;
12 | private ChordRoot overridingRoot;
13 |
14 | public ChordRoot getRoot() {
15 | return root;
16 | }
17 | public void setRoot(ChordRoot root) {
18 | this.root = root;
19 | }
20 |
21 |
22 |
23 | public ChordRoot getOverridingRoot() {
24 | return overridingRoot;
25 | }
26 | public void setOverridingRoot(ChordRoot overridingRoot) {
27 | this.overridingRoot = overridingRoot;
28 | }
29 |
30 | @Override
31 | public Object clone() {
32 |
33 | org.hollowbamboo.chordreader2.chords.Chord clonedChord = new org.hollowbamboo.chordreader2.chords.Chord();
34 |
35 | clonedChord.root = this.root;
36 | clonedChord.quality = this.quality;
37 | clonedChord.seventh = this.seventh;
38 | clonedChord.added = this.added;
39 | clonedChord.suspended = this.suspended;
40 | clonedChord.overridingRoot = this.overridingRoot;
41 |
42 | return clonedChord;
43 |
44 | }
45 |
46 | public static org.hollowbamboo.chordreader2.chords.Chord newChord(ChordRoot root, ChordQuality quality, ChordExtended seventh,
47 | ChordAdded added, ChordSuspended suspended, ChordRoot overridingRoot) {
48 |
49 | org.hollowbamboo.chordreader2.chords.Chord chord = new org.hollowbamboo.chordreader2.chords.Chord();
50 |
51 | chord.root = root;
52 | chord.quality = quality;
53 | chord.seventh = seventh;
54 | chord.added = added;
55 | chord.suspended = suspended;
56 | chord.overridingRoot = overridingRoot;
57 |
58 | return chord;
59 | }
60 | @Override
61 | public int hashCode() {
62 | final int prime = 31;
63 | int result = 1;
64 | result = prime * result + ((added == null) ? 0 : added.hashCode());
65 | result = prime * result
66 | + ((overridingRoot == null) ? 0 : overridingRoot.hashCode());
67 | result = prime * result + ((quality == null) ? 0 : quality.hashCode());
68 | result = prime * result + ((root == null) ? 0 : root.hashCode());
69 | result = prime * result + ((seventh == null) ? 0 : seventh.hashCode());
70 | result = prime * result
71 | + ((suspended == null) ? 0 : suspended.hashCode());
72 | return result;
73 | }
74 | @Override
75 | public boolean equals(Object obj) {
76 | if (this == obj)
77 | return true;
78 | if (obj == null)
79 | return false;
80 | if (getClass() != obj.getClass())
81 | return false;
82 | org.hollowbamboo.chordreader2.chords.Chord other = (org.hollowbamboo.chordreader2.chords.Chord) obj;
83 | if (added == null) {
84 | if (other.added != null)
85 | return false;
86 | } else if (!added.equals(other.added))
87 | return false;
88 | if (overridingRoot == null) {
89 | if (other.overridingRoot != null)
90 | return false;
91 | } else if (!overridingRoot.equals(other.overridingRoot))
92 | return false;
93 | if (quality == null) {
94 | if (other.quality != null)
95 | return false;
96 | } else if (!quality.equals(other.quality))
97 | return false;
98 | if (root == null) {
99 | if (other.root != null)
100 | return false;
101 | } else if (!root.equals(other.root))
102 | return false;
103 | if (seventh == null) {
104 | if (other.seventh != null)
105 | return false;
106 | } else if (!seventh.equals(other.seventh))
107 | return false;
108 | if (suspended == null) {
109 | return other.suspended == null;
110 | } else return suspended.equals(other.suspended);
111 | }
112 | @Override
113 | public String toString() {
114 | return "Chord [added=" + added + ", overridingRoot=" + overridingRoot
115 | + ", quality=" + quality + ", root=" + root + ", seventh="
116 | + seventh + ", suspended=" + suspended + "]";
117 | }
118 |
119 | public String toPrintableString(NoteNaming noteNaming) {
120 |
121 | // TODO: make the aliases customizable rather than just taking the first one
122 | StringBuilder stringBuilder = new StringBuilder(
123 | noteNaming.getNames(root).get(0));
124 |
125 | if (seventh != null) {
126 | stringBuilder.append(seventh.getAliases().get(0));
127 | } else {
128 | stringBuilder.append(quality.getAliases().get(0));
129 | }
130 |
131 | if (added != null) {
132 | stringBuilder.append(added.getAliases().get(0));
133 | }
134 |
135 | if (suspended != null) {
136 | stringBuilder.append(suspended.getAliases().get(0));
137 | }
138 |
139 | if (overridingRoot != null) {
140 | stringBuilder.append("/").append(noteNaming.getNames(overridingRoot).get(0));
141 | }
142 |
143 | return stringBuilder.toString();
144 |
145 | }
146 | }
--------------------------------------------------------------------------------
/app/src/main/java/org/hollowbamboo/chordreader2/chords/ChordExtended.java:
--------------------------------------------------------------------------------
1 | package org.hollowbamboo.chordreader2.chords;
2 |
3 |
4 | import java.util.*;
5 |
6 | import static org.hollowbamboo.chordreader2.chords.ChordQuality.*;
7 |
8 | /**
9 | * e.g. seventh, ninth, elevenths
10 | * @author nolan
11 | *
12 | */
13 | public enum ChordExtended {
14 |
15 |
16 | // sevenths
17 | Major7 (Major, Arrays.asList("maj7", "Maj7", "M7", "+7")),
18 | Minor7 (Minor, Arrays.asList("m7", "Min7", "min7", "minor7")),
19 | Dominant7 (Major, Arrays.asList("7", "dom7", "dominant7")),
20 | Diminished7 (Diminished, Arrays.asList("dim7", "diminished7")),
21 |
22 | // true extended
23 | Major9 (Major, Arrays.asList("9","maj9", "M9", "dom9","7/9","7(add9)", "7(9)","7/add9")),
24 | Major11 (Major, Arrays.asList("11", "maj11", "M11")),
25 | Major13 (Major, Arrays.asList("13", "maj13", "M13")),
26 |
27 | MajorSharp11 (Major, Arrays.asList("maj#11", "M#11")),
28 | MajorSharp13 (Major, Arrays.asList("maj#13", "M#13")),
29 |
30 | Minor9 (Minor, Arrays.asList("m9", "mih9")),
31 | Minor11 (Minor, Arrays.asList("m11", "min11")),
32 | Minor13 (Minor, Arrays.asList("m13", "min13")),
33 |
34 | // weird ones
35 | AugmentedDominant7Sharp5 (Major, Arrays.asList("7#5", "7(#5)", "7+5", "+7", "aug7")),
36 | AugmentedMajor7 (Major, Arrays.asList("maj7#5", "maj7(#5)", "augM7", "+M7", "M7#5", "M7(#5)", "M7/#5", "M7+5", "maj+7", "augmaj7")),
37 | AugmentedMinor5 (Minor, Arrays.asList("m#5", "-(5+)")),
38 |
39 | HalfDiminished7 (Minor, Arrays.asList("m7b5", "m7#5", "m7(b5)", "min7(b5)", "-7b5")),
40 | MinorMajor7Sharp5 (Minor, Arrays.asList("mmaj7#5","mM7#5")),
41 | Minor7Add9 (Minor, Arrays.asList("m9", "m7/9", "min7(add9)", "minor9", "min9", "m7(add9)", "-7/9", "-7(add9)", "min7/9", "min7(add9)", "m7+9")),
42 | Major7Add11 (Major, Arrays.asList("7/11","7(add11)", "7(11)","7/add11")),
43 | Minor7Add11 (Minor, Arrays.asList("m7/11","m7(add11)", "m7(11)","m7/add11")),
44 | Major7Diminished5 (Major, Arrays.asList("7b5","7(5-)","maj7b5","+7b5","M7b5")),
45 | Minor7Diminished5 (Minor, Arrays.asList("m7b5","min7(b5)","min7b5","m7(5-)","min7(5-)")),
46 | MinorMajor7Diminished5 (Major, Arrays.asList("mmaj7b5","mM7b5")),
47 | MinorMajor7DoubleDiminished5 (Major, Arrays.asList("mmaj7bb5","mM7bb5")),
48 | Major7flat5sharp9 (Major, Arrays.asList("7b5#9","7-5+9","dom7b5#9")),
49 | Major7flat9 (Major, Arrays.asList("7b9","7-9","dom7b9")),
50 | Major7flat9flat13(Major, Collections.singletonList("7b9b13")),
51 | Major7sharp9(Major,Arrays.asList("7#9","7+9","dom7#9","7/#9")),
52 | Major7sharp9Flat5(Major,Arrays.asList("7#9b5","7+9-5","dom7#9b5","7/#9b5")),
53 | Major7sharp11(Major,Arrays.asList("7#11","7+11","dom7#11","maj7#11","maj7/#11")),
54 | MajorFlat5(Major,Arrays.asList("majb5","Mb5")),
55 | MinorMajor7(Minor,Arrays.asList("mmaj7","MinMaj7","m(maj7)","min/maj7", "mM7", "min(maj7)")),
56 | MinorMajor9(Minor,Arrays.asList("mmaj9","MinMaj9","m(maj9)","min/maj9", "mM9", "min(maj9)")),
57 | MinorMajor11(Minor,Arrays.asList("mmaj11","MinMaj11","m(maj11)","min/maj11", "mM11", "min(maj11)")),
58 | MinorMajor13(Minor,Arrays.asList("mmaj13","MinMaj13","m(maj13)","min/maj1", "mM13", "min(maj13)")),
59 | MinorDoubleFlat5(Minor,Collections.singletonList("mbb5")),
60 | MinorSharp5(Minor,Arrays.asList("m#5","Mb5")),
61 |
62 | ;
63 |
64 | private final List aliases;
65 | private final ChordQuality chordQuality;
66 |
67 | ChordExtended(ChordQuality chordQuality, List aliases) {
68 | this.chordQuality = chordQuality;
69 | this.aliases = aliases;
70 | }
71 |
72 | public List getAliases() {
73 | return aliases;
74 | }
75 |
76 | /**
77 | * A chord quality is inherent to every type of seventh. See the wikipedia page for more info.
78 | * ...
79 | */
80 | public ChordQuality getChordQuality() {
81 | return chordQuality;
82 | }
83 |
84 |
85 | public static List getAllAliases() {
86 | List result = new ArrayList<>();
87 |
88 | for (org.hollowbamboo.chordreader2.chords.ChordExtended chordSeventh : values()) {
89 | result.addAll(chordSeventh.aliases);
90 | }
91 |
92 | return result;
93 | }
94 |
95 |
96 | private static final Map lookupMap = new HashMap<>();
97 |
98 | static {
99 | for (org.hollowbamboo.chordreader2.chords.ChordExtended value : values()) {
100 | for (String alias : value.aliases) {
101 | lookupMap.put(alias.toLowerCase(), value);
102 | }
103 | }
104 | }
105 |
106 | public static org.hollowbamboo.chordreader2.chords.ChordExtended findByAlias(String alias) {
107 |
108 | // special case for M7 and m7
109 | if (alias.equals("M7")) {
110 | return Major7;
111 | } else if (alias.equals("m7")) {
112 | return Minor7;
113 | }
114 |
115 | return lookupMap.get(alias.toLowerCase());
116 | }
117 |
118 | }
119 |
--------------------------------------------------------------------------------
/app/src/main/res/raw/about_body_fr.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Version %s
6 |
7 |
8 |
9 |
10 |
11 |
12 |
Cord Reader 2 est une application gratuite et open-source sous licence GPLV3+. Voir la source
13 | ici .
16 |
17 |
Tous défaillance peut être signalés à la
18 | Issue Tracker .
21 |
22 |
Si vous souhaitez faire un don, visitez
23 | paypal.me/hollowbamboo .
26 |
27 |
Le Changelog est fourni
28 | ici .
31 |
32 |
33 |
34 |
35 | Action de grâces
36 |
37 |
38 |
39 | Chordreader 2 bases sur chordreader, développée par Nolan Lawson .
42 |
43 |
Amélioré par
44 | AndInTheClouds
47 |
48 |
49 | avec des contributions de:
50 | Marcel Klehr
53 | wtimme ,
56 | HDavo ,
59 | shanemd ,
62 | Ezelty
65 | .
66 |
67 |
68 |
69 |
70 |
71 | Changelog
72 |
73 |
74 | 2.1.6
75 |
76 | Nouvelle fonctionnalité: Ouvrir des URL partagées
77 | Nouvelle fonctionnalité: Le nouveau thème "Automatic" s'inspire du "Night Mode" d'Android
78 | Changez de transposition en appuyant sur les étiquettes situées à côté de la barre de recherche
79 | Amélioration du nom de fichier pour les accords ultimate-guitar.com
80 |
81 |
82 | 2.1.5
83 |
84 | Nouvelle fonctionnalité: partager des fichiers - Song actuel, sélection de la liste des chansons, setlist actuel
85 | Améliorer le comportement de la sauvegarde de la setlist
86 |
87 |
88 | 2.1.4
89 |
90 | ChangeLog ajouté à F-droid
91 | Extraction Web: extrait maintenant le BPM si fourni
92 | Correction de bug: enregistrer la setlist uniquement lorsqu'il est modifié
93 | Correction de bugs: attraper des pointeurs nuls pendant que Wakelock acquérir et restaurer l'application à partir de l'arrière-plan
94 | Correction de bugs: améliorer l'extraction Web - Correction des espaces blancs perdus après plusieurs nouvelles lignes
95 |
96 |
97 | 2.1.3
98 |
99 | Correction d'un problème de désorganisation de l'ordre des chansons dans la setlist à l'ouverture
100 | Correction d'un problème de sauvegarde des chansons éditées lors du changement de chanson en mode Setlist
101 |
102 |
103 | 2.1.2
104 |
105 | Passage à Android Storage Access Framework à partir d'Android 8.1
106 | Possibilité d'un chemin de stockage personnalisé
107 |
108 |
109 |
110 | 2.1.1
111 |
112 | Ajouter une chanson active à une setlist via le menu
113 | Ajout d'une page d'aide
114 | Corrections d\'erreurs et optimisations mineures
115 |
116 |
117 | 2.1.0
118 |
119 | Passage de l'architecture de l'interface utilisateur au modèle de fragment
120 | Ajout d'une fonction de setliste
121 | Corrections d'erreurs et optimisations diverse
122 |
123 |
124 | 2.0.0
125 |
126 | Fonction de défilement automatique
127 | Métronome au début du défilement automatique
128 | Demander quitter et enregistrer
129 | Enregistrer le BPM et le facteur de défilement automatique dans un fichier TXT
130 | Plusieurs doigtés dans les pop-up.
131 | Suppression des publicités
132 | Moteur de recherche personnalisable
133 | Personnaliser les tables de variation d'accords
134 |
135 |
136 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_song_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
10 |
11 |
12 |
16 |
17 |
18 |
22 |
23 |
33 |
34 |
35 |
45 |
46 |
57 |
58 |
70 |
71 |
82 |
83 |
94 |
95 |
104 |
105 |
106 |
--------------------------------------------------------------------------------