diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 2c412e4b..b2c1d8b9 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -17,23 +17,23 @@ diverse, inclusive, and healthy community. Examples of behavior that contributes to a positive environment for our community include: -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the +- Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: -* The use of sexualized language or imagery, and sexual attention or +- The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities @@ -57,11 +57,13 @@ posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement + + Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement - these being the main project stakeholders or individuals specifically tasked with overseeing the @@ -116,7 +118,7 @@ Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an +standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 9e0a3037..49f4472c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -6,8 +6,8 @@ Thank you for your pull request! 🚀 -- [] This pull request is on a [separate branch](https://docs.github.com/en/get-started/quickstart/github-flow) and not the main branch -- [] 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) +- [] This pull request is on a [separate branch](https://docs.github.com/en/get-started/quickstart/github-flow) and not the main branch +- [] 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) --- @@ -28,4 +28,4 @@ Also consider including the following: -- #ISSUE_NUMBER +- #ISSUE_NUMBER diff --git a/.github/workflows/android_ci.yml b/.github/workflows/android_ci.yml index a6b108ad..3b2cc951 100644 --- a/.github/workflows/android_ci.yml +++ b/.github/workflows/android_ci.yml @@ -129,4 +129,5 @@ jobs: adb shell pm list packages >/dev/null sleep 10 adb shell getprop sys.boot_completed - ./gradlew connectedCoreDebugAndroidTest --stacktrace + ./gradlew connectedConjugateDebugAndroidTest --stacktrace + ./gradlew connectedKeyboardsDebugAndroidTest --stacktrace diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b74350e..9f434c6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,9 @@ See the [releases for Scribe-Android](https://github.com/scribe-org/Scribe-Andro Scribe-Android tries to follow [semantic versioning](https://semver.org/), a MAJOR.MINOR.PATCH version where increments are made of the: -- MAJOR version when we make incompatible API changes -- MINOR version when we add functionality in a backwards compatible manner -- PATCH version when we make backwards compatible bug fixes +- MAJOR version when we make incompatible API changes +- MINOR version when we add functionality in a backwards compatible manner +- PATCH version when we make backwards compatible bug fixes Emojis for the following are chosen based on [gitmoji](https://gitmoji.dev/). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6f31a949..5a5f1ba8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,18 +12,18 @@ If you have questions or would like to communicate with the team, please [join u # **Contents** -- [First steps as a contributor](#first-steps) -- [Learning the tech stack](#learning-the-tech) -- [Development environment](#dev-env) -- [Testing](#testing) -- [Issues and projects](#issues-projects) -- [Bug reports](#bug-reports) -- [Feature requests](#feature-requests) -- [Pull requests](#pull-requests) -- [Data edits](#data-edits) -- [Localization](#localization) -- [Documentation](#documentation) -- [Design](#design) +- [First steps as a contributor](#first-steps) +- [Learning the tech stack](#learning-the-tech) +- [Development environment](#dev-env) +- [Testing](#testing) +- [Issues and projects](#issues-projects) +- [Bug reports](#bug-reports) +- [Feature requests](#feature-requests) +- [Pull requests](#pull-requests) +- [Data edits](#data-edits) +- [Localization](#localization) +- [Documentation](#documentation) +- [Design](#design) @@ -31,15 +31,15 @@ If you have questions or would like to communicate with the team, please [join u Thank you for your interest in contributing to Scribe-Android! We look forward to welcoming you to the community and working with you to build an tools for language learners to communicate effectively :) The following are some suggested steps for people interested in joining our community: -- Please join the [public Matrix chat](https://matrix.to/#/#scribe_community:matrix.org) to connect with the community - - [Matrix](https://matrix.org/) is a network for secure, decentralized communication - - We'd suggest that you use the [Element](https://element.io/) client and [Element X](https://element.io/app) for a mobile app - - The [General](https://matrix.to/#/!yQJjLmluvlkWttNhKo:matrix.org?via=matrix.org) and [Android](https://matrix.to/#/#ScribeAndroid:matrix.org) channels would be great places to start! - - Feel free to introduce yourself and tell us what your interests are if you're comfortable :) -- Read through this contributing guide for all the information you need to contribute -- Look into issues marked [`good first issue`](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) and the [Projects board](https://github.com/orgs/scribe-org/projects/1) to get a better understanding of what you can work on -- Check out our [public designs on Figma](https://www.figma.com/file/c8945w2iyoPYVhsqW7vRn6/scribe_public_designs?type=design&node-id=405-464&mode=design&t=E3ccS9Z8MDVSizQ4-0) to understand Scribes's goals and direction -- Consider joining our [bi-weekly developer sync](https://etherpad.wikimedia.org/p/scribe-dev-sync)! +- Please join the [public Matrix chat](https://matrix.to/#/#scribe_community:matrix.org) to connect with the community + - [Matrix](https://matrix.org/) is a network for secure, decentralized communication + - We'd suggest that you use the [Element](https://element.io/) client and [Element X](https://element.io/app) for a mobile app + - The [General](https://matrix.to/#/!yQJjLmluvlkWttNhKo:matrix.org?via=matrix.org) and [Android](https://matrix.to/#/#ScribeAndroid:matrix.org) channels would be great places to start! + - Feel free to introduce yourself and tell us what your interests are if you're comfortable :) +- Read through this contributing guide for all the information you need to contribute +- Look into issues marked [`good first issue`](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) and the [Projects board](https://github.com/orgs/scribe-org/projects/1) to get a better understanding of what you can work on +- Check out our [public designs on Figma](https://www.figma.com/file/c8945w2iyoPYVhsqW7vRn6/scribe_public_designs?type=design&node-id=405-464&mode=design&t=E3ccS9Z8MDVSizQ4-0) to understand Scribes's goals and direction +- Consider joining our [bi-weekly developer sync](https://etherpad.wikimedia.org/p/scribe-dev-sync)! > [!NOTE] > Those new to Kotlin or wanting to work on their Kotlin skills are more than welcome to contribute! The team would be happy to help you on your development journey :) @@ -53,10 +53,10 @@ Scribe is very open to contributions from people in the early stages of their co
Docs for those new to programming

-- [Mozilla Developer Network Learning Area](https://developer.mozilla.org/en-US/docs/Learn) - - Doing MDN sections for HTML, CSS and JavaScript is the best ways to get into web development! -- [Open Source Guides](https://opensource.guide/) - - Guides from GitHub about open-source software including how to start and much more! +- [Mozilla Developer Network Learning Area](https://developer.mozilla.org/en-US/docs/Learn) + - Doing MDN sections for HTML, CSS and JavaScript is the best ways to get into web development! +- [Open Source Guides](https://opensource.guide/) + - Guides from GitHub about open-source software including how to start and much more!

@@ -64,8 +64,8 @@ Scribe is very open to contributions from people in the early stages of their co
Kotlin learning docs

-- [Kotlin getting started guide](https://kotlinlang.org/docs/getting-started.html) -- [Kotlin documentation](https://kotlinlang.org/docs/home.html) +- [Kotlin getting started guide](https://kotlinlang.org/docs/getting-started.html) +- [Kotlin documentation](https://kotlinlang.org/docs/home.html)

@@ -90,7 +90,7 @@ Scribe-Android is developed using the [Kotlin](https://kotlinlang.org/) coding l > > To run git commands with SSH, remember then to substitute the HTTPS URL, `https://github.com/...`, with the SSH one, `git@github.com:...`. > -> - e.g. Cloning (with submodules) now becomes `git clone --recurse-submodules git@github.com:/Scribe-Android.git` +> - e.g. Cloning (with submodules) now becomes `git clone --recurse-submodules git@github.com:/Scribe-Android.git` > > GitHub also has their documentation on how to [Generate a new SSH key](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) 🔑 > @@ -109,14 +109,15 @@ cd Scribe-Android git remote add upstream https://github.com/scribe-org/Scribe-Android.git ``` -- Now, if you run `git remote -v` you should see two remote repositories named: - - `origin` (forked repository) - - `upstream` (Scribe-Android repository) +- Now, if you run `git remote -v` you should see two remote repositories named: + - `origin` (forked repository) + - `upstream` (Scribe-Android repository) 3. Open the Scribe-Android directory in Android Studio -4. In order to [run Scribe on an emulator](https://developer.android.com/studio/run/emulator): +4. The application has 2 build variants, with more information about them being found in the [Build Variant Selection](#build-variants) section +5. In order to [run Scribe on an emulator](https://developer.android.com/studio/run/emulator): - In the top bar find and select the "Device Manager" option - [Create a device](https://developer.android.com/studio/run/managing-avds) and select it once it's been made - Press the play button marked "Run App" @@ -133,6 +134,17 @@ git remote add upstream https://github.com/scribe-org/Scribe-Android.git > [!NOTE] > Feel free to contact the team in the [Android room on Matrix](https://matrix.to/#/#ScribeAndroid:matrix.org) if you're having problems getting your environment setup! + + +## Build Variant Selection [`⇧`](#contents) + +The project includes **two build variants**, each corresponding to a different application. + +Build variants can be selected from **Build → Select Build Variant** in Android Studio: + +- **`keyboardDebug`** → Scribe Language Keyboards app (IME) +- **`conjugateDebug`** → Scribe Conjugate verb conjugation app + ## Pre-commit Hooks [`⇧`](#contents) Scribe-Android uses pre-commit hooks to maintain a clean and consistent codebase. These hooks help automatically check for issues such as formatting, trailing whitespace, and linting errors. Here's how to set up pre-commit for Scribe-Android: @@ -182,13 +194,13 @@ To maintain consistency and clarity in the Scribe-Android codebase, we recommend #### 1. Project Structure for Unit Tests -- **Location**: Place all unit tests in the `src/test/java` directory to mirror the structure of the `src/main/java` directory. For new classes or features, ensure their corresponding test classes follow the same package structure. -- **Class Files**: Each class in `src/main/java` should have a dedicated test file in `src/test/java`, named by appending `Test` to the class name (e.g., `UserManager` → `UserManagerTest`). -- **New Classes for Testing**: When a new utility or helper class is needed specifically for testing, place it under `src/test/java/utils` or `src/test/java/helpers`. +- **Location**: Place all unit tests in the `src/test/java` directory to mirror the structure of the `src/main/java` directory. For new classes or features, ensure their corresponding test classes follow the same package structure. +- **Class Files**: Each class in `src/main/java` should have a dedicated test file in `src/test/java`, named by appending `Test` to the class name (e.g., `UserManager` → `UserManagerTest`). +- **New Classes for Testing**: When a new utility or helper class is needed specifically for testing, place it under `src/test/java/utils` or `src/test/java/helpers`. #### 2. Naming Conventions for Tests -- **Test Methods**: Use descriptive names indicating expected behavior. Follow the format: +- **Test Methods**: Use descriptive names indicating expected behavior. Follow the format: ```kotlin @Test @@ -201,8 +213,8 @@ To maintain consistency and clarity in the Scribe-Android codebase, we recommend #### 3. Scope and Focus of Tests -- **Single Responsibility**: Each test should cover only one behavior or scenario. For multiple behaviors, split them into separate test methods. -- **Setup and Teardown**: Use `@Before` for initializing objects and `@After` for cleanup, ensuring tests run in isolation. +- **Single Responsibility**: Each test should cover only one behavior or scenario. For multiple behaviors, split them into separate test methods. +- **Setup and Teardown**: Use `@Before` for initializing objects and `@After` for cleanup, ensuring tests run in isolation. ```kotlin @Before @@ -216,22 +228,21 @@ To maintain consistency and clarity in the Scribe-Android codebase, we recommend } ``` -- **Mocking**: Use mocks (e.g., MockK) to isolate the unit test, especially with dependencies like databases, network requests or services. +- **Mocking**: Use mocks (e.g., MockK) to isolate the unit test, especially with dependencies like databases, network requests or services. #### 4. Writing Effective Tests -- **AAA Pattern (Arrange, Act, Assert)**: Structure each test with three distinct parts: - - - **Arrange**: Set up the conditions. - - **Act**: Execute the method under test. - - **Assert**: Verify the result. +- **AAA Pattern (Arrange, Act, Assert)**: Structure each test with three distinct parts: + - **Arrange**: Set up the conditions. + - **Act**: Execute the method under test. + - **Assert**: Verify the result. -- **Coverage of Edge Cases**: Write tests for both typical cases and edge cases, like `null` values or invalid data. +- **Coverage of Edge Cases**: Write tests for both typical cases and edge cases, like `null` values or invalid data. #### 5. Test Documentation -- **Comments**: Add comments when test logic is complex or non-intuitive. -- **Assertions**: Use descriptive assertion methods (`assertTrue`, `assertEquals`, etc.) for clarity and include failure messages for custom assertions if necessary. +- **Comments**: Add comments when test logic is complex or non-intuitive. +- **Assertions**: Use descriptive assertion methods (`assertTrue`, `assertEquals`, etc.) for clarity and include failure messages for custom assertions if necessary. # Issues and projects [`⇧`](#contents) @@ -258,11 +269,11 @@ Guidelines for bug reports: **Great Bug Reports** tend to have: -- A quick summary -- Steps to reproduce -- What you expected would happen -- What actually happens -- Notes (why this might be happening, things tried that didn't work, etc) +- A quick summary +- Steps to reproduce +- What you expected would happen +- What actually happens +- Notes (why this might be happening, things tried that didn't work, etc) To make the above steps easier, the Scribe team asks that contributors report bugs using the [bug report](https://github.com/scribe-org/Scribe-Android/issues/new?assignees=&labels=feature&template=bug_report.yml) template, with these issues further being marked with the [`Bug`](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aissue%20state%3Aopen%20type%3ABug) type. @@ -302,8 +313,8 @@ When making a contribution, adhering to the [GitHub flow](https://guides.github. > [!NOTE] > The following are tools and methods to help you write good commit messages ✨ > -> - [commitlint](https://commitlint.io/) helps write [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) -> - Git's [interactive rebase](https://docs.github.com/en/github/getting-started-with-github/about-git-rebase) cleans up commits +> - [commitlint](https://commitlint.io/) helps write [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) +> - Git's [interactive rebase](https://docs.github.com/en/github/getting-started-with-github/about-git-rebase) cleans up commits 4. Locally merge (or rebase) the upstream development branch into your topic branch: diff --git a/README.md b/README.md index eed6597e..db0d691d 100644 --- a/README.md +++ b/README.md @@ -34,13 +34,13 @@ Check out Scribe's [architecture diagrams](https://github.com/scribe-org/Organiz # **Contents** -- [Preview Images](#preview-images) -- [Contributing](#contributing) -- [Environment Setup](#environment-setup) -- [App Setup](#app-setup) -- [Supported Languages](#supported-languages) -- [Keyboard Features](#keyboard-features) -- [Featured By](#featured-by) +- [Preview Images](#preview-images) +- [Contributing](#contributing) +- [Environment Setup](#environment-setup) +- [App Setup](#app-setup) +- [Supported Languages](#supported-languages) +- [Keyboard Features](#keyboard-features) +- [Featured By](#featured-by) @@ -77,12 +77,12 @@ After your first few pull requests organization members would be happy to discus ### Ways to Help [`⇧`](#contents) -- [Reporting bugs](https://github.com/scribe-org/Scribe-Android/issues/new?assignees=&labels=bug&template=bug_report.yml) as they're found 🐞 -- Working on [new features](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aissue+is%3Aopen+label%3Afeature) ✨ -- [Localization](https://github.com/scribe-org/Scribe-i18n) for the app and app stores via our [Weblate project](https://hosted.weblate.org/projects/scribe/scribe-i18n) 🌐 -- [Documentation](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aissue+is%3Aopen+label%3Adocumentation) for onboarding and project cohesion 📝 -- Adding language data to [Scribe-Data](https://github.com/scribe-org/Scribe-Data/issues) via [Wikidata](https://www.wikidata.org/)! 🗃️ -- [Sharing Scribe-Android](https://github.com/scribe-org/Scribe-Android/issues/62) with others! 🚀 +- [Reporting bugs](https://github.com/scribe-org/Scribe-Android/issues/new?assignees=&labels=bug&template=bug_report.yml) as they're found 🐞 +- Working on [new features](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aissue+is%3Aopen+label%3Afeature) ✨ +- [Localization](https://github.com/scribe-org/Scribe-i18n) for the app and app stores via our [Weblate project](https://hosted.weblate.org/projects/scribe/scribe-i18n) 🌐 +- [Documentation](https://github.com/scribe-org/Scribe-Android/issues?q=is%3Aissue+is%3Aopen+label%3Adocumentation) for onboarding and project cohesion 📝 +- Adding language data to [Scribe-Data](https://github.com/scribe-org/Scribe-Data/issues) via [Wikidata](https://www.wikidata.org/)! 🗃️ +- [Sharing Scribe-Android](https://github.com/scribe-org/Scribe-Android/issues/62) with others! 🚀
View Scribe-i18n localization progress @@ -137,7 +137,7 @@ Scribe-Android is developed using the [Kotlin](https://kotlinlang.org/) coding l > > To run git commands with SSH, remember then to substitute the HTTPS URL, `https://github.com/...`, with the SSH one, `git@github.com:...`. > -> - e.g. Cloning (with submodules) now becomes `git clone --recurse-submodules git@github.com:/Scribe-Android.git` +> - e.g. Cloning (with submodules) now becomes `git clone --recurse-submodules git@github.com:/Scribe-Android.git` > > GitHub also has their documentation on how to [Generate a new SSH key](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) 🔑 > @@ -156,14 +156,13 @@ cd Scribe-Android git remote add upstream https://github.com/scribe-org/Scribe-Android.git ``` -- Now, if you run `git remote -v` you should see two remote repositories named: - - `origin` (forked repository) - - `upstream` (Scribe-Android repository) +- Now, if you run `git remote -v` you should see two remote repositories named: + - `origin` (forked repository) + - `upstream` (Scribe-Android repository) 3. Open the Scribe-Android directory in Android Studio 4. In order to [run Scribe on an emulator](https://developer.android.com/studio/run/emulator): - - In the top bar find and select the "Device Manager" option - [Create a device](https://developer.android.com/studio/run/managing-avds) and select it once it's been made - Press the play button marked "Run App" @@ -190,15 +189,34 @@ pre-commit install # install pre-commit hooks # App Setup [`⇧`](#contents) +### Codebase Overview + +The Scribe-Android codebase consists of two separate applications + +- Keyboard Application — the Scribe Language Keyboards application (IME) + +- Conjugate Application — the Scribe verb conjugations application + +Each application is built and run independently using Android Studio build variants. + +To select a built variant: + +1. Open the project in Android Studio +2. Navigate to `Build` → `Select Build Variant...` +3. Choose the required variant: + +- **`keyboardDebug`** → Scribe Language Keyboards app (IME) +- **`conjugateDebug`** → Scribe Conjugate verb conjugation app + > [!NOTE] > Currently Scribe-Android does not work as a floating keyboard. -Users access Scribe language keyboards through the following: +The default variant build variant is `keyboardDebug`. When running this variant, users access Scribe language keyboards through the following: -- Open the app and press **`Enable Keyboard`** - - Or: Settings -> System -> Languages & input -> On-screen keyboard -> Manage on-screen keyboards -- Choose from the available Scribe language keyboards -- When typing press 🌐 or the keyboard button to select keyboards +- Open the app and press **`Enable Keyboard`** + - Or: Settings -> System -> Languages & input -> On-screen keyboard -> Manage on-screen keyboards +- Choose from the available Scribe language keyboards +- When typing press 🌐 or the keyboard button to select keyboards @@ -238,12 +256,12 @@ Scribe further annotates words in the command bar to help users understand the c Scribe annotates nouns in the command bar according to the following conventions: -- Feminine: colored red 🟥 and marked with (F) -- Masculine: colored blue 🟦 and marked with (M) -- Common: colored purple 🟪 and marked with (C) -- Neutral: colored green 🟩 and marked with (N) -- Plural: colored orange 🟧 and marked with (PL) -- More than one: marked with all their forms +- Feminine: colored red 🟥 and marked with (F) +- Masculine: colored blue 🟦 and marked with (M) +- Common: colored purple 🟪 and marked with (C) +- Neutral: colored green 🟩 and marked with (N) +- Plural: colored orange 🟧 and marked with (PL) +- More than one: marked with all their forms The above form abbreviations are translated into their equivalents in the keyboard's language. @@ -262,19 +280,19 @@ The goal is for Scribe to have all the functionality of system keyboards. See th
Current base features include:

-- Phone and tablet support -- Dynamic layouts for cross-device performance -- Portrait and landscape modes -- Dark mode compatibility -- Autocompletion based on [Wikidata](https://www.wikidata.org/) sourced words -- Autosuggestion based on [Wikipedia](https://www.wikipedia.org/) derived relationships -- Emoji autocompletions and autosuggestions based on [Unicode CLDR](https://github.com/unicode-org/cldr) sourced emojis -- Autocorrect (WIP) -- Auto-capitalization following `.`, `?` and `!` -- The double space period shortcut -- Typing symbols and numbers followed by a space returns keyboard to letters -- Hold-to-select characters for letters and symbols -- Key pop up views for letters and symbols +- Phone and tablet support +- Dynamic layouts for cross-device performance +- Portrait and landscape modes +- Dark mode compatibility +- Autocompletion based on [Wikidata](https://www.wikidata.org/) sourced words +- Autosuggestion based on [Wikipedia](https://www.wikipedia.org/) derived relationships +- Emoji autocompletions and autosuggestions based on [Unicode CLDR](https://github.com/unicode-org/cldr) sourced emojis +- Autocorrect (WIP) +- Auto-capitalization following `.`, `?` and `!` +- The double space period shortcut +- Typing symbols and numbers followed by a space returns keyboard to letters +- Hold-to-select characters for letters and symbols +- Key pop up views for letters and symbols

@@ -324,8 +342,8 @@ The Scribe community would like to thank all the great software that made Scribe
List of referenced code

-- [Simple-Keyboard](https://github.com/SimpleMobileTools/Simple-Keyboard) by [SimpleMobileTools](https://github.com/SimpleMobileTools) ([License](https://github.com/SimpleMobileTools/Simple-Keyboard/blob/main/LICENSE)) -- [Simple-Commons](https://github.com/SimpleMobileTools/Simple-Commons) by [SimpleMobileTools](https://github.com/SimpleMobileTools) ([License](https://github.com/SimpleMobileTools/Simple-Commons/blob/master/LICENSE)) +- [Simple-Keyboard](https://github.com/SimpleMobileTools/Simple-Keyboard) by [SimpleMobileTools](https://github.com/SimpleMobileTools) ([License](https://github.com/SimpleMobileTools/Simple-Keyboard/blob/main/LICENSE)) +- [Simple-Commons](https://github.com/SimpleMobileTools/Simple-Commons) by [SimpleMobileTools](https://github.com/SimpleMobileTools) ([License](https://github.com/SimpleMobileTools/Simple-Commons/blob/master/LICENSE))

diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 81b5e876..b3e548f4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -46,6 +46,27 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } + + productFlavors { + create("keyboards") { + applicationIdSuffix = ".keyboards" + isDefault = true + resValue( + "string", + "app_launcher_name", + "Scribe" + ) + } + create("conjugate") { + applicationIdSuffix = ".conjugate" + resValue( + "string", + "app_launcher_name", + "Conjugate" + ) + } + } + packaging { resources { pickFirsts.add("META-INF/LICENSE*") @@ -114,10 +135,7 @@ android { } flavorDimensions.add("variants") - productFlavors { - create("core") - create("fdroid") - } + sourceSets { getByName("main").java.srcDirs("src/main/kotlin") diff --git a/app/src/conjugate/ic_launcher-playstore.png b/app/src/conjugate/ic_launcher-playstore.png new file mode 100644 index 00000000..06fc5b22 Binary files /dev/null and b/app/src/conjugate/ic_launcher-playstore.png differ diff --git a/app/src/conjugate/java/be/scri/activities/MainActivity.kt b/app/src/conjugate/java/be/scri/activities/MainActivity.kt new file mode 100644 index 00000000..d8aa98f8 --- /dev/null +++ b/app/src/conjugate/java/be/scri/activities/MainActivity.kt @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +@file:Suppress("ktlint:standard:kdoc") +/** + * Implements the main activity with a custom action bar, ViewPager navigation, and dynamic UI adjustments. + */ + +package be.scri.activities + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import be.scri.ui.screens.SampleScreen + +/** + * The main entry point of the app. + * Initializes theme settings, navigation, and sets up the main UI using Jetpack Compose. + */ +class MainActivity : ComponentActivity() { + /** + * Initializes the app on launch. Sets the theme based on user preferences, sets up edge-to-edge + * layout, and builds the UI using Compose. + */ + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + SampleScreen() + } + } +} diff --git a/app/src/conjugate/java/be/scri/ui/screens/SampleScreen.kt b/app/src/conjugate/java/be/scri/ui/screens/SampleScreen.kt new file mode 100644 index 00000000..08dfa9a7 --- /dev/null +++ b/app/src/conjugate/java/be/scri/ui/screens/SampleScreen.kt @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +package be.scri.ui.screens + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier + +@Composable +fun SampleScreen(modifier: Modifier = Modifier) { + MaterialTheme { + Box( + modifier = modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + Text( + text = "Conjugate App", + style = MaterialTheme.typography.bodyLarge, + ) + } + } +} diff --git a/app/src/conjugate/res/drawable/ic_launcher_background.xml b/app/src/conjugate/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..ca3826a4 --- /dev/null +++ b/app/src/conjugate/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/conjugate/res/drawable/ic_launcher_foreground.xml b/app/src/conjugate/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..0520adc1 --- /dev/null +++ b/app/src/conjugate/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + diff --git a/app/src/conjugate/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/conjugate/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..bbd3e021 --- /dev/null +++ b/app/src/conjugate/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/conjugate/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/conjugate/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..bbd3e021 --- /dev/null +++ b/app/src/conjugate/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/conjugate/res/mipmap-hdpi/ic_launcher.webp b/app/src/conjugate/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 00000000..2a1b5c9d Binary files /dev/null and b/app/src/conjugate/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/conjugate/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/conjugate/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 00000000..0fa18337 Binary files /dev/null and b/app/src/conjugate/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/conjugate/res/mipmap-mdpi/ic_launcher.webp b/app/src/conjugate/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 00000000..e5ca338e Binary files /dev/null and b/app/src/conjugate/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/conjugate/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/conjugate/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 00000000..8157d818 Binary files /dev/null and b/app/src/conjugate/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/conjugate/res/mipmap-xhdpi/ic_launcher.webp b/app/src/conjugate/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 00000000..1a6729bc Binary files /dev/null and b/app/src/conjugate/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/conjugate/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/conjugate/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..c674c6a2 Binary files /dev/null and b/app/src/conjugate/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/conjugate/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/conjugate/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 00000000..576eb1fb Binary files /dev/null and b/app/src/conjugate/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/conjugate/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/conjugate/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..0b0da68b Binary files /dev/null and b/app/src/conjugate/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/conjugate/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/conjugate/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 00000000..820132e4 Binary files /dev/null and b/app/src/conjugate/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/conjugate/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/conjugate/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..cbbc8b9c Binary files /dev/null and b/app/src/conjugate/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml deleted file mode 100644 index 045e125f..00000000 --- a/app/src/debug/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/app/src/keyboards/ic_launcher-playstore.png b/app/src/keyboards/ic_launcher-playstore.png new file mode 100644 index 00000000..cd344839 Binary files /dev/null and b/app/src/keyboards/ic_launcher-playstore.png differ diff --git a/app/src/main/java/be/scri/activities/MainActivity.kt b/app/src/keyboards/java/be/scri/activities/MainActivity.kt similarity index 100% rename from app/src/main/java/be/scri/activities/MainActivity.kt rename to app/src/keyboards/java/be/scri/activities/MainActivity.kt diff --git a/app/src/keyboards/res/drawable/ic_launcher_background.xml b/app/src/keyboards/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..ca3826a4 --- /dev/null +++ b/app/src/keyboards/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/keyboards/res/drawable/ic_launcher_foreground.xml b/app/src/keyboards/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..418d0acf --- /dev/null +++ b/app/src/keyboards/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + diff --git a/app/src/keyboards/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/keyboards/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..bbd3e021 --- /dev/null +++ b/app/src/keyboards/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/keyboards/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/keyboards/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..bbd3e021 --- /dev/null +++ b/app/src/keyboards/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/keyboards/res/mipmap-hdpi/ic_launcher.webp b/app/src/keyboards/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 00000000..c9429503 Binary files /dev/null and b/app/src/keyboards/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/keyboards/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/keyboards/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 00000000..b0fbb779 Binary files /dev/null and b/app/src/keyboards/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/keyboards/res/mipmap-mdpi/ic_launcher.webp b/app/src/keyboards/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 00000000..6f116e78 Binary files /dev/null and b/app/src/keyboards/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/keyboards/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/keyboards/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 00000000..797aff04 Binary files /dev/null and b/app/src/keyboards/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/keyboards/res/mipmap-xhdpi/ic_launcher.webp b/app/src/keyboards/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 00000000..bee2dea0 Binary files /dev/null and b/app/src/keyboards/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/keyboards/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/keyboards/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..58019dcd Binary files /dev/null and b/app/src/keyboards/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/keyboards/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/keyboards/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 00000000..d0ec009f Binary files /dev/null and b/app/src/keyboards/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/keyboards/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/keyboards/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..98a301ef Binary files /dev/null and b/app/src/keyboards/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/keyboards/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/keyboards/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 00000000..effdd5e7 Binary files /dev/null and b/app/src/keyboards/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/keyboards/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/keyboards/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..65ddff77 Binary files /dev/null and b/app/src/keyboards/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png deleted file mode 100644 index 325d3e4c..00000000 Binary files a/app/src/main/ic_launcher-playstore.png and /dev/null differ diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 4ae7d123..00000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/app/src/main/res/mipmap-hdpi/ic_launcher_background.png deleted file mode 100644 index 51ac5792..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_background.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index 89e1d4f4..00000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/app/src/main/res/mipmap-mdpi/ic_launcher_background.png deleted file mode 100644 index b62082ea..00000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_background.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 1f923e2b..00000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png deleted file mode 100644 index 094202b3..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index 898f420c..00000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png deleted file mode 100644 index d8f7888c..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index da80a879..00000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png deleted file mode 100644 index a47db345..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 2009579a..00000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/app/src/main/res/values-de/string.xml b/app/src/main/res/values-de/string.xml index d6c1a225..c06b088b 100644 --- a/app/src/main/res/values-de/string.xml +++ b/app/src/main/res/values-de/string.xml @@ -3,6 +3,7 @@ Über Scribe Android-Änderungsprotokoll Verfügbare Daten + Blog-Beiträge Änderungsprotokoll Datenserver iOS-Änderungsprotokoll @@ -17,6 +18,7 @@ Deutsch Indonesisch Italienisch + Norwegisch Portugiesisch Russisch Spanisch diff --git a/build.gradle.kts b/build.gradle.kts index 8dcd4fa6..6e9b2aea 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ buildscript { dependencies { classpath("io.nlopez.compose.rules:ktlint:0.4.17") - classpath("com.android.tools.build:gradle:8.7.0") + classpath("com.android.tools.build:gradle:8.13.2") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.0") classpath("io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.23.8") classpath("org.jlleitschuh.gradle:ktlint-gradle:12.1.1") diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d8f4d4e..b94a71a3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Jan 04 09:48:27 CET 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME