├── .editorconfig ├── .github ├── COC_CONTACT.md ├── CODE_OF_CONDUCT.md ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ ├── data_wikidata.yml │ ├── design_improvement.yml │ ├── feature_request.yml │ ├── new_keyboard.yml │ └── question.yml ├── PULL_REQUEST_TEMPLATE.md ├── composite │ └── prepareApp │ │ └── action.yml ├── resources │ └── images │ │ └── android_preview.png └── workflows │ ├── android_ci.yml │ ├── pr_ci_license_header_check.yaml │ └── pr_maintainer_checklist.yaml ├── .gitignore ├── .licenserc.yaml ├── .pre-commit-config.yaml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE.txt ├── PRIVACY.txt ├── README.md ├── SECURITY.md ├── app ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ ├── androidTest │ └── kotlin │ │ └── be │ │ └── scri │ │ └── ui │ │ └── screens │ │ └── settings │ │ └── SettingsUtilTest.kt │ ├── debug │ └── res │ │ └── values │ │ └── strings.xml │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── data-contracts │ │ │ ├── de.json │ │ │ ├── en.json │ │ │ ├── es.json │ │ │ ├── fr.json │ │ │ ├── it.json │ │ │ ├── pt.json │ │ │ ├── ru.json │ │ │ └── sv.json │ │ ├── data │ │ │ ├── DELanguageData.sqlite │ │ │ ├── ENLanguageData.sqlite │ │ │ ├── ESLanguageData.sqlite │ │ │ ├── FRLanguageData.sqlite │ │ │ ├── ITLanguageData.sqlite │ │ │ ├── PTLanguageData.sqlite │ │ │ ├── RULanguageData.sqlite │ │ │ ├── SVLanguageData.sqlite │ │ │ └── TranslationData.sqlite │ │ └── i18n │ │ │ ├── .github │ │ │ ├── COC_CONTACT.md │ │ │ ├── CODE_OF_CONDUCT.md │ │ │ ├── ISSUE_TEMPLATE │ │ │ │ ├── config.yml │ │ │ │ ├── localization.yml │ │ │ │ └── question.yml │ │ │ └── workflows │ │ │ │ ├── json_conversion.yml │ │ │ │ └── pr_maintainer_checklist.yaml │ │ │ ├── .gitignore │ │ │ ├── LICENSE.txt │ │ │ ├── README.md │ │ │ └── Scribe-i18n │ │ │ ├── Localizable.xcstrings │ │ │ ├── jsons │ │ │ ├── ar.json │ │ │ ├── bn.json │ │ │ ├── de.json │ │ │ ├── en-US.json │ │ │ ├── es.json │ │ │ ├── fr.json │ │ │ ├── hi.json │ │ │ ├── ko.json │ │ │ ├── mr.json │ │ │ ├── pt.json │ │ │ ├── ru.json │ │ │ └── sv.json │ │ │ ├── scripts │ │ │ ├── Android │ │ │ │ ├── convert_jsons_to_strings.py │ │ │ │ └── convert_strings_to_json.py │ │ │ └── iOS │ │ │ │ ├── convert_jsons_to_xcstrings.py │ │ │ │ └── convert_xcstrings_to_jsons.py │ │ │ └── values │ │ │ ├── ar │ │ │ └── string.xml │ │ │ ├── bn │ │ │ └── string.xml │ │ │ ├── de │ │ │ └── string.xml │ │ │ ├── en-US │ │ │ └── string.xml │ │ │ ├── es │ │ │ └── string.xml │ │ │ ├── fr │ │ │ └── string.xml │ │ │ ├── hi │ │ │ └── string.xml │ │ │ ├── ko │ │ │ └── string.xml │ │ │ ├── mr │ │ │ └── string.xml │ │ │ ├── pt │ │ │ └── string.xml │ │ │ ├── ru │ │ │ └── string.xml │ │ │ └── sv │ │ │ └── string.xml │ ├── ic_launcher-playstore.png │ ├── java │ │ └── be │ │ │ └── scri │ │ │ ├── App.kt │ │ │ ├── activities │ │ │ └── MainActivity.kt │ │ │ ├── extensions │ │ │ ├── CommonsContext.kt │ │ │ ├── Context.kt │ │ │ ├── ContextStyling.kt │ │ │ ├── Drawable.kt │ │ │ ├── Int.kt │ │ │ └── View.kt │ │ │ ├── helpers │ │ │ ├── AlphanumericComparator.kt │ │ │ ├── BaseConfig.kt │ │ │ ├── CommonsConstants.kt │ │ │ ├── Config.kt │ │ │ ├── Constants.kt │ │ │ ├── CustomAdapter.kt │ │ │ ├── DatabaseFileManager.kt │ │ │ ├── DatabaseHelper.kt │ │ │ ├── DatabaseManagers.kt │ │ │ ├── HintUtils.kt │ │ │ ├── KeyHandler.kt │ │ │ ├── KeyboardBase.kt │ │ │ ├── PreferencesHelper.kt │ │ │ ├── RatingHelper.kt │ │ │ ├── ShareHelper.kt │ │ │ ├── english │ │ │ │ └── ENInterfaceVariables.kt │ │ │ ├── french │ │ │ │ └── FRInterfaceVariables.kt │ │ │ ├── german │ │ │ │ └── DEInterfaceVariables.kt │ │ │ ├── italian │ │ │ │ └── ITInterfaceVariables.kt │ │ │ ├── keyboardDBHelper │ │ │ │ ├── ContractDataLoader.kt │ │ │ │ ├── EmojiDataManager.kt │ │ │ │ ├── GenderDataManager.kt │ │ │ │ ├── PluralFormsManager.kt │ │ │ │ ├── PrepositionDataManager.kt │ │ │ │ └── TranslationDataManager.kt │ │ │ ├── portuguese │ │ │ │ └── PTInterfaceVariables.kt │ │ │ ├── russian │ │ │ │ └── RUInterfaceVariables.kt │ │ │ ├── spanish │ │ │ │ └── ESInterfaceVariables.kt │ │ │ └── swedish │ │ │ │ └── SVInterfaceVariables.kt │ │ │ ├── models │ │ │ ├── DataContract.kt │ │ │ ├── ItemsViewModel.kt │ │ │ ├── SwitchItem.kt │ │ │ └── TextItem.kt │ │ │ ├── navigation │ │ │ └── Screen.kt │ │ │ ├── services │ │ │ ├── EnglishKeyboardIME.kt │ │ │ ├── FrenchKeyboardIME.kt │ │ │ ├── GeneralKeyboardIME.kt │ │ │ ├── GermanKeyboardIME.kt │ │ │ ├── ItalianKeyboardIME.kt │ │ │ ├── PortugueseKeyboardIME.kt │ │ │ ├── RussianKeyboardIME.kt │ │ │ ├── SpanishKeyboardIME.kt │ │ │ └── SwedishKeyboardIME.kt │ │ │ ├── ui │ │ │ ├── common │ │ │ │ ├── ScribeBaseScreen.kt │ │ │ │ ├── appcomponents │ │ │ │ │ ├── ActionBar.kt │ │ │ │ │ ├── HintDialog.kt │ │ │ │ │ └── PageTitle.kt │ │ │ │ ├── bottombar │ │ │ │ │ ├── BottomBarScreen.kt │ │ │ │ │ └── ScribeBottomBar.kt │ │ │ │ └── components │ │ │ │ │ ├── AboutPageItemComp.kt │ │ │ │ │ ├── ClickableItemComp.kt │ │ │ │ │ ├── ComposeScaffoldContainer.kt │ │ │ │ │ ├── ItemCardContainer.kt │ │ │ │ │ ├── ItemCardContainerWithTitle.kt │ │ │ │ │ └── SwitchableItemComp.kt │ │ │ ├── models │ │ │ │ ├── ScribeItem.kt │ │ │ │ └── ScribeItemList.kt │ │ │ ├── screens │ │ │ │ ├── InstallationScreen.kt │ │ │ │ ├── LanguageSettingsScreen.kt │ │ │ │ ├── PrivacyPolicyScreen.kt │ │ │ │ ├── SelectLanguageScreen.kt │ │ │ │ ├── ThirdPartyScreen.kt │ │ │ │ ├── WikimediaScreen.kt │ │ │ │ ├── about │ │ │ │ │ ├── AboutScreen.kt │ │ │ │ │ └── AboutUtil.kt │ │ │ │ └── settings │ │ │ │ │ ├── SettingsScreen.kt │ │ │ │ │ ├── SettingsUtil.kt │ │ │ │ │ ├── SettingsViewModel.kt │ │ │ │ │ └── SettingsViewModelFactory.kt │ │ │ └── theme │ │ │ │ ├── Colors.kt │ │ │ │ ├── ScribeTheme.kt │ │ │ │ └── Typography.kt │ │ │ └── views │ │ │ ├── CustomDividerItemDecoration.kt │ │ │ └── KeyboardView.kt │ └── res │ │ ├── drawable-hdpi │ │ ├── img_write_storage.webp │ │ ├── img_write_storage_create_doc_sdk_30.webp │ │ ├── img_write_storage_otg.webp │ │ ├── img_write_storage_sd.webp │ │ └── img_write_storage_sdk_30.webp │ │ ├── drawable-v31 │ │ └── keyboard_space_background_material.xml │ │ ├── drawable-xhdpi │ │ ├── img_write_storage.webp │ │ ├── img_write_storage_create_doc_sdk_30.webp │ │ ├── img_write_storage_otg.webp │ │ ├── img_write_storage_sd.webp │ │ └── img_write_storage_sdk_30.webp │ │ ├── drawable-xxhdpi │ │ ├── img_write_storage.webp │ │ ├── img_write_storage_create_doc_sdk_30.webp │ │ ├── img_write_storage_otg.webp │ │ ├── img_write_storage_sd.webp │ │ └── img_write_storage_sdk_30.webp │ │ ├── drawable-xxxhdpi │ │ ├── img_write_storage.webp │ │ ├── img_write_storage_create_doc_sdk_30.webp │ │ ├── img_write_storage_otg.webp │ │ ├── img_write_storage_sd.webp │ │ └── img_write_storage_sdk_30.webp │ │ ├── drawable │ │ ├── background.xml │ │ ├── black_dialog_background.xml │ │ ├── bookmark_icon.xml │ │ ├── bottom_sheet_bg.xml │ │ ├── bug_report_icon.xml │ │ ├── button_background_rounded.xml │ │ ├── button_background_stroke.xml │ │ ├── chevron.xml │ │ ├── circle_background.xml │ │ ├── close.xml │ │ ├── close_icon.xml │ │ ├── cmd_bar_background_right_rounded.xml │ │ ├── cmd_bar_prompt_background.xml │ │ ├── cmd_key_background_rounded.xml │ │ ├── cog.xml │ │ ├── color_picker_circle.xml │ │ ├── corner_polygon.xml │ │ ├── counter_clockwise_icon.xml │ │ ├── dialog_bg.xml │ │ ├── dialog_you_background.xml │ │ ├── divider.xml │ │ ├── emoji_phone_background_rounded.xml │ │ ├── emoji_tablet_background_rounded.xml │ │ ├── external_link.xml │ │ ├── gender_suggestion_button_left_background.xml │ │ ├── gender_suggestion_button_right_background.xml │ │ ├── github_logo.xml │ │ ├── globe.xml │ │ ├── glow.xml │ │ ├── gradient_background.xml │ │ ├── gradient_background_flipped.xml │ │ ├── ic_add_person_vector.xml │ │ ├── ic_arrow_left_vector.xml │ │ ├── ic_arrow_right_vector.xml │ │ ├── ic_article_vector.xml │ │ ├── ic_camera_vector.xml │ │ ├── ic_caps_lock_off.xml │ │ ├── ic_caps_lock_on.xml │ │ ├── ic_caps_lock_selector.xml │ │ ├── ic_caps_outline_vector.xml │ │ ├── ic_caps_underlined_vector.xml │ │ ├── ic_caps_vector.xml │ │ ├── ic_clear_outline_vector.xml │ │ ├── ic_clear_vector.xml │ │ ├── ic_code_vector.xml │ │ ├── ic_cross_vector.xml │ │ ├── ic_drag_handle_vector.xml │ │ ├── ic_enter_vector.xml │ │ ├── ic_file_generic.xml │ │ ├── ic_folder_vector.xml │ │ ├── ic_group_circle_bg.xml │ │ ├── ic_info_vector.xml │ │ ├── ic_left_arrow.xml │ │ ├── ic_link_vector.xml │ │ ├── ic_mail_vector.xml │ │ ├── ic_people_vector.xml │ │ ├── ic_plus_vector.xml │ │ ├── ic_question_mark_vector.xml │ │ ├── ic_rename_vector.xml │ │ ├── ic_right_arrow.xml │ │ ├── ic_scribe_icon_vector.xml │ │ ├── ic_search_vector.xml │ │ ├── ic_send_vector.xml │ │ ├── ic_tab_rounded.xml │ │ ├── key_pressed_background.xml │ │ ├── keyboard_dark.xml │ │ ├── keyboard_enter_background.xml │ │ ├── keyboard_key_background.xml │ │ ├── keyboard_key_selector.xml │ │ ├── keyboard_light.xml │ │ ├── keyboard_space_background.xml │ │ ├── license_icon.xml │ │ ├── light_bulb_icon.xml │ │ ├── line.xml │ │ ├── mail_icon.xml │ │ ├── mastodon_svg_icon.xml │ │ ├── material_info.xml │ │ ├── material_keyboard.xml │ │ ├── material_settings.xml │ │ ├── matrix_icon.xml │ │ ├── minikeyboard_background.xml │ │ ├── minikeyboard_selected_background.xml │ │ ├── moon.xml │ │ ├── nav_bar_selector.xml │ │ ├── play_button.xml │ │ ├── right_arrow.xml │ │ ├── ripple_all_corners.xml │ │ ├── ripple_background.xml │ │ ├── ripple_bottom_corners.xml │ │ ├── ripple_top_corners.xml │ │ ├── rounded_all_corners.xml │ │ ├── rounded_bottom.xml │ │ ├── rounded_button.xml │ │ ├── rounded_drawable.xml │ │ ├── rounded_middle.xml │ │ ├── rounded_top.xml │ │ ├── rv_divider.xml │ │ ├── scribe_icon.xml │ │ ├── scribe_key_background_left_rounded.xml │ │ ├── scribe_logo.webp │ │ ├── section_holder_stroke.xml │ │ ├── selector.xml │ │ ├── share_icon.xml │ │ ├── shield_check.xml │ │ ├── shield_lock.xml │ │ ├── shortcut_plus.xml │ │ ├── star.xml │ │ ├── sun.xml │ │ ├── thumb_selector.xml │ │ ├── top_popup_menu_bg_dark.xml │ │ ├── top_popup_menu_bg_light.xml │ │ ├── track_selector.xml │ │ ├── transparent_button.xml │ │ ├── transparent_button_pressed.xml │ │ ├── widget_round_background.xml │ │ ├── wikidata_logo.xml │ │ ├── wikimedia_logo_black.xml │ │ └── wikipedia_logo.xml │ │ ├── layout-land │ │ ├── keyboard_key_preview.xml │ │ └── keyboard_view_keyboard.xml │ │ ├── layout │ │ ├── actionbar_title.xml │ │ ├── activity_main.xml │ │ ├── card_view_text.xml │ │ ├── card_view_with_image.xml │ │ ├── card_view_with_switch.xml │ │ ├── custom_action_bar_layout.xml │ │ ├── fragment_about.xml │ │ ├── fragment_language_settings.xml │ │ ├── fragment_settings.xml │ │ ├── hint_layout.xml │ │ ├── keyboard_key_preview.xml │ │ ├── keyboard_popup_keyboard.xml │ │ ├── keyboard_view_command_options.xml │ │ └── keyboard_view_keyboard.xml │ │ ├── menu │ │ └── menu_navigation_bottom.xml │ │ ├── mipmap-anydpi-v26 │ │ └── ic_launcher.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher_background.png │ │ └── ic_launcher_foreground.png │ │ ├── values-ar │ │ └── string.xml │ │ ├── values-bn │ │ └── string.xml │ │ ├── values-de │ │ └── string.xml │ │ ├── values-es │ │ └── string.xml │ │ ├── values-fr │ │ └── string.xml │ │ ├── values-hi │ │ └── string.xml │ │ ├── values-ko │ │ └── string.xml │ │ ├── values-land │ │ └── dimens.xml │ │ ├── values-mr │ │ └── string.xml │ │ ├── values-night │ │ └── colors.xml │ │ ├── values-pt │ │ └── string.xml │ │ ├── values-ru │ │ └── string.xml │ │ ├── values-sv │ │ └── string.xml │ │ ├── values-w1240dp │ │ └── dimens.xml │ │ ├── values-w600dp │ │ └── dimens.xml │ │ ├── values │ │ ├── arrays.xml │ │ ├── attrs.xml │ │ ├── bools.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── ids.xml │ │ ├── integers.xml │ │ ├── string.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ ├── conjugate_view_1x1.xml │ │ ├── conjugate_view_1x3.xml │ │ ├── conjugate_view_2x1.xml │ │ ├── conjugate_view_2x2.xml │ │ ├── conjugate_view_3x2.xml │ │ ├── keyboard_popup_template.xml │ │ ├── keys_letter_french_without_period_and_comma.xml │ │ ├── keys_letter_german_without_accent_characters.xml │ │ ├── keys_letter_german_without_accent_characters_and_without_period_and_comma.xml │ │ ├── keys_letter_german_without_period_and_comma.xml │ │ ├── keys_letter_italian_without_period_and_comma.xml │ │ ├── keys_letter_spanish_without_accent_character.xml │ │ ├── keys_letter_spanish_without_accent_characters_and_without_period_and_comma.xml │ │ ├── keys_letter_spanish_without_period_and_comma.xml │ │ ├── keys_letter_swedish_without_accent_characters.xml │ │ ├── keys_letter_swedish_without_accent_characters_and_without_period_and_comma.xml │ │ ├── keys_letter_swedish_without_period_and_comma.xml │ │ ├── keys_letters_english.xml │ │ ├── keys_letters_english_tablet.xml │ │ ├── keys_letters_english_without_period_and_comma.xml │ │ ├── keys_letters_french.xml │ │ ├── keys_letters_french_tablet.xml │ │ ├── keys_letters_german.xml │ │ ├── keys_letters_german_tablet.xml │ │ ├── keys_letters_german_without_period_and_comma.xml │ │ ├── keys_letters_italian.xml │ │ ├── keys_letters_italian_tablet.xml │ │ ├── keys_letters_portuguese.xml │ │ ├── keys_letters_portuguese_tablet.xml │ │ ├── keys_letters_portuguese_without_period_and_comma.xml │ │ ├── keys_letters_russian.xml │ │ ├── keys_letters_russian_tablet.xml │ │ ├── keys_letters_russian_without_period_and_comma.xml │ │ ├── keys_letters_spanish.xml │ │ ├── keys_letters_spanish_tablet.xml │ │ ├── keys_letters_swedish.xml │ │ ├── keys_letters_swedish_tablet.xml │ │ ├── keys_symbols.xml │ │ ├── keys_symbols_shift.xml │ │ ├── locales_config.xml │ │ ├── method.xml │ │ ├── method_english.xml │ │ ├── method_french.xml │ │ ├── method_german.xml │ │ ├── method_italian.xml │ │ ├── method_portuguese.xml │ │ ├── method_russian.xml │ │ ├── method_spanish.xml │ │ └── method_swedish.xml │ └── test │ └── kotlin │ ├── be │ └── scri │ │ └── helpers │ │ └── PreferencesHelperTest.kt │ └── helpers │ ├── AlphanumericComparatorTest.kt │ └── ComprehensiveCoverageTest.kt ├── build.gradle.kts ├── detekt.yml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── icons ├── IconBackground.png ├── ScribeIcon.png ├── material_info.svg ├── material_keyboard.svg └── material_settings.svg ├── lint.xml ├── scripts └── coverage_parser.py ├── settings.gradle.kts └── update_i18n_keys.sh /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://EditorConfig.org 2 | 3 | # Top-most EditorConfig file. 4 | root = true 5 | 6 | # LF end-of-line, insert an empty new line and UTF-8. 7 | [*] 8 | end_of_line = lf 9 | insert_final_newline = true 10 | charset = utf-8 11 | indent_style = space 12 | indent_size = 4 13 | continuation_indent_size = 4 14 | max_line_length = 160 15 | 16 | [*.xml] 17 | continuation_indent_size = 4 18 | 19 | [*.kt] 20 | wildcard_import_limit = 999 21 | ij_kotlin_name_count_to_use_star_import = 999 22 | ij_kotlin_name_count_to_use_star_import_for_members = 999 23 | 24 | ktlint_code_style = ktlint_official 25 | ktlint_standard = enabled 26 | ktlint_standard_final-newline = enabled 27 | ktlint_function_naming_ignore_when_annotated_with = Composable 28 | 29 | ktlint_standard_kdoc = enabled 30 | -------------------------------------------------------------------------------- /.github/COC_CONTACT.md: -------------------------------------------------------------------------------- 1 | Issues pertaining to this project's [code of conduct](https://github.com/scribe-org/Scribe-Android/blob/main/.github/CODE_OF_CONDUCT.md) can be reported to the Scribe team at team@scri.be. 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: 🐞 Bug report 2 | description: Report a bug to help us improve Scribe-Android. 3 | type: "bug" 4 | projects: ["scribe-org/1"] 5 | body: 6 | - type: checkboxes 7 | id: new-bug 8 | attributes: 9 | label: Terms 10 | options: 11 | - label: I have searched all [open bug reports](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aopen+is%3Aissue+label%3Abug) 12 | required: true 13 | - label: I agree to follow Scribe-Android's [Code of Conduct](https://github.com/scribe-org/Scribe-Android/blob/main/.github/CODE_OF_CONDUCT.md) 14 | required: true 15 | - type: textarea 16 | attributes: 17 | label: Behavior 18 | placeholder: | 19 | A concise description of what you're experiencing and what you expected to happen. 20 | validations: 21 | required: true 22 | - type: input 23 | id: device 24 | attributes: 25 | label: Device type 26 | placeholder: "Please enter the device type" 27 | validations: 28 | required: true 29 | - type: input 30 | id: version 31 | attributes: 32 | label: Versions 33 | placeholder: "What are the OS and Scribe versions?" 34 | validations: 35 | required: false 36 | - type: markdown 37 | attributes: 38 | value: | 39 | Thanks for taking the time to fill out this bug report! 40 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: 🌐 Localization 4 | url: https://github.com/scribe-org/Scribe-i18n 5 | about: Head over to Scribe-i18n to help us with localization! 6 | - name: 👋 Community discussion channels 7 | url: https://matrix.to/#/#scribe_community:matrix.org 8 | about: Join us in our public Matrix chat rooms! 9 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/data_wikidata.yml: -------------------------------------------------------------------------------- 1 | name: 🗃️ Data and Wikidata 2 | description: Help Scribe bring open-source language data to your fingertips. 3 | type: "task" 4 | labels: ["data"] 5 | projects: ["scribe-org/1"] 6 | body: 7 | - type: checkboxes 8 | id: terms 9 | attributes: 10 | label: Terms 11 | options: 12 | - label: I have searched [open and closed data issues](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aissue+label%3Adata+) 13 | required: true 14 | - label: I agree to follow Scribe-Android's [Code of Conduct](https://github.com/scribe-org/Scribe-Android/blob/main/.github/CODE_OF_CONDUCT.md) 15 | required: true 16 | - type: input 17 | id: language 18 | attributes: 19 | label: Languages 20 | placeholder: Tell us which languages this relates to. 21 | validations: 22 | required: true 23 | - type: textarea 24 | id: description 25 | attributes: 26 | label: Description 27 | placeholder: Let us know what your idea is! 28 | validations: 29 | required: true 30 | - type: markdown 31 | attributes: 32 | value: | 33 | - If this is Wikidata related, including related Wikidata [QIDs, PIDs and lexemes](https://www.wikidata.org/wiki/Wikidata:Identifiers) would be very appreciated! 34 | - type: markdown 35 | attributes: 36 | value: | 37 | - Tip: you can search Wikidata for language data by putting `L:` at the start of a [search](https://www.wikidata.org/w/index.php?search=&search=&title=Special%3ASearch&go=Go) 38 | - type: markdown 39 | attributes: 40 | value: | 41 | Thank you for supporting free information platforms! 42 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/design_improvement.yml: -------------------------------------------------------------------------------- 1 | name: 🎨 Design improvement 2 | description: Make a suggestion for Scribe's UX/UI designs. 3 | type: "task" 4 | labels: ["design"] 5 | projects: ["scribe-org/1"] 6 | body: 7 | - type: checkboxes 8 | id: terms 9 | attributes: 10 | label: Terms 11 | options: 12 | - label: I have searched [open and closed design issues](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aissue+label%3Adesign) 13 | required: true 14 | - label: I agree to follow Scribe-Android's [Code of Conduct](https://github.com/scribe-org/Scribe-Android/blob/main/.github/CODE_OF_CONDUCT.md) 15 | required: true 16 | - type: textarea 17 | id: description 18 | attributes: 19 | label: Description 20 | placeholder: A brief description of the enhancement you propose (with screenshots if applicable). 21 | validations: 22 | required: true 23 | - type: textarea 24 | id: contribution 25 | attributes: 26 | label: Contribution 27 | placeholder: Let us know if you'd like to help and how :) 28 | validations: 29 | required: false 30 | - type: markdown 31 | attributes: 32 | value: | 33 | Thank you for your suggestion! 34 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: ✨ Feature request 2 | description: Have a new idea or feature for Scribe-Android? Please suggest! 3 | type: "feature" 4 | projects: ["scribe-org/1"] 5 | body: 6 | - type: checkboxes 7 | id: terms 8 | attributes: 9 | label: Terms 10 | options: 11 | - label: I have searched [open and closed feature requests](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aissue+label%3Afeature) 12 | required: true 13 | - label: I agree to follow Scribe-Android's [Code of Conduct](https://github.com/scribe-org/Scribe-Android/blob/main/.github/CODE_OF_CONDUCT.md) 14 | required: true 15 | - type: textarea 16 | id: description 17 | attributes: 18 | label: Description 19 | placeholder: A brief description of the enhancement you propose (with screenshots if applicable). 20 | validations: 21 | required: true 22 | - type: textarea 23 | id: contribution 24 | attributes: 25 | label: Contribution 26 | placeholder: Let us know if you'd like to help and how :) 27 | validations: 28 | required: false 29 | - type: markdown 30 | attributes: 31 | value: | 32 | Thank you for your suggestion! 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/new_keyboard.yml: -------------------------------------------------------------------------------- 1 | name: ⌨️ New keyboard 2 | description: Suggest a new language keyboard for Scribe! 3 | type: "feature" 4 | labels: ["new keyboard"] 5 | projects: ["scribe-org/1"] 6 | title: Add keyboard 7 | body: 8 | - type: checkboxes 9 | id: terms 10 | attributes: 11 | label: Terms 12 | options: 13 | - label: I have searched [open new keyboard issues](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aopen+is%3Aissue+label%3A%22new+keyboard%22) 14 | required: true 15 | - label: I agree to follow Scribe-Android's [Code of Conduct](https://github.com/scribe-org/Scribe-Android/blob/main/.github/CODE_OF_CONDUCT.md) 16 | required: true 17 | - label: This issue is about one language, and I've changed the title to reflect this 18 | required: true 19 | - type: textarea 20 | id: support 21 | attributes: 22 | label: Language support 23 | placeholder: | 24 | Tell us about the language and how Scribe can help people with it. 25 | Examples: 26 | - The number of noun genders 27 | - How verbs are conjugated 28 | - Preposition-case relationships 29 | - Other grammar rules that are hard 30 | validations: 31 | required: true 32 | - type: textarea 33 | id: keyboard-variant 34 | attributes: 35 | label: Keyboard variants 36 | placeholder: | 37 | Are there any variants in keyboard layout for this language that Scribe should keep in mind? 38 | For instance, French has two notable variants that are used in different countries: 39 | - French QWERTY keyboard used in Canada 40 | - French AZERTY keyboard used in France 41 | validations: 42 | required: true 43 | - type: textarea 44 | id: contribution 45 | attributes: 46 | label: Contribution 47 | placeholder: Let us know if you'd like to help and how :) 48 | validations: 49 | required: false 50 | - type: markdown 51 | attributes: 52 | value: | 53 | Thanks for your interest in adding another Scribe keyboard! 54 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.yml: -------------------------------------------------------------------------------- 1 | name: ❓ Questions and everything else 2 | description: We'd love to hear from you! 3 | projects: ["scribe-org/1"] 4 | body: 5 | - type: checkboxes 6 | id: terms 7 | attributes: 8 | label: Terms 9 | options: 10 | - label: I have searched [open and closed issues](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aissue) 11 | required: true 12 | - label: I agree to follow Scribe-Android's [Code of Conduct](https://github.com/scribe-org/Scribe-Android/blob/main/.github/CODE_OF_CONDUCT.md) 13 | required: true 14 | - type: textarea 15 | id: issue 16 | attributes: 17 | label: Issue 18 | placeholder: Ask a question, start a discussion, create an issue... 19 | validations: 20 | required: true 21 | - type: markdown 22 | attributes: 23 | value: | 24 | Thank you for your contribution! 25 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 4 | 5 | ### Contributor checklist 6 | 7 | 8 | 9 | - [] This pull request is on a [separate branch](https://docs.github.com/en/get-started/quickstart/github-flow) and not the main branch 10 | - [] I have tested my code with the `./gradlew lintKotlin detekt test` command as directed in the [testing section of the contributing guide](https://github.com/scribe-org/Scribe-Android/blob/main/CONTRIBUTING.md#testing) 11 | 12 | --- 13 | 14 | ### Description 15 | 16 | 21 | 22 | ### Related issue 23 | 24 | 25 | 26 | 27 | 28 | - #ISSUE_NUMBER 29 | -------------------------------------------------------------------------------- /.github/composite/prepareApp/action.yml: -------------------------------------------------------------------------------- 1 | name: prepare app 2 | description: checkout and cache dependencies 3 | 4 | runs: 5 | using: "composite" 6 | steps: 7 | - name: Setup JDK environment 8 | uses: actions/setup-java@v4 9 | with: 10 | distribution: "zulu" 11 | java-version: 17 12 | 13 | - name: Cache Gradle 14 | uses: actions/cache@v3 15 | with: 16 | path: | 17 | ~/.gradle/caches 18 | ~/.gradle/wrapper 19 | key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} 20 | restore-keys: | 21 | ${{ runner.os }}-gradle- 22 | 23 | -------------------------------------------------------------------------------- /.github/resources/images/android_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/.github/resources/images/android_preview.png -------------------------------------------------------------------------------- /.github/workflows/pr_ci_license_header_check.yaml: -------------------------------------------------------------------------------- 1 | name: pr_ci_license_header_check 2 | on: 3 | pull_request: 4 | branches: 5 | - main 6 | types: [opened, reopened, synchronize] 7 | 8 | jobs: 9 | license_header_check: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout Repo Content 13 | uses: actions/checkout@v4 14 | 15 | - name: Check License Header 16 | uses: apache/skywalking-eyes/header@main 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS files 2 | ########## 3 | .DS_Store 4 | 5 | # Android Studio files 6 | ###################### 7 | .idea 8 | *.iml 9 | 10 | # Gradle and build files 11 | ######################## 12 | .gradle 13 | local.properties 14 | *.aab 15 | /build 16 | /captures 17 | keystore.jks 18 | keystore.properties 19 | /app/src/proprietary/assets/pesdk_license 20 | /app/src/proprietary/assets/vesdk_license 21 | -------------------------------------------------------------------------------- /.licenserc.yaml: -------------------------------------------------------------------------------- 1 | header: 2 | license: 3 | content: "SPDX-License-Identifier: GPL-3.0-or-later" 4 | paths: 5 | - '**/*.java' 6 | - '**/*.kt' 7 | paths-ignore: 8 | - '**/*.md' 9 | - '**/.git/**' 10 | comment: on-failure 11 | license-location-threshold: 10 12 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/pre-commit/pre-commit-hooks 3 | rev: v4.5.0 4 | hooks: 5 | - id: trailing-whitespace 6 | files: \.kt$ 7 | - id: end-of-file-fixer 8 | files: \.kt$ 9 | - id: check-yaml 10 | 11 | - repo: local 12 | hooks: 13 | - id: formatKotlin 14 | name: formatKotlin 15 | entry: sh -c './gradlew formatKotlin' 16 | language: system 17 | types: [kotlin] 18 | files: \.kt$ 19 | 20 | - id: ktlint 21 | name: ktlint 22 | entry: sh -c './gradlew lintKotlin' 23 | language: system 24 | types: [kotlin] 25 | files: \.kt$ 26 | 27 | - id: detekt 28 | name: detekt 29 | entry: sh -c './gradlew detekt' 30 | language: system 31 | types: [kotlin] 32 | files: \.kt$ 33 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | See the [releases for Scribe-Android](https://github.com/scribe-org/Scribe-Android/releases) for an up to date list of versions and their release dates. Versions that are marked as released may yet to be on Google Play and other stores if it's within the submission review period. 4 | 5 | Scribe-Android tries to follow [semantic versioning](https://semver.org/), a MAJOR.MINOR.PATCH version where increments are made of the: 6 | 7 | - MAJOR version when we make incompatible API changes 8 | - MINOR version when we add functionality in a backwards compatible manner 9 | - PATCH version when we make backwards compatible bug fixes 10 | 11 | Emojis for the following are chosen based on [gitmoji](https://gitmoji.dev/). 12 | 13 | # Scribe-Android 1.0.0 14 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Reporting a Vulnerability 2 | 3 | **If you've found a security vulnerability, please do not open an issue. Please send the team an email at `security@scri.be` with a full description of what you've found. Thank you for helping us keep our users safe!** 4 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/proguard-rules.pro -------------------------------------------------------------------------------- /app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/assets/data-contracts/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "numbers": { "nominativeSingular": "nominativePlural" }, 3 | "genders": { 4 | "canonical": ["gender"], 5 | "feminines": [], 6 | "masculines": [], 7 | "commons": [], 8 | "neuters": [] 9 | }, 10 | "conjugations": { 11 | "1": { 12 | "title": "Präsens", 13 | "1": { "ich": "indicativePresentFirstPersonSingular" }, 14 | "2": { "du": "indicativePresentSecondPersonSingular" }, 15 | "3": { "er/sie/es": "indicativePresentThirdPersonSingular" }, 16 | "4": { "wir": "indicativePresentFirstPersonPlural" }, 17 | "5": { "ihr": "indicativePresentSecondPersonPlural" }, 18 | "6": { "sie/Sie": "indicativePresentThirdPersonPlural" } 19 | }, 20 | "2": { 21 | "title": "Preterite", 22 | "1": { "ich": "indicativePreteriteFirstPersonSingular" }, 23 | "2": { "du": "indicativePreteriteFirstPersonPlural" }, 24 | "3": { "er/sie/es": "indicativePreteriteSecondPersonSingular" }, 25 | "4": { "wir": "indicativePreteriteSecondPersonPlural" }, 26 | "5": { "ihr": "indicativePreteriteThirdPersonSingular" }, 27 | "6": { "sie/Sie": "indicativePreteriteThirdPersonPlural" } 28 | }, 29 | "3": { 30 | "title": "Perfekt", 31 | "1": { "ich": "[auxiliaryVerb] pastParticiple" }, 32 | "2": { "du": "[auxiliaryVerb] pastParticiple" }, 33 | "3": { "er/sie/es": "[auxiliaryVerb] pastParticiple" }, 34 | "4": { "wir": "[auxiliaryVerb] pastParticiple" }, 35 | "5": { "ihr": "[auxiliaryVerb] pastParticiple" }, 36 | "6": { "sie/Sie": "[auxiliaryVerb] pastParticiple" } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/assets/data-contracts/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "numbers": { "singular": "plural" }, 3 | "genders": { 4 | "canonical": ["NOT_INCLUDED"], 5 | "feminines": ["NOT_INCLUDED"], 6 | "masculines": ["NOT_INCLUDED"], 7 | "commons": ["NOT_INCLUDED"], 8 | "neuters": ["NOT_INCLUDED"] 9 | }, 10 | "conjugations": { 11 | "1": { 12 | "title": "Present", 13 | "1": { "I": "simplePresent" }, 14 | "2": { "you": "simplePresent" }, 15 | "3": { "he/she/it": "simplePresentThirdPersonSingular" }, 16 | "4": { "we": "simplePresent" }, 17 | "5": { "you all": "simplePresent" }, 18 | "6": { "they": "simplePresent" } 19 | }, 20 | "2": { 21 | "title": "Past", 22 | "1": { "I": "simplePast" }, 23 | "2": { "you": "simplePast" }, 24 | "3": { "he/she/it": "simplePast" }, 25 | "4": { "we": "simplePast" }, 26 | "5": { "you all": "simplePast" }, 27 | "6": { "they": "simplePast" } 28 | }, 29 | "3": { 30 | "title": "Perfect", 31 | "1": { "I": "presentParticiple simplePast" }, 32 | "2": { "you": "presentParticiple simplePast" }, 33 | "3": { "he/she/it": "presentParticiple simplePast" }, 34 | "4": { "we": "presentParticiple simplePast" }, 35 | "5": { "you all": "presentParticiple simplePast" }, 36 | "6": { "they": "presentParticiple simplePast" } 37 | }, 38 | "4": { 39 | "title": "Past Perfect", 40 | "1": { "I": "pastParticiple simplePast" }, 41 | "2": { "you": "pastParticiple simplePast" }, 42 | "3": { "he/she/it": "pastParticiple simplePast" }, 43 | "4": { "we": "pastParticiple simplePast" }, 44 | "5": { "you all": "pastParticiple simplePast" }, 45 | "6": { "they": "pastParticiple simplePast" } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/assets/data-contracts/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "numbers": { 3 | "feminineSingular": "femininePlural", 4 | "masculineSingular": "masculinePlural" 5 | }, 6 | "genders": { 7 | "canonical": [], 8 | "feminines": ["feminineSingular"], 9 | "masculines": ["masculineSingular"], 10 | "commons": [], 11 | "neuters": [] 12 | }, 13 | "conjugations": { 14 | "1": { 15 | "title": "Presente", 16 | "1": { "yo": "indicativePresentFirstPersonSingular" }, 17 | "2": { "tú": "indicativePresentFirstPersonPlural" }, 18 | "3": { "él/ella/Ud.": "indicativePresentSecondPersonSingular" }, 19 | "4": { "nosotros": "indicativePresentSecondPersonPlural" }, 20 | "5": { "vosotros": "indicativePresentThirdPersonSingular" }, 21 | "6": { "ellos/ellas/Uds.": "indicativePresentThirdPersonPlural" } 22 | }, 23 | "2": { 24 | "title": "Pretérito", 25 | "1": { "yo": "preteriteFirstPersonSingular" }, 26 | "2": { "tú": "preteriteFirstPersonPlural" }, 27 | "3": { "él/ella/Ud.": "preteriteSecondPersonSingular" }, 28 | "4": { "nosotros": "preteriteSecondPersonPlural" }, 29 | "5": { "vosotros": "preteriteThirdPersonSingular" }, 30 | "6": { "ellos/ellas/Uds.": "preteriteThirdPersonPlural" } 31 | }, 32 | "3": { 33 | "title": "Imperfecto", 34 | "1": { "yo": "pastImperfectFirstPersonSingular" }, 35 | "2": { "tú": "pastImperfectFirstPersonPlural" }, 36 | "3": { "él/ella/Ud.": "pastImperfectSecondPersonSingular" }, 37 | "4": { "nosotros": "pastImperfectSecondPersonPlural" }, 38 | "5": { "vosotros": "pastImperfectThirdPersonSingular" }, 39 | "6": { "ellos/ellas/Uds.": "pastImperfectThirdPersonPlural" } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/assets/data-contracts/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "numbers": { "singular": "plural" }, 3 | "genders": { 4 | "canonical": ["gender"], 5 | "feminines": [], 6 | "masculines": [], 7 | "commons": [], 8 | "neuters": [] 9 | }, 10 | "conjugations": { 11 | "1": { 12 | "title": "Presente", 13 | "1": { "io": "presentIndicativeFirstPersonSingular" }, 14 | "2": { "tu": "presentIndicativeFirstPersonPlural" }, 15 | "3": { "lei/lui": "presentIndicativeSecondPersonSingular" }, 16 | "4": { "noi": "presentIndicativeSecondPersonPlural" }, 17 | "5": { "voi": "presentIndicativeThirdPersonSingular" }, 18 | "6": { "loro": "presentIndicativeThirdPersonPlural" } 19 | }, 20 | "2": { 21 | "title": "Preterito", 22 | "1": { "io": "preteriteFirstPersonSingular" }, 23 | "2": { "tu": "preteriteFirstPersonPlural" }, 24 | "3": { "lei/lui": "preteriteSecondPersonSingular" }, 25 | "4": { "noi": "preteriteSecondPersonPlural" }, 26 | "5": { "voi": "preteriteThirdPersonSingular" }, 27 | "6": { "loro": "preteriteThirdPersonPlural" } 28 | }, 29 | "3": { 30 | "title": "Imperfetto", 31 | "1": { "io": "pastImperfectFirstPersonSingular" }, 32 | "2": { "tu": "pastImperfectFirstPersonPlural" }, 33 | "3": { "lei/lui": "pastImperfectSecondPersonSingular" }, 34 | "4": { "noi": "pastImperfectSecondPersonPlural" }, 35 | "5": { "voi": "pastImperfectThirdPersonSingular" }, 36 | "6": { "loro": "pastImperfectThirdPersonPlural" } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/assets/data-contracts/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "numbers": { "nominativeSingular": "nominativePlural" }, 3 | "genders": { 4 | "canonical": ["gender"], 5 | "feminines": [], 6 | "masculines": [], 7 | "commons": [], 8 | "neuters": [] 9 | }, 10 | "conjugations": { 11 | "1": { 12 | "title": "Настоящее", 13 | "1": { "я": "indicativePresentFirstPersonSingular" }, 14 | "2": { "ты": "indicativePresentFirstPersonPlural" }, 15 | "3": { "он/она/оно": "indicativePresentSecondPersonSingular" }, 16 | "4": { "мы": "indicativePresentSecondPersonPlural" }, 17 | "5": { "вы": "indicativePresentThirdPersonSingular" }, 18 | "6": { "они": "indicativePresentThirdPersonPlural" } 19 | }, 20 | "2": { 21 | "title": "Прошедшее", 22 | "1": { "я/ты/она": "feminineIndicativePast" }, 23 | "2": { "я/ты/он": "masculineIndicativePast" }, 24 | "3": { "оно": "neuterIndicativePast" }, 25 | "4": { "мы/вы/они": "indicativePastPlural" } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/assets/data-contracts/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "numbers": { 3 | "nominativeIndefiniteSingular": "nominativeIndefinitePlural", 4 | "nominativeDefiniteSingular": "nominativeDefinitePlural" 5 | }, 6 | "genders": { 7 | "canonical": ["gender"], 8 | "feminines": [], 9 | "masculines": [], 10 | "commons": [], 11 | "neuters": [] 12 | }, 13 | "conjugations": { 14 | "1": { 15 | "title": "Aktiv", 16 | "1": { "": "activeInfinitive" }, 17 | "2": { "": "activePresent" }, 18 | "3": { "": "activePreterite" }, 19 | "4": { "": "activeSupine" } 20 | }, 21 | "2": { 22 | "title": "Passiv", 23 | "1": { "": "passiveInfinitive" }, 24 | "2": { "": "passivePresent" }, 25 | "3": { "": "passivePreterite" }, 26 | "4": { "": "passiveSupine" } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/assets/data/DELanguageData.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/assets/data/DELanguageData.sqlite -------------------------------------------------------------------------------- /app/src/main/assets/data/ENLanguageData.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/assets/data/ENLanguageData.sqlite -------------------------------------------------------------------------------- /app/src/main/assets/data/ESLanguageData.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/assets/data/ESLanguageData.sqlite -------------------------------------------------------------------------------- /app/src/main/assets/data/FRLanguageData.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/assets/data/FRLanguageData.sqlite -------------------------------------------------------------------------------- /app/src/main/assets/data/ITLanguageData.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/assets/data/ITLanguageData.sqlite -------------------------------------------------------------------------------- /app/src/main/assets/data/PTLanguageData.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/assets/data/PTLanguageData.sqlite -------------------------------------------------------------------------------- /app/src/main/assets/data/RULanguageData.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/assets/data/RULanguageData.sqlite -------------------------------------------------------------------------------- /app/src/main/assets/data/SVLanguageData.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/assets/data/SVLanguageData.sqlite -------------------------------------------------------------------------------- /app/src/main/assets/data/TranslationData.sqlite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/assets/data/TranslationData.sqlite -------------------------------------------------------------------------------- /app/src/main/assets/i18n/.github/COC_CONTACT.md: -------------------------------------------------------------------------------- 1 | Issues pertaining to this project's [code of conduct](https://github.com/scribe-org/Scribe-i18n/blob/main/.github/CODE_OF_CONDUCT.md) can be reported to the Scribe team at team@scri.be. 2 | -------------------------------------------------------------------------------- /app/src/main/assets/i18n/.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: 👋 Community discussion channels 4 | url: https://matrix.to/#/#scribe_community:matrix.org 5 | about: Join us in our public Matrix chat rooms! 6 | -------------------------------------------------------------------------------- /app/src/main/assets/i18n/.github/ISSUE_TEMPLATE/localization.yml: -------------------------------------------------------------------------------- 1 | name: 🌐 Localization 2 | description: Report issues or offer help for Scribe localizations. 3 | labels: ["localization"] 4 | projects: ["scribe-org/1"] 5 | body: 6 | - type: checkboxes 7 | id: terms 8 | attributes: 9 | label: Terms 10 | options: 11 | - label: I have searched [open localization issues](https://github.com/scribe-org/Scribe-i18n/issues?q=is%3Aissue+is%3Aopen+label%3Alocalization) 12 | required: true 13 | - label: I agree to follow Scribe-i18n's [Code of Conduct](https://github.com/scribe-org/Scribe-i18n/blob/main/.github/CODE_OF_CONDUCT.md) 14 | required: true 15 | - type: textarea 16 | id: support 17 | attributes: 18 | label: Description 19 | placeholder: | 20 | Tell us where Scribe needs localization support, and let us know if you're able to help! 21 | validations: 22 | required: true 23 | - type: markdown 24 | attributes: 25 | value: | 26 | Thanks for your efforts to bring Scribe to other languages! 27 | -------------------------------------------------------------------------------- /app/src/main/assets/i18n/.github/ISSUE_TEMPLATE/question.yml: -------------------------------------------------------------------------------- 1 | name: ❓ Questions and everything else 2 | description: We'd love to hear from you! 3 | projects: ["scribe-org/1"] 4 | body: 5 | - type: checkboxes 6 | id: terms 7 | attributes: 8 | label: Terms 9 | options: 10 | - label: I have searched [open and closed issues](https://github.com/scribe-org/Scribe-i18n/issues?q=is%3Aissue) 11 | required: true 12 | - label: I agree to follow Scribe-i18n's [Code of Conduct](https://github.com/scribe-org/Scribe-i18n/blob/main/.github/CODE_OF_CONDUCT.md) 13 | required: true 14 | - type: textarea 15 | id: issue 16 | attributes: 17 | label: Issue 18 | placeholder: Ask a question, start a discussion, create an issue... 19 | validations: 20 | required: true 21 | - type: markdown 22 | attributes: 23 | value: | 24 | Thank you for your contribution! 25 | -------------------------------------------------------------------------------- /app/src/main/assets/i18n/.github/workflows/json_conversion.yml: -------------------------------------------------------------------------------- 1 | name: json_conversion 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - "Scribe-i18n/jsons/**.json" 9 | 10 | jobs: 11 | # Run JSON to app strings conversion scripts if needed. 12 | convert_json: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Setup Python 16 | uses: actions/setup-python@v5 17 | with: 18 | python-version: 3.12 19 | - name: Execute scripts to convert JSONs to app files 20 | working-directory: scripts 21 | run: | 22 | python android/convert_jsons_to_strings.py 23 | python ios/convert_jsons_to_xcstrings.py 24 | -------------------------------------------------------------------------------- /app/src/main/assets/i18n/.github/workflows/pr_maintainer_checklist.yaml: -------------------------------------------------------------------------------- 1 | name: pr_maintainer_checklist 2 | on: 3 | pull_request_target: 4 | branches: 5 | - main 6 | types: 7 | - opened 8 | 9 | jobs: 10 | add_pr_checklist: 11 | runs-on: ubuntu-latest 12 | name: Add PR Maintainer Checklist 13 | permissions: 14 | pull-requests: write 15 | steps: 16 | - name: Checkout 17 | uses: actions/checkout@v3 18 | 19 | - name: Comment PR 20 | uses: thollander/actions-comment-pull-request@v2 21 | with: 22 | message: | 23 | ## Thank you for the pull request! 24 | 25 | The Scribe team will do our best to address your contribution as soon as we can. The following is a checklist for maintainers to make sure this process goes as well as possible. Feel free to address the points below yourself in further commits if you realize that actions are needed :) 26 | 27 | If you're not already a member of our [public Matrix community](https://matrix.to/#/#scribe_community:matrix.org), please consider joining! We'd suggest using [Element](https://element.io/) as your Matrix client, and definitely join the General and i18n rooms once you're in. Also consider joining our [bi-weekly Saturday dev syncs](https://etherpad.wikimedia.org/p/scribe-dev-sync). It'd be great to have you! 28 | 29 | - name: First PR Contributor Email Check 30 | id: first_interaction 31 | uses: actions/first-interaction@v1 32 | with: 33 | repo-token: ${{ secrets.GITHUB_TOKEN }} 34 | pr-message: | 35 | ## First PR Commit Check 36 | 37 | - [ ] The commit messages for the remote branch should be checked to make sure the contributor's email is set up correctly so that they receive credit for their contribution 38 | - The contributor's name and icon in remote commits should be the same as what appears in the PR 39 | - If there's a mismatch, the contributor needs to make sure that the [email they use for GitHub](https://github.com/settings/emails) matches what they have for `git config user.email` in their local activist repo 40 | 41 | -------------------------------------------------------------------------------- /app/src/main/assets/i18n/.gitignore: -------------------------------------------------------------------------------- 1 | **/.DS_Store 2 | 3 | venv 4 | .venv 5 | -------------------------------------------------------------------------------- /app/src/main/assets/i18n/Scribe-i18n/jsons/pt.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /app/src/main/assets/i18n/Scribe-i18n/jsons/ru.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /app/src/main/assets/i18n/Scribe-i18n/values/pt/string.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/assets/i18n/Scribe-i18n/values/ru/string.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/be/scri/extensions/CommonsContext.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.extensions 4 | 5 | import android.content.Context 6 | import be.scri.helpers.BaseConfig 7 | import be.scri.helpers.PREFS_KEY 8 | 9 | /** 10 | * Retrieves the shared preferences using the predefined PREFS_KEY. 11 | * 12 | * @receiver Context used to access shared preferences 13 | * @return SharedPreferences instance 14 | */ 15 | fun Context.getSharedPrefs() = getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE) 16 | 17 | /** 18 | * Provides an instance of BaseConfig associated with the context. 19 | * 20 | * @receiver Context used to create BaseConfig instance 21 | * @return BaseConfig instance 22 | */ 23 | val Context.baseConfig: BaseConfig get() = BaseConfig.newInstance(this) 24 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/extensions/Context.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.extensions 4 | 5 | import android.content.Context 6 | import android.graphics.Color 7 | import be.scri.R 8 | import be.scri.helpers.Config 9 | 10 | /** 11 | * Lazily retrieves the [Config] object scoped to the application context. 12 | */ 13 | val Context.config: Config get() = Config.newInstance(applicationContext) 14 | 15 | /** 16 | * Determines the stroke color based on the current theme and user preferences. 17 | * 18 | * @return A color integer suitable for use in outlining UI elements. 19 | */ 20 | fun Context.getStrokeColor(): Int = 21 | if (config.isUsingSystemTheme) { 22 | if (isUsingSystemDarkTheme()) { 23 | resources.getColor(R.color.md_grey_800, theme) 24 | } else { 25 | resources.getColor(R.color.md_grey_400, theme) 26 | } 27 | } else { 28 | val lighterColor = getProperBackgroundColor().lightenColor() 29 | if (lighterColor == Color.WHITE || lighterColor == Color.BLACK) { 30 | resources.getColor(R.color.divider_grey, theme) 31 | } else { 32 | lighterColor 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/extensions/Drawable.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.extensions 4 | 5 | import android.graphics.PorterDuff 6 | import android.graphics.drawable.Drawable 7 | 8 | /** 9 | * Applies a color filter to the drawable using the specified color. 10 | * 11 | * @param color The color to apply using the SRC_IN mode. 12 | * @return The mutated [Drawable] with the color filter applied. 13 | */ 14 | fun Drawable.applyColorFilter(color: Int) = mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN) 15 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/extensions/View.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.extensions 4 | 5 | import android.view.HapticFeedbackConstants 6 | import android.view.View 7 | 8 | /** 9 | * Sets the view's visibility to VISIBLE if [beVisible] is true; otherwise, sets it to GONE. 10 | * 11 | * @receiver View to update visibility 12 | * @param beVisible Boolean flag indicating whether the view should be visible 13 | */ 14 | fun View.beVisibleIf(beVisible: Boolean) = if (beVisible) beVisible() else beGone() 15 | 16 | /** 17 | * Sets the view's visibility to GONE if [beGone] is true; otherwise, sets it to VISIBLE. 18 | * 19 | * @receiver View to update visibility 20 | * @param beGone Boolean flag indicating whether the view should be gone 21 | */ 22 | fun View.beGoneIf(beGone: Boolean) = beVisibleIf(!beGone) 23 | 24 | /** 25 | * Sets the view's visibility to VISIBLE. 26 | * 27 | * @receiver View to make visible 28 | */ 29 | fun View.beVisible() { 30 | visibility = View.VISIBLE 31 | } 32 | 33 | /** 34 | * Sets the view's visibility to GONE. 35 | * 36 | * @receiver View to make gone 37 | */ 38 | fun View.beGone() { 39 | visibility = View.GONE 40 | } 41 | 42 | /** 43 | * Performs haptic feedback using the VIRTUAL_KEY feedback type. 44 | * 45 | * @receiver View on which to perform haptic feedback 46 | */ 47 | fun View.performHapticFeedback() = performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY) 48 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/helpers/CommonsConstants.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.helpers 4 | 5 | /** 6 | * Constants that are used throughout helper classes and objects. 7 | */ 8 | val DARK_GREY = 0xFF333333.toInt() 9 | 10 | // Shared preferences. 11 | const val PREFS_KEY = "Prefs" 12 | const val TEXT_COLOR = "text_color" 13 | const val KEY_COLOR = "key_color" 14 | const val BACKGROUND_COLOR = "background_color" 15 | const val PRIMARY_COLOR = "primary_color_2" 16 | const val ACCENT_COLOR = "accent_color" 17 | const val USE_ENGLISH = "use_english" 18 | const val WAS_USE_ENGLISH_TOGGLED = "was_use_english_toggled" 19 | const val IS_USING_SYSTEM_THEME = "is_using_system_theme" 20 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/helpers/Config.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.helpers 4 | 5 | import android.content.Context 6 | 7 | /** 8 | * A class that extends [BaseConfig] to manage additional app settings. 9 | *

10 | * This class provides access to user preferences related to input behavior and theme settings. 11 | *

12 | * 13 | * @param context The application context used to access resources and shared preferences. 14 | */ 15 | class Config( 16 | context: Context, 17 | ) : BaseConfig(context) { 18 | /** 19 | * Function for creating new instances of the class. 20 | */ 21 | companion object { 22 | /** 23 | * Creates a new instance of `Config`. 24 | * 25 | * @param context The application context. 26 | * @return A new instance of `Config`. 27 | */ 28 | fun newInstance(context: Context) = Config(context) 29 | } 30 | 31 | var vibrateOnKeypress: Boolean 32 | get() = prefs.getBoolean(VIBRATE_ON_KEYPRESS, true) 33 | set(vibrateOnKeypress) = prefs.edit().putBoolean(VIBRATE_ON_KEYPRESS, vibrateOnKeypress).apply() 34 | 35 | var showPopupOnKeypress: Boolean 36 | get() = prefs.getBoolean(SHOW_POPUP_ON_KEYPRESS, true) 37 | set(showPopupOnKeypress) = prefs.edit().putBoolean(SHOW_POPUP_ON_KEYPRESS, showPopupOnKeypress).apply() 38 | 39 | var darkTheme: Boolean 40 | get() = prefs.getBoolean(DARK_THEME, true) 41 | set(darkTheme) = prefs.edit().putBoolean(DARK_THEME, darkTheme).apply() 42 | 43 | var periodOnDoubleTap: Boolean 44 | get() = prefs.getBoolean(PERIOD_ON_DOUBLE_TAP, true) 45 | set(periodOnDoubleTap) = prefs.edit().putBoolean(PERIOD_ON_DOUBLE_TAP, periodOnDoubleTap).apply() 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/helpers/Constants.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.helpers 4 | 5 | /** 6 | * Constants that are used throughout helper classes and objects. 7 | */ 8 | const val SHIFT_OFF = 0 9 | const val SHIFT_ON_ONE_CHAR = 1 10 | const val SHIFT_ON_PERMANENT = 2 11 | 12 | // Limit the count of alternative characters that show up at long pressing a key. 13 | const val MAX_KEYS_PER_MINI_ROW = 9 14 | 15 | // Shared preferences. 16 | const val VIBRATE_ON_KEYPRESS = "vibrate_on_keypress" 17 | const val SHOW_POPUP_ON_KEYPRESS = "show_popup_on_keypress" 18 | const val DARK_THEME = "dark_theme" 19 | const val PERIOD_ON_DOUBLE_TAP = "period_on_double_tap" 20 | const val PERIOD_AND_COMMA = "period_and_comma" 21 | const val DISABLE_ACCENT_CHARACTER = "disable_accent_character" 22 | const val EMOJI_SUGGESTIONS = "emoji_suggestions" 23 | const val TRANSLATION_SOURCE = "translation_source" 24 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/helpers/DatabaseFileManager.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.helpers 4 | 5 | import android.content.Context 6 | import android.util.Log 7 | import java.io.FileOutputStream 8 | 9 | /** 10 | * A helper class to facilitate loading and managing database files for different languages in the Scribe keyboard. 11 | * This class is responsible for loading language-specific SQLite database files from assets into the app's 12 | * internal storage. 13 | * 14 | * @param context The context used to access the app's resources and file system. 15 | */ 16 | class DatabaseFileManager( 17 | private val context: Context, 18 | ) { 19 | /** 20 | * Loads a database file for a specific language. 21 | *

22 | * The method checks if the database file for the given language already exists in the app's internal 23 | * storage. If it doesn't exist, it copies the corresponding database file from the assets folder to the 24 | * internal storage. 25 | *

26 | * 27 | * @param language The language for which the database file is being loaded. 28 | */ 29 | fun loadDatabaseFile(language: String) { 30 | val databaseName = "${language}LanguageData.sqlite" 31 | val dbFile = context.getDatabasePath(databaseName) 32 | Log.i("ALPHA", "Loaded Database") 33 | 34 | if (!dbFile.exists()) { 35 | context.assets.open("data/$databaseName").use { inputStream -> 36 | FileOutputStream(dbFile).use { outputStream -> 37 | inputStream.copyTo(outputStream) 38 | outputStream.flush() 39 | } 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/helpers/DatabaseManagers.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.helpers 4 | 5 | import ContractDataLoader 6 | import EmojiDataManager 7 | import GenderDataManager 8 | import PluralFormsManager 9 | import android.content.Context 10 | import be.scri.helpers.keyboardDBHelper.PrepositionDataManager 11 | import be.scri.helpers.keyboardDBHelper.TranslationDataManager 12 | 13 | /** 14 | * A helper class that manages various database-related operations 15 | * and data managers for the Scribe keyboard. 16 | * This class provides access to all the necessary managers that interact 17 | * with the database for different features such as contracts, emojis, gender 18 | * data, plural forms, and prepositions. 19 | * 20 | * @param context The context used to access the app's resources and database. 21 | */ 22 | class DatabaseManagers( 23 | context: Context, 24 | ) { 25 | val fileManager = DatabaseFileManager(context) 26 | val contractLoader = ContractDataLoader(context) 27 | val emojiManager = EmojiDataManager(context) 28 | val genderManager = GenderDataManager(context) 29 | val pluralManager = PluralFormsManager(context) 30 | val prepositionManager = PrepositionDataManager(context) 31 | val translationDataManager = TranslationDataManager(context) 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/helpers/italian/ITInterfaceVariables.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.helpers.italian 4 | 5 | /** 6 | * Interface variables for Italian language keyboards. 7 | */ 8 | object ITInterfaceVariables { 9 | // MARK: Currency Symbols 10 | 11 | const val CURRENCY_SYMBOL = "€" 12 | val CURRENCY_SYMBOL_ALTERNATES = listOf("€", "$", "£", "¥", "₩", "¢") 13 | 14 | // MARK: Keyboard Labels 15 | 16 | const val SPACE_BAR = "spazio" 17 | const val LANGUAGE = "Italiano" 18 | const val INVALID_COMMAND_MSG = "Non in Wikidata" 19 | val BASE_AUTOSUGGESTIONS = listOf("ho", "non", "ma") 20 | val NUMERIC_AUTOSUGGESTIONS = listOf("utenti", "anni", "e") 21 | 22 | // MARK: Translate Command 23 | 24 | const val TRANSLATE_KEY_LBL = "Tradurre" 25 | const val TRANSLATE_PLACEHOLDER = "Inserisci una parola" 26 | const val TRANSLATE_PROMPT = "it -› targetLanguage()" 27 | const val TRANSLATE_PROMPT_AND_CURSOR = TRANSLATE_PROMPT + "COMMAND_CURSOR" 28 | const val TRANSLATE_PROMPT_AND_PLACEHOLDER = TRANSLATE_PROMPT_AND_CURSOR + "$TRANSLATE_PLACEHOLDER" 29 | 30 | // MARK: Conjugate Command 31 | 32 | const val CONJUGATE_KEY_LBL = "Coniugare" 33 | const val CONJUGATE_PLACEHOLDER = "Inserisci un verbo" 34 | const val CONJUGATE_PROMPT = "Coniugare: " 35 | const val CONJUGATE_PROMPT_AND_CURSOR = CONJUGATE_PROMPT + "COMMAND_CURSOR" 36 | const val CONJUGATE_PROMPT_AND_PLACEHOLDER = CONJUGATE_PROMPT_AND_CURSOR + "$CONJUGATE_PLACEHOLDER" 37 | 38 | // MARK: Plural Command 39 | 40 | const val PLURAL_KEY_LBL = "Plurale" 41 | const val PLURAL_PLACEHOLDER = "Inserisci un nome" 42 | const val PLURAL_PROMPT = "Plurale: " 43 | const val PLURAL_PROMPT_AND_CURSOR = PLURAL_PROMPT + "COMMAND_CURSOR" 44 | const val PLURAL_PROMPT_AND_PLACEHOLDER = PLURAL_PROMPT_AND_CURSOR + "$PLURAL_PLACEHOLDER" 45 | const val ALREADY_PLURAL_MSG = "Già plurale" 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/helpers/keyboardDBHelper/ContractDataLoader.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | import android.content.Context 4 | import android.util.Log 5 | import kotlinx.serialization.json.Json 6 | import java.io.IOException 7 | 8 | /** 9 | * A helper class to load and deserialize contract data from assets based on the specified language. 10 | */ 11 | class ContractDataLoader( 12 | private val context: Context, 13 | ) { 14 | /** 15 | * Loads a data contract JSON file from the assets based on the given language. 16 | * The file is expected to be located in the `assets/data-contracts` directory and named as `.json`. 17 | * 18 | * @param language the language for which to load the data contract (e.g., "en", "fr") 19 | * @return the decoded [DataContract] object if successful; null otherwise 20 | */ 21 | fun loadContract(language: String): DataContract? { 22 | val contractName = "${language.lowercase()}.json" 23 | Log.i("ALPHA", "This is the $language") 24 | 25 | return try { 26 | val json = Json { ignoreUnknownKeys = true } 27 | context.assets.open("data-contracts/$contractName").use { contractFile -> 28 | val content = contractFile.bufferedReader().readText() 29 | Log.i("ALPHA", content) 30 | json.decodeFromString(content).also { 31 | Log.i("MY-TAG", it.toString()) 32 | } 33 | } 34 | } catch (e: IOException) { 35 | Log.e("MY-TAG", "Error loading contract: $contractName", e) 36 | null 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/helpers/portuguese/PTInterfaceVariables.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.helpers.portuguese 4 | 5 | /** 6 | * Interface variables for Portuguese language keyboards. 7 | */ 8 | object PTInterfaceVariables { 9 | // MARK: Currency Symbols 10 | 11 | const val CURRENCY_SYMBOL = "$" 12 | val CURRENCY_SYMBOL_ALTERNATES = listOf("$", "€", "£", "¥", "₩", "¢") 13 | 14 | // MARK: Keyboard Labels 15 | 16 | const val SPACE_BAR = "espaço" 17 | const val LANGUAGE = "Português" 18 | const val INVALID_COMMAND_MSG = "Não está no Wikidata" 19 | val BASE_AUTOSUGGESTIONS = listOf("o", "a", "eu") 20 | val NUMERIC_AUTOSUGGESTIONS = listOf("de", "que", "a") 21 | 22 | // MARK: Translate Command 23 | 24 | const val TRANSLATE_KEY_LBL = "Traduzir" 25 | const val TRANSLATE_PLACEHOLDER = "Digite uma palavra" 26 | const val TRANSLATE_PROMPT = "pt -› targetLanguage()" 27 | const val TRANSLATE_PROMPT_AND_CURSOR = TRANSLATE_PROMPT + "COMMAND_CURSOR" 28 | const val TRANSLATE_PROMPT_AND_PLACEHOLDER = TRANSLATE_PROMPT_AND_CURSOR + "$TRANSLATE_PLACEHOLDER" 29 | 30 | // MARK: Conjugate Command 31 | 32 | const val CONJUGATE_KEY_LBL = "Conjugar" 33 | const val CONJUGATE_PLACEHOLDER = "Digite um verbo" 34 | const val CONJUGATE_PROMPT = "Conjugar: " 35 | const val CONJUGATE_PROMPT_AND_CURSOR = CONJUGATE_PROMPT + "COMMAND_CURSOR" 36 | const val CONJUGATE_PROMPT_AND_PLACEHOLDER = CONJUGATE_PROMPT_AND_CURSOR + "$CONJUGATE_PLACEHOLDER" 37 | 38 | // MARK: Plural Command 39 | 40 | const val PLURAL_KEY_LBL = "Plural" 41 | const val PLURAL_PLACEHOLDER = "Digite um substantivo" 42 | const val PLURAL_PROMPT = "Plural: " 43 | const val PLURAL_PROMPT_AND_CURSOR = PLURAL_PROMPT + "COMMAND_CURSOR" 44 | const val PLURAL_PROMPT_AND_PLACEHOLDER = PLURAL_PROMPT_AND_CURSOR + "$PLURAL_PLACEHOLDER" 45 | const val ALREADY_PLURAL_MSG = "Já plural" 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/helpers/russian/RUInterfaceVariables.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.helpers.russian 4 | 5 | /** 6 | * Interface variables for Russian language keyboards. 7 | */ 8 | object RUInterfaceVariables { 9 | // MARK: Currency Symbols 10 | 11 | const val CURRENCY_SYMBOL = "₽" 12 | val CURRENCY_SYMBOL_ALTERNATES = listOf("₽", "$", "€", "£", "¥") 13 | 14 | // MARK: Keyboard Labels 15 | 16 | const val SPACE_BAR = "Пробел" 17 | const val LANGUAGE = "Pусский" 18 | const val INVALID_COMMAND_MSG = "Нет в Викиданных" 19 | val BASE_AUTOSUGGESTIONS = listOf("я", "а", "в") 20 | val NUMERIC_AUTOSUGGESTIONS = listOf("в", "и", "я") 21 | 22 | // MARK: Translate Command 23 | 24 | const val TRANSLATE_KEY_LBL = "Перевести" 25 | const val TRANSLATE_PLACEHOLDER = "Введите слово" 26 | const val TRANSLATE_PROMPT = "ru -› targetLanguage()" 27 | const val TRANSLATE_PROMPT_AND_CURSOR = TRANSLATE_PROMPT + "COMMAND_CURSOR" 28 | const val TRANSLATE_PROMPT_AND_PLACEHOLDER = TRANSLATE_PROMPT_AND_CURSOR + "$TRANSLATE_PLACEHOLDER" 29 | 30 | // MARK: Conjugate Command 31 | 32 | const val CONJUGATE_KEY_LBL = "Спрягать" 33 | const val CONJUGATE_PLACEHOLDER = "Введите глагол" 34 | const val CONJUGATE_PROMPT = "Спрягать: " 35 | const val CONJUGATE_PROMPT_AND_CURSOR = CONJUGATE_PROMPT + "COMMAND_CURSOR" 36 | const val CONJUGATE_PROMPT_AND_PLACEHOLDER = CONJUGATE_PROMPT_AND_CURSOR + "$CONJUGATE_PLACEHOLDER" 37 | 38 | // MARK: Plural Command 39 | 40 | const val PLURAL_KEY_LBL = "Множ-ое" 41 | const val PLURAL_PLACEHOLDER = "Введите существительное" 42 | const val PLURAL_PROMPT = "Множ-ое: " 43 | const val PLURAL_PROMPT_AND_CURSOR = PLURAL_PROMPT + "COMMAND_CURSOR" 44 | const val PLURAL_PROMPT_AND_PLACEHOLDER = PLURAL_PROMPT_AND_CURSOR + "$PLURAL_PLACEHOLDER" 45 | const val ALREADY_PLURAL_MSG = "Уже во множ-ом" 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/helpers/swedish/SVInterfaceVariables.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.helpers.swedish 4 | 5 | /** 6 | * Interface variables for Swedish language keyboards. 7 | */ 8 | object SVInterfaceVariables { 9 | // MARK: Currency Symbols 10 | 11 | const val CURRENCY_SYMBOL = "kr" 12 | val CURRENCY_SYMBOL_ALTERNATES = listOf("kr", "$", "€", "£", "¥") 13 | 14 | // MARK: Keyboard Labels 15 | 16 | const val SPACE_BAR = "mellanslag" 17 | const val LANGUAGE = "Svenska" 18 | const val INVALID_COMMAND_MSG = "Inte i Wikidata" 19 | val BASE_AUTOSUGGESTIONS = listOf("jag", "det", "men") 20 | val NUMERIC_AUTOSUGGESTIONS = listOf("jag", "det", "och") 21 | 22 | // MARK: Translate Command 23 | 24 | const val TRANSLATE_KEY_LBL = "Översätt" 25 | const val TRANSLATE_PLACEHOLDER = "Ange ett ord" 26 | const val TRANSLATE_PROMPT = "sv -› targetLanguage()" 27 | const val TRANSLATE_PROMPT_AND_CURSOR = TRANSLATE_PROMPT + "COMMAND_CURSOR" 28 | const val TRANSLATE_PROMPT_AND_PLACEHOLDER = TRANSLATE_PROMPT_AND_CURSOR + "$TRANSLATE_PLACEHOLDER" 29 | 30 | // MARK: Conjugate Command 31 | 32 | const val CONJUGATE_KEY_LBL = "Konjugera" 33 | const val CONJUGATE_PLACEHOLDER = "Ange ett verb" 34 | const val CONJUGATE_PROMPT = "Konjugera: " 35 | const val CONJUGATE_PROMPT_AND_CURSOR = CONJUGATE_PROMPT + "COMMAND_CURSOR" 36 | const val CONJUGATE_PROMPT_AND_PLACEHOLDER = CONJUGATE_PROMPT_AND_CURSOR + "$CONJUGATE_PLACEHOLDER" 37 | 38 | // MARK: Plural Command 39 | 40 | const val PLURAL_KEY_LBL = "Plural" 41 | const val PLURAL_PLACEHOLDER = "Ange ett substantiv" 42 | const val PLURAL_PROMPT = "Plural: " 43 | const val PLURAL_PROMPT_AND_CURSOR = PLURAL_PROMPT + "COMMAND_CURSOR" 44 | const val PLURAL_PROMPT_AND_PLACEHOLDER = PLURAL_PROMPT_AND_CURSOR + "$PLURAL_PLACEHOLDER" 45 | const val ALREADY_PLURAL_MSG = "Redan plural" 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/models/DataContract.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | @file:Suppress("ktlint:standard:kdoc") 3 | /** 4 | * Data structure to hold various linguistic data for the Scribe keyboard. 5 | * 6 | * This includes information such as gender classifications, verb conjugations, and number representations 7 | * for different languages, allowing for processing of language-specific grammar rules. 8 | */ 9 | 10 | import kotlinx.serialization.SerialName 11 | import kotlinx.serialization.Serializable 12 | 13 | /** 14 | * Holds language-specific linguistic data used by the Scribe keyboard, such as number representations, 15 | * gender categories, and verb conjugation forms. 16 | */ 17 | @Serializable 18 | data class DataContract( 19 | val numbers: Map, 20 | val genders: Genders, 21 | val conjugations: Map, 22 | ) 23 | 24 | /** 25 | * Represents different grammatical gender groupings. 26 | */ 27 | @Serializable 28 | data class Genders( 29 | val canonical: List, 30 | val feminines: List, 31 | val masculines: List, 32 | val commons: List, 33 | val neuters: List, 34 | ) 35 | 36 | /** 37 | * Represents verb conjugations by person (1st, 2nd, 3rd) and number (singular/plural). 38 | */ 39 | @Serializable 40 | data class Conjugation( 41 | val title: String = "", 42 | @SerialName("1") val firstPerson: Map? = null, 43 | @SerialName("2") val secondPerson: Map? = null, 44 | @SerialName("3") val thirdPersonSingular: Map? = null, 45 | @SerialName("4") val firstPersonPlural: Map? = null, 46 | @SerialName("5") val secondPersonPlural: Map? = null, 47 | @SerialName("6") val thirdPersonPlural: Map? = null, 48 | ) 49 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/models/ItemsViewModel.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | @file:Suppress("ktlint:standard:kdoc") 3 | /** 4 | * The item view model class used in the application. 5 | */ 6 | 7 | package be.scri.models 8 | 9 | import android.app.Activity 10 | import androidx.annotation.StringRes 11 | 12 | /** 13 | * ViewModel representing an item with optional actions and associated resources like images and URLs. 14 | */ 15 | data class ItemsViewModel( 16 | val image: Int, 17 | val text: Text, 18 | val image2: Int, 19 | val url: String? = null, 20 | val activity: Class? = null, 21 | val action: (() -> Unit)? = null, 22 | ) : Item() { 23 | /** 24 | * ViewModel representing an item with optional actions and associated resources like images and URLs. 25 | */ 26 | class Text( 27 | @StringRes 28 | val resId: Int, 29 | vararg val formatArgs: Any, 30 | ) 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/models/SwitchItem.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | @file:Suppress("ktlint:standard:kdoc") 3 | /** 4 | * The switch item model class used in the application. 5 | */ 6 | 7 | package be.scri.models 8 | 9 | /** 10 | * Base class for defining UI items in the application. 11 | */ 12 | sealed class Item 13 | 14 | /** 15 | * Model representing a switch-based item with optional actions. 16 | */ 17 | data class SwitchItem( 18 | val title: String, 19 | val description: String? = null, 20 | var isChecked: Boolean, 21 | val action: (() -> Unit)? = null, 22 | val action2: (() -> Unit)? = null, 23 | ) : Item() 24 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/models/TextItem.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | @file:Suppress("ktlint:standard:kdoc") 3 | /** 4 | * The text item model class used in the application. 5 | */ 6 | 7 | package be.scri.models 8 | 9 | import androidx.fragment.app.Fragment 10 | 11 | /** 12 | * Model for a text-based item in the UI with optional action and navigation fragment. 13 | */ 14 | data class TextItem( 15 | val text: Int, 16 | val image: Int, 17 | val description: String? = null, 18 | val action: (() -> Unit)? = null, 19 | val language: String? = null, 20 | val fragment: Fragment? = null, 21 | val fragmentTag: String? = null, 22 | ) : Item() 23 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/navigation/Screen.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.navigation 4 | 5 | /** 6 | * Defines the navigation destinations (screens) used within the app. 7 | * Each screen has a unique [route] string used for navigation. 8 | */ 9 | sealed class Screen( 10 | val route: String, 11 | ) { 12 | /** 13 | * Screen for the initial installation or setup process. 14 | */ 15 | data object Installation : Screen("installation_screen") 16 | 17 | /** 18 | * Screen where the user can configure general app settings. 19 | */ 20 | data object Settings : Screen("settings_screen") 21 | 22 | /** 23 | * Screen for changing language specific keyboard settings. 24 | */ 25 | data object LanguageSettings : Screen("language_settings_screen") 26 | 27 | /** 28 | * Screen displaying information about the app. 29 | */ 30 | data object About : Screen("about_screen") 31 | 32 | /** 33 | * Screen showing the app's privacy policy. 34 | */ 35 | data object PrivacyPolicy : Screen("privacy_policy_screen") 36 | 37 | /** 38 | * Screen showing the relationship between Wikimedia and Scribe 39 | */ 40 | data object WikimediaScribe : Screen("wikimedia_scribe_screen") 41 | 42 | /** 43 | * Screen containing the third party codes used in the application. 44 | */ 45 | data object ThirdParty : Screen("third_party_screen") 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/ui/common/ScribeBaseScreen.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.ui.common 4 | 5 | import android.annotation.SuppressLint 6 | import androidx.compose.foundation.layout.Column 7 | import androidx.compose.foundation.layout.fillMaxSize 8 | import androidx.compose.foundation.layout.padding 9 | import androidx.compose.material3.MaterialTheme 10 | import androidx.compose.material3.Scaffold 11 | import androidx.compose.runtime.Composable 12 | import androidx.compose.ui.Modifier 13 | import androidx.compose.ui.unit.dp 14 | import be.scri.ui.common.appcomponents.ActionBar 15 | import be.scri.ui.common.appcomponents.PageTitle 16 | 17 | /** 18 | * The base composable for all the screens. 19 | */ 20 | @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") 21 | @Composable 22 | fun ScribeBaseScreen( 23 | modifier: Modifier = Modifier, 24 | pageTitle: String? = null, 25 | lastPage: String? = null, 26 | onBackNavigation: () -> Unit = {}, 27 | content: @Composable () -> Unit, 28 | ) { 29 | Scaffold( 30 | modifier = 31 | modifier 32 | .fillMaxSize() 33 | .padding(top = 8.dp), 34 | containerColor = MaterialTheme.colorScheme.background, 35 | ) { 36 | Column( 37 | modifier = Modifier.fillMaxSize(), 38 | ) { 39 | if (lastPage != null) { 40 | ActionBar( 41 | title = lastPage, 42 | onClickAction = onBackNavigation, 43 | modifier = Modifier, 44 | ) 45 | } 46 | 47 | if (pageTitle != null) { 48 | PageTitle( 49 | pageTitle = pageTitle, 50 | modifier = 51 | Modifier 52 | .padding(horizontal = 16.dp), 53 | ) 54 | } 55 | 56 | content() 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/ui/common/appcomponents/ActionBar.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.ui.common.appcomponents 4 | 5 | import androidx.compose.foundation.layout.Arrangement 6 | import androidx.compose.foundation.layout.Row 7 | import androidx.compose.foundation.layout.fillMaxWidth 8 | import androidx.compose.material3.Icon 9 | import androidx.compose.material3.IconButton 10 | import androidx.compose.material3.MaterialTheme 11 | import androidx.compose.material3.Text 12 | import androidx.compose.runtime.Composable 13 | import androidx.compose.ui.Alignment 14 | import androidx.compose.ui.Modifier 15 | import androidx.compose.ui.res.painterResource 16 | import androidx.compose.ui.text.font.FontWeight 17 | import androidx.compose.ui.unit.dp 18 | import androidx.compose.ui.unit.sp 19 | import be.scri.R 20 | 21 | /** 22 | * A reusable action bar component that displays a back button icon 23 | * and a title text in a horizontal row. 24 | * 25 | * @param title The title displayed next to the back button. 26 | * @param onClickAction Lambda function triggered when the back button is clicked. 27 | * @param modifier Optional [Modifier] for styling and layout customization. 28 | */ 29 | @Composable 30 | fun ActionBar( 31 | title: String, 32 | onClickAction: () -> Unit, 33 | modifier: Modifier = Modifier, 34 | ) { 35 | Row( 36 | modifier = 37 | modifier 38 | .fillMaxWidth(), 39 | verticalAlignment = Alignment.CenterVertically, 40 | horizontalArrangement = Arrangement.spacedBy(2.dp), 41 | ) { 42 | IconButton( 43 | onClick = { onClickAction() }, 44 | ) { 45 | Icon( 46 | painter = painterResource(R.drawable.chevron), 47 | tint = MaterialTheme.colorScheme.onBackground, 48 | contentDescription = "Back button", 49 | ) 50 | } 51 | Text( 52 | text = title, 53 | fontSize = 16.sp, 54 | color = MaterialTheme.colorScheme.onBackground, 55 | style = MaterialTheme.typography.bodyMedium, 56 | fontWeight = FontWeight.Bold, 57 | ) 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/ui/common/appcomponents/PageTitle.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.ui.common.appcomponents 4 | 5 | import androidx.compose.material3.MaterialTheme 6 | import androidx.compose.material3.Text 7 | import androidx.compose.runtime.Composable 8 | import androidx.compose.ui.Modifier 9 | import androidx.compose.ui.text.TextStyle 10 | import androidx.compose.ui.text.font.FontWeight 11 | import be.scri.ui.theme.ScribeTypography 12 | 13 | /** 14 | * A composable function that displays a styled page title. 15 | * 16 | * @param pageTitle The title text to display 17 | * @param modifier An optional [Modifier] used to customize the layout and styling. 18 | */ 19 | @Composable 20 | fun PageTitle( 21 | pageTitle: String, 22 | modifier: Modifier = Modifier, 23 | ) { 24 | Text( 25 | text = pageTitle, 26 | fontSize = ScribeTypography.headlineLarge.fontSize, 27 | style = 28 | TextStyle.Default.copy( 29 | fontStyle = ScribeTypography.headlineMedium.fontStyle, 30 | fontWeight = FontWeight.Bold, 31 | color = MaterialTheme.colorScheme.onBackground, 32 | ), 33 | modifier = modifier, 34 | ) 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/ui/common/bottombar/BottomBarScreen.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.ui.common.bottombar 4 | 5 | import androidx.annotation.DrawableRes 6 | import be.scri.R 7 | import be.scri.navigation.Screen 8 | 9 | /** 10 | * Provides items to the navigation bar. 11 | */ 12 | sealed class BottomBarScreen( 13 | val route: String, 14 | @DrawableRes val icon: Int, 15 | val label: String, 16 | ) { 17 | /** 18 | * Represents the Installation screen and its associated route. 19 | */ 20 | data object Installation : BottomBarScreen( 21 | Screen.Installation.route, 22 | R.drawable.material_keyboard, 23 | "Installation", 24 | ) 25 | 26 | /** 27 | * Represents the Settings screen and its associated route. 28 | */ 29 | data object Settings : BottomBarScreen( 30 | Screen.Settings.route, 31 | R.drawable.material_settings, 32 | "Settings", 33 | ) 34 | 35 | /** 36 | * Represents the About screen and its associated route. 37 | */ 38 | data object About : BottomBarScreen( 39 | Screen.About.route, 40 | R.drawable.material_info, 41 | "About", 42 | ) 43 | } 44 | 45 | val bottomBarScreens = 46 | listOf( 47 | BottomBarScreen.Installation, 48 | BottomBarScreen.Settings, 49 | BottomBarScreen.About, 50 | ) 51 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/ui/common/components/ItemCardContainerWithTitle.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.ui.common.components 4 | 5 | import androidx.compose.foundation.layout.Column 6 | import androidx.compose.foundation.layout.fillMaxWidth 7 | import androidx.compose.foundation.layout.padding 8 | import androidx.compose.material3.MaterialTheme 9 | import androidx.compose.material3.Text 10 | import androidx.compose.runtime.Composable 11 | import androidx.compose.ui.Modifier 12 | import androidx.compose.ui.text.font.FontWeight 13 | import androidx.compose.ui.unit.dp 14 | import androidx.compose.ui.unit.sp 15 | import be.scri.ui.models.ScribeItemList 16 | 17 | /** 18 | * A composable function that displays a title above a list of items inside a card container. 19 | */ 20 | @Composable 21 | fun ItemCardContainerWithTitle( 22 | title: String, 23 | cardItemsList: ScribeItemList, 24 | modifier: Modifier = Modifier, 25 | isDivider: Boolean = false, 26 | ) { 27 | Column( 28 | modifier = modifier, 29 | ) { 30 | Text( 31 | text = title, 32 | color = MaterialTheme.colorScheme.onBackground, 33 | fontWeight = FontWeight.Bold, 34 | fontSize = 22.sp, 35 | modifier = 36 | Modifier.padding( 37 | start = 16.dp, 38 | top = 16.dp, 39 | bottom = 10.dp, 40 | ), 41 | ) 42 | 43 | ItemsCardContainer( 44 | cardItemsList = cardItemsList, 45 | isDivider = isDivider, 46 | modifier = 47 | Modifier 48 | .fillMaxWidth() 49 | .padding(horizontal = 12.dp), 50 | ) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/ui/models/ScribeItemList.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.ui.models 4 | 5 | import androidx.compose.runtime.Immutable 6 | 7 | /** 8 | * A class defining lists of ScribeItem elements. 9 | */ 10 | @Immutable 11 | data class ScribeItemList( 12 | val items: List, 13 | ) 14 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/ui/screens/settings/SettingsViewModelFactory.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.ui.screens.settings 4 | 5 | import android.content.Context 6 | import androidx.lifecycle.ViewModel 7 | import androidx.lifecycle.ViewModelProvider 8 | 9 | /** 10 | * This file provides context for the the viewmodel to change the settings. 11 | */ 12 | class SettingsViewModelFactory( 13 | private val context: Context, 14 | ) : ViewModelProvider.Factory { 15 | override fun create(modelClass: Class): T { 16 | if (modelClass.isAssignableFrom(SettingsViewModel::class.java)) { 17 | @Suppress("UNCHECKED_CAST") 18 | return SettingsViewModel(context) as T 19 | } 20 | throw IllegalArgumentException("Unknown ViewModel class") 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/ui/theme/Colors.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.ui.theme 4 | 5 | import androidx.compose.ui.graphics.Color 6 | 7 | val theme_light_card_view_color = Color(color = 0xFFFFFFFF) 8 | val theme_light_button_color = Color(color = 0xFFFDAD0D) 9 | val theme_light_button_text_color = Color(color = 0xFF000000) 10 | val theme_light_background = Color(color = 0xFF5EB5E8) 11 | val theme_light_text_color = Color(color = 0xFF000000) 12 | val theme_light_selected_button_color = Color(color = 0xFF235270) 13 | val theme_light_switch_container_color = Color(color = 0xFFAAAAAA) 14 | val theme_light_switch_selector_color = Color(color = 0xFFFEDE9E) 15 | val theme_light_unchecked_switch_selector_color = Color(color = 0xFFEEEEEE) 16 | val theme_light_corner_button_color = Color(color = 0xFFFDAD0D) 17 | 18 | val theme_dark_card_view_color = Color(color = 0xFF000000) 19 | val theme_dark_button_color = Color(color = 0xFFD17B0F) 20 | val theme_dark_button_text_color = Color(color = 0xFFD17B0F) 21 | val theme_dark_background = Color(color = 0xFF235270) 22 | val theme_dark_text_color = Color(color = 0xFFFFFFFF) 23 | val theme_dark_button_outline_color = Color(color = 0xFFD17B0F) 24 | val theme_dark_selected_button_color = Color(color = 0xFF5EB5E8) 25 | val theme_dark_switch_container_color = Color(color = 0xFFAAAAAA) 26 | val theme_dark_switch_selector_color = Color(color = 0xFF2A1903) 27 | val theme_dark_unchecked_switch_selector_color = Color(color = 0xFF2D2D2D) 28 | val theme_dark_corner_button_color = Color(color = 0xFF2A1903) 29 | 30 | /** 31 | * Custom colors for use throughout the application. 32 | */ 33 | @Suppress("MagicNumber") 34 | val BlueSky = Color(0xFF4478a9) 35 | 36 | @Suppress("MagicNumber") 37 | val NightSky = Color(0xFF333333) 38 | 39 | @Suppress("MagicNumber") 40 | val BorderColor = Color(0x40000000) 41 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/ui/theme/Typography.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | package be.scri.ui.theme 4 | 5 | import androidx.compose.material3.Typography 6 | import androidx.compose.ui.text.TextStyle 7 | import androidx.compose.ui.text.font.FontFamily 8 | import androidx.compose.ui.text.font.FontWeight 9 | import androidx.compose.ui.unit.sp 10 | 11 | /** 12 | * Text styles for the application. 13 | */ 14 | val ScribeTypography = 15 | Typography( 16 | bodyMedium = 17 | TextStyle( 18 | fontFamily = FontFamily.SansSerif, 19 | fontWeight = FontWeight.Normal, 20 | fontSize = 16.sp, 21 | ), 22 | headlineMedium = 23 | TextStyle( 24 | fontFamily = FontFamily.SansSerif, 25 | fontWeight = FontWeight.Bold, 26 | fontSize = 20.sp, 27 | ), 28 | ) 29 | -------------------------------------------------------------------------------- /app/src/main/java/be/scri/views/CustomDividerItemDecoration.kt: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: GPL-3.0-or-later 2 | 3 | import android.graphics.Canvas 4 | import android.graphics.Rect 5 | import android.graphics.drawable.Drawable 6 | import android.view.View 7 | import androidx.recyclerview.widget.RecyclerView 8 | 9 | /** 10 | * A custom divider for use in recycle views. 11 | */ 12 | class CustomDividerItemDecoration( 13 | private val drawable: Drawable, 14 | private val width: Int, 15 | private val marginLeft: Int, 16 | private val marginRight: Int, 17 | ) : RecyclerView.ItemDecoration() { 18 | override fun onDraw( 19 | canvas: Canvas, 20 | parent: RecyclerView, 21 | state: RecyclerView.State, 22 | ) { 23 | val left = parent.paddingLeft + marginLeft 24 | val right = parent.width - parent.paddingRight - marginRight 25 | 26 | val childCount = parent.childCount 27 | for (i in 0 until childCount - 1) { 28 | val child = parent.getChildAt(i) 29 | val params = child.layoutParams as RecyclerView.LayoutParams 30 | val top = child.bottom + params.bottomMargin 31 | val bottom = top + width 32 | 33 | drawable.setBounds(left, top, right, bottom) 34 | drawable.draw(canvas) 35 | } 36 | } 37 | 38 | override fun getItemOffsets( 39 | outRect: Rect, 40 | view: View, 41 | parent: RecyclerView, 42 | state: RecyclerView.State, 43 | ) { 44 | outRect.set(0, 0, 0, width) 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/img_write_storage.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-hdpi/img_write_storage.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/img_write_storage_create_doc_sdk_30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-hdpi/img_write_storage_create_doc_sdk_30.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/img_write_storage_otg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-hdpi/img_write_storage_otg.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/img_write_storage_sd.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-hdpi/img_write_storage_sd.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/img_write_storage_sdk_30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-hdpi/img_write_storage_sdk_30.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-v31/keyboard_space_background_material.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/img_write_storage.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xhdpi/img_write_storage.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/img_write_storage_create_doc_sdk_30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xhdpi/img_write_storage_create_doc_sdk_30.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/img_write_storage_otg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xhdpi/img_write_storage_otg.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/img_write_storage_sd.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xhdpi/img_write_storage_sd.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/img_write_storage_sdk_30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xhdpi/img_write_storage_sdk_30.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_write_storage.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xxhdpi/img_write_storage.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_write_storage_create_doc_sdk_30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xxhdpi/img_write_storage_create_doc_sdk_30.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_write_storage_otg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xxhdpi/img_write_storage_otg.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_write_storage_sd.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xxhdpi/img_write_storage_sd.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/img_write_storage_sdk_30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xxhdpi/img_write_storage_sdk_30.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/img_write_storage.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xxxhdpi/img_write_storage.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/img_write_storage_create_doc_sdk_30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xxxhdpi/img_write_storage_create_doc_sdk_30.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/img_write_storage_otg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xxxhdpi/img_write_storage_otg.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/img_write_storage_sd.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xxxhdpi/img_write_storage_sd.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/img_write_storage_sdk_30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable-xxxhdpi/img_write_storage_sdk_30.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/black_dialog_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bookmark_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 13 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bottom_sheet_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bug_report_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_background_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_background_stroke.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/chevron.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/close.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/close_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/cmd_bar_background_right_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/cmd_bar_prompt_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/cmd_key_background_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/color_picker_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/corner_polygon.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/counter_clockwise_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dialog_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/dialog_you_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/emoji_phone_background_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/emoji_tablet_background_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/external_link.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/gender_suggestion_button_left_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/gender_suggestion_button_right_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/github_logo.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/globe.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/glow.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 20 | 27 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/gradient_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/gradient_background_flipped.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_person_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_left_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_arrow_right_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_article_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_camera_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_caps_lock_off.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 14 | 15 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_caps_lock_on.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_caps_lock_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_caps_outline_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_caps_underlined_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_caps_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_outline_vector.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clear_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_code_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_cross_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_drag_handle_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_enter_vector.xml: -------------------------------------------------------------------------------- 1 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_file_generic.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_folder_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_group_circle_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_left_arrow.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_link_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_mail_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_people_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_plus_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_question_mark_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_rename_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_right_arrow.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_scribe_icon_vector.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_send_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_tab_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/key_pressed_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/keyboard_dark.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 | 33 | 36 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/keyboard_enter_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/keyboard_key_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/keyboard_key_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/keyboard_light.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 | 33 | 36 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/keyboard_space_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/license_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/line.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/mail_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/mastodon_svg_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/material_info.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/material_keyboard.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/material_settings.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/matrix_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/minikeyboard_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/minikeyboard_selected_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/nav_bar_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/play_button.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/right_arrow.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_all_corners.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_bottom_corners.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_top_corners.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_all_corners.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_drawable.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | /> 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_middle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rounded_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rv_divider.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/scribe_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/scribe_key_background_left_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | 12 | 13 | 14 | 15 | 16 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/scribe_logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/scribe-org/Scribe-Android/d8938ae9781134ddbab5d514ed6e9fe1104d1c88/app/src/main/res/drawable/scribe_logo.webp -------------------------------------------------------------------------------- /app/src/main/res/drawable/section_holder_stroke.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/share_icon.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shield_lock.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shortcut_plus.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/star.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/sun.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 18 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/thumb_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/top_popup_menu_bg_dark.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/top_popup_menu_bg_light.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/track_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/transparent_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/transparent_button_pressed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/widget_round_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/wikimedia_logo_black.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 12 | 17 | 18 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout-land/keyboard_key_preview.xml: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/actionbar_title.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/card_view_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 17 | 18 | 29 | 30 | 36 | 37 | 38 | 39 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/res/layout/card_view_with_image.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | 18 | 19 | 30 | 31 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/card_view_with_switch.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 16 | 17 | 28 | 29 | 36 | 37 | 38 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/res/layout/custom_action_bar_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 |