diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml deleted file mode 100644 index 69a0c7670b..0000000000 --- a/.github/workflows/android.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: FlorisBoard CI - -on: - push: - branches: [ main ] - paths-ignore: - - ".github/ISSUE_TEMPLATE/**" - - ".github/PULL_REQUEST_TEMPLATE.md" - - ".github/FUNDING.yml" - - ".dockerignore" - - ".editorconfig" - - "fastlane/**" - - "AI_POLICY.md" - - "CODE_OF_CONDUCT.md" - - "CONTRIBUTING.md" - - "LICENSE" - - "README.md" - - "ROADMAP.md" - pull_request: - branches: [ main ] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - uses: gradle/actions/wrapper-validation@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: 17 - distribution: temurin - - name: Set up CMake and Ninja - uses: lukka/get-cmake@v4.0.2 - - name: Build with Gradle - run: ./gradlew clean assembleDebug - - uses: actions/upload-artifact@v4 - with: - name: app-debug.apk - path: app/build/outputs/apk/debug/app-debug.apk diff --git a/.github/workflows/crowdin-upload.yml b/.github/workflows/crowdin-upload.yml deleted file mode 100644 index 876d437cc2..0000000000 --- a/.github/workflows/crowdin-upload.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Crowdin Upload Sources - -on: - push: - branches: [ main ] - paths: - - "app/src/main/res/values/strings.xml" - - ".github/workflows/crowdin-upload.yml" - -jobs: - upload-to-crowdin: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Upload - uses: crowdin/github-action@v2 - with: - config: "crowdin.yml" - upload_sources: true - upload_translations: false - download_translations: false - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - FSEC_CROWDIN_PROJECT_ID: ${{ secrets.FSEC_CROWDIN_PROJECT_ID }} - FSEC_CROWDIN_PERSONAL_TOKEN: ${{ secrets.FSEC_CROWDIN_PERSONAL_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..43e3ad4d00 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,56 @@ +name: Build and Publish Release + +on: + workflow_dispatch: + +jobs: + build-release: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - uses: gradle/actions/wrapper-validation@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: temurin + + # Native dependencies setup + - name: Set up CMake and Ninja + uses: lukka/get-cmake@v4.1.2 + + - name: Build Release APK + run: ./gradlew clean assembleRelease + + - name: Detect latest Android Build Tools + run: | + # Find the latest directory in the build-tools folder + LATEST_BUILD_TOOLS=$(ls -1 $ANDROID_HOME/build-tools | sort -n | tail -1) + echo "LATEST_BUILD_TOOLS=$LATEST_BUILD_TOOLS" >> $GITHUB_ENV + echo "Found build-tools: $LATEST_BUILD_TOOLS" + + - name: Sign Release APK + uses: r0adkll/sign-android-release@v1 + env: + BUILD_TOOLS_VERSION: ${{ env.LATEST_BUILD_TOOLS }} + id: sign_app + with: + releaseDirectory: app/build/outputs/apk/release + signingKeyBase64: ${{ secrets.SIGNING_KEY_STORE_BASE64 }} + alias: ${{ secrets.SIGNING_KEY_ALIAS }} + keyStorePassword: ${{ secrets.SIGNING_STORE_PASSWORD }} + keyPassword: ${{ secrets.SIGNING_KEY_PASSWORD }} + + - name: Rename Signed APK + run: mv "${{ steps.sign_app.outputs.signedReleaseFile }}" trackman-keyboard-release.apk + + - name: Upload Signed APK + uses: actions/upload-artifact@v4 + with: + name: trackman-keyboard-release + path: trackman-keyboard-release.apk diff --git a/.github/workflows/validate-strings-no-translations.yml b/.github/workflows/validate-strings-no-translations.yml deleted file mode 100644 index 50f73c313c..0000000000 --- a/.github/workflows/validate-strings-no-translations.yml +++ /dev/null @@ -1,70 +0,0 @@ -name: Validate no translated strings.xml included - -on: - pull_request_target: - branches: [ main ] - -jobs: - validate: - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: write - steps: - - name: Precheck if validation is required - id: precheck - run: | - pr_author="${{ github.event.pull_request.user.login }}" - if [[ "$pr_author" == "florisboard-bot" ]]; then - echo "PR is by florisboard-bot, skipping validation!" - echo "require_validation=false" >> "$GITHUB_OUTPUT" - else - echo "PR is not by florisboard-bot, requiring validation!" - echo "require_validation=true" >> "$GITHUB_OUTPUT" - fi - - - name: Fetch PR changed files manually - id: fetch_changed_files - if: steps.precheck.outputs.require_validation == 'true' - run: | - pr_info="$(curl -sSf https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }})" || exit 11 - num_changed_files="$(jq -r '.changed_files' <<< "$pr_info")" || exit 12 - num_pages=$(((num_changed_files + 99) / 100)) - changed_files="" - echo "Num changed files: $num_changed_files ($num_pages page(s))" - for ((page=1; page<=num_pages; page++)); do - pr_files="$(curl -sSf https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files?per_page=100\&page=$page)" || exit 11 - changed_files_iter="$(jq -r '.[].filename' <<< "$pr_files")" || exit 12 - changed_files+="$changed_files_iter" - done - echo "Changed files:\n$changed_files" - illegal_changes_list="$(grep -E '^app/src/main/res/values-.+/strings.xml$' <<< "$changed_files")" || true - if [ -n "$illegal_changes_list" ]; then - echo -e "Illegal changes detected:\n$illegal_changes_list" - else - echo "No illegal changes detected" - fi - echo "illegal_changes_list<> "$GITHUB_OUTPUT" - echo "$illegal_changes_list" >> "$GITHUB_OUTPUT" - echo "EOF" >> "$GITHUB_OUTPUT" - - - name: Create comment if illegal files detected - uses: peter-evans/create-or-update-comment@v4 - if: steps.precheck.outputs.require_validation == 'true' && steps.fetch_changed_files.outputs.illegal_changes_list != '' - with: - issue-number: ${{ github.event.pull_request.number }} - body: | - ⚠️ Illegal changes detected - - Hey there! - - We detected illegal changes that disobey the [contribution guidelines](https://github.com/florisboard/florisboard/blob/main/CONTRIBUTING.md#translation). This is a kind reminder that pull requests must not contain translated `strings.xml` files, as those are exclusively managed from Crowdin. - - Please remove changes to the following files: - ``` - ${{ steps.fetch_changed_files.outputs.illegal_changes_list }} - ``` - - - name: Fail workflow if illegal files detected - if: steps.precheck.outputs.require_validation == 'true' && steps.fetch_changed_files.outputs.illegal_changes_list != '' - run: echo -e "Illegal changes detected:\n${{ steps.fetch_changed_files.outputs.illegal_changes_list }}" && exit 1 diff --git a/README.md b/README.md index 81deaaac8f..ad392ceda1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,14 @@ App icon -# FlorisBoard [![Crowdin](https://badges.crowdin.net/florisboard/localized.svg)](https://crowdin.florisboard.org) [![Matrix badge](https://img.shields.io/badge/chat-%23florisboard%3amatrix.org-blue)](https://matrix.to/#/#florisboard:matrix.org) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) [![FlorisBoard CI](https://github.com/florisboard/florisboard/actions/workflows/android.yml/badge.svg?event=push)](https://github.com/florisboard/florisboard/actions/workflows/android.yml) +# Trackman Keyboard + +This is a custom version of **FlorisBoard** keyboard optimized for Range Kiosks use-cases. +It removes unnecessary features and simplifies the user interface to provide a more +focused typing experience. Access to settings and customization options are disabled +to prevent users from changing the device configuration. + +# FlorisBoard [![Crowdin](https://badges.crowdin.net/florisboard/localized.svg)](https://crowdin.florisboard.org) [![Matrix badge](https://img.shields.io/badge/chat-%23florisboard%3amatrix.org-blue)](https://matrix.to/#/#florisboard:matrix.org) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md) **FlorisBoard** is a free and open-source keyboard for Android 8.0+ devices. It aims at being modern, user-friendly and customizable while diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f56d84df53..cb9df79bda 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -17,6 +17,8 @@ import com.android.build.api.dsl.ApplicationExtension import org.gradle.api.tasks.testing.logging.TestLogEvent import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import java.io.FileInputStream +import java.util.Properties plugins { alias(libs.plugins.agp.application) @@ -40,6 +42,10 @@ val projectVersionNameSuffix = projectVersionName.substringAfter("-", "").let { } } +val keystorePropertiesFile: File = rootProject.file("keystore.properties") +val keystoreProperties = Properties() +keystoreProperties.load(FileInputStream(keystorePropertiesFile)) + kotlin { compilerOptions { jvmTarget.set(JvmTarget.JVM_11) @@ -65,8 +71,17 @@ configure { targetCompatibility = JavaVersion.VERSION_11 } + signingConfigs { + create("config") { + storeFile = file(keystoreProperties["storeFile"] as String) + keyAlias = keystoreProperties["keyAlias"] as String + keyPassword = keystoreProperties["keyPassword"] as String + storePassword = keystoreProperties["storePassword"] as String + } + } + defaultConfig { - applicationId = "dev.patrickgold.florisboard" + applicationId = "dk.trackman.keyboard" minSdk = projectMinSdk.toInt() targetSdk = projectTargetSdk.toInt() versionCode = projectVersionCode.toInt() @@ -85,6 +100,18 @@ configure { } } + flavorDimensions.add("target") + + productFlavors { + create("standard") { + dimension = "target" + } + create("msi") { + dimension = "target" + applicationIdSuffix = ".msinda2" + } + } + bundle { language { // We disable language split because FlorisBoard does not use @@ -106,6 +133,8 @@ configure { isDebuggable = true isJniDebuggable = false + + signingConfig = signingConfigs.getByName("config") } create("beta") { @@ -115,6 +144,8 @@ configure { proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") isMinifyEnabled = true isShrinkResources = true + + signingConfig = signingConfigs.getByName("config") } named("release") { @@ -123,6 +154,8 @@ configure { proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") isMinifyEnabled = true isShrinkResources = true + + signingConfig = signingConfigs.getByName("config") } create("benchmark") { diff --git a/app/src/beta/res/values/strings.xml b/app/src/beta/res/values/strings.xml index 58ebad4c35..f5b3b37d9f 100644 --- a/app/src/beta/res/values/strings.xml +++ b/app/src/beta/res/values/strings.xml @@ -1,4 +1,4 @@ - FlorisBoard Beta + Trackman Keyboard Beta diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml index 096f57320a..95083e42e3 100644 --- a/app/src/debug/res/values/strings.xml +++ b/app/src/debug/res/values/strings.xml @@ -1,4 +1,4 @@ - FlorisBoard Debug + Trackman Keyboard Debug diff --git a/app/src/main/assets/ime/keyboard/org.florisboard.localization/popupMappings/default-original.json b/app/src/main/assets/ime/keyboard/org.florisboard.localization/popupMappings/default-original.json new file mode 100644 index 0000000000..ccf027ad07 --- /dev/null +++ b/app/src/main/assets/ime/keyboard/org.florisboard.localization/popupMappings/default-original.json @@ -0,0 +1,18 @@ +{ + "all": { + "~enter": { + "main": { "code": -212, "label": "ime_ui_mode_media", "type": "system_gui" }, + "relevant": [ + { "code": -112, "label": "compact_layout_to_right", "type": "system_gui" }, + { "code": -213, "label": "ime_ui_mode_clipboard", "type": "system_gui"} + ] + }, + "~left": { + "main": { "code": -212, "label": "ime_ui_mode_media", "type": "system_gui" }, + "relevant": [ + { "code": -111, "label": "compact_layout_to_left", "type": "system_gui" }, + { "code": -301, "label": "settings", "type": "system_gui" } + ] + } + } +} diff --git a/app/src/main/assets/ime/keyboard/org.florisboard.localization/popupMappings/default.json b/app/src/main/assets/ime/keyboard/org.florisboard.localization/popupMappings/default.json index ccf027ad07..8e56cedc01 100644 --- a/app/src/main/assets/ime/keyboard/org.florisboard.localization/popupMappings/default.json +++ b/app/src/main/assets/ime/keyboard/org.florisboard.localization/popupMappings/default.json @@ -1,18 +1,4 @@ { "all": { - "~enter": { - "main": { "code": -212, "label": "ime_ui_mode_media", "type": "system_gui" }, - "relevant": [ - { "code": -112, "label": "compact_layout_to_right", "type": "system_gui" }, - { "code": -213, "label": "ime_ui_mode_clipboard", "type": "system_gui"} - ] - }, - "~left": { - "main": { "code": -212, "label": "ime_ui_mode_media", "type": "system_gui" }, - "relevant": [ - { "code": -111, "label": "compact_layout_to_left", "type": "system_gui" }, - { "code": -301, "label": "settings", "type": "system_gui" } - ] - } } } diff --git a/app/src/main/assets/ime/theme/com.trackman.themes/extension.json b/app/src/main/assets/ime/theme/com.trackman.themes/extension.json new file mode 100644 index 0000000000..4a587aafc1 --- /dev/null +++ b/app/src/main/assets/ime/theme/com.trackman.themes/extension.json @@ -0,0 +1,25 @@ +{ + "$": "ime.extension.theme", + "meta": { + "id": "com.trackman.themes", + "version": "0.2.0", + "title": "Trackman default themes", + "description": "Trackman themes (both day and night) for the keyboard UI", + "maintainers": [ "trackman" ], + "license": "apache-2.0" + }, + "themes": [ + { + "id": "trackman_day", + "label": "Trackman Day", + "authors": [ "trackman" ], + "isNight": false + }, + { + "id": "trackman_night", + "label": "Trackman Night", + "authors": [ "trackman" ], + "isNight": true + } + ] +} diff --git a/app/src/main/assets/ime/theme/com.trackman.themes/stylesheets/trackman_day.json b/app/src/main/assets/ime/theme/com.trackman.themes/stylesheets/trackman_day.json new file mode 100644 index 0000000000..9535a1dae5 --- /dev/null +++ b/app/src/main/assets/ime/theme/com.trackman.themes/stylesheets/trackman_day.json @@ -0,0 +1,505 @@ +{ + "$schema": "https://schemas.florisboard.org/snygg/v2/stylesheet", + "@defines": { + "--primary": "#ec691b", + "--primary-variant": "#bc5314", + "--secondary": "#ff9800", + "--secondary-variant": "#e65100", + "--background": "#e0e0e0", + "--background-variant": "#d0d0d0", + "--surface": "#ffffff", + "--surface-variant": "#f5f5f5", + + "--popup-surface": "#eeeeee", + "--focused-popup-surface": "#bdbdbd", + + "--drag-marker": "rgb(255,0,0)", + "--spacer-color": "rgba(0 ,0, 0, 0.25)", + + "--one-hand-background": "#e8f5e9", + "--one-hand-foreground": "#424242", + + "--incognito-icon-color": "#00000011", + + "--on-primary": "#f0f0f0", + "--on-background": "#121212", + "--on-background-disabled": "rgb(175,175,175)", + "--on-surface": "#000000", + "--on-surface-variant": "#5f5f5f", + + "--shape": "rounded-corner(12dp, 12dp, 12dp, 12dp)", + "--shape-variant": "rounded-corner(16dp, 16dp, 16dp, 16dp)", + "--shape-chip": "rounded-corner(50%, 50%, 50%, 50%)" + }, + + "window": { + "background": "var(--background)", + "foreground": "var(--on-background)" + }, + "window[windowmode=`floating`]": { + "shadow-elevation": "8dp", + "shape": "rounded-corner(5%, 5%, 5%, 5%)" + }, + "window-move-handle[windowmode=`fixed`]": { + "background": "var(--surface)", + "foreground": "var(--primary)", + "font-size": "24sp", + "margin": "16dp 0dp", + "padding": "8dp", + "shape": "circle()" + }, + "window-resize-handle": { + "background": "var(--primary)" + }, + "window-resize-action[windowmode=`fixed`]": { + "background": "var(--primary)", + "foreground": "var(--on-primary)", + "font-size": "24sp", + "padding": "8dp", + "shape": "circle()" + }, + "window-resize-action[windowmode=`floating`]": { + "background": "var(--surface)", + "foreground": "var(--primary)", + "shape": "circle()" + }, + "floating-dock-to-fixed-indicator": { + "background": "var(--primary)" + }, + + "key": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "font-size": "26sp", + "font-family": "sans-serif", + "shape": "var(--shape)", + "shadow-elevation": "2dp", + "text-max-lines": "1" + }, + "key:pressed": { + "background": "var(--surface-variant)", + "foreground": "var(--on-surface)" + }, + "key[code=10]": { + "background": "var(--primary)", + "foreground": "var(--surface)" + }, + "key[code=10]:pressed": { + "background": "var(--primary-variant)", + "foreground": "var(--surface)" + }, + "key[code=32]": { + "background": "var(--surface)", + "foreground": "var(--on-surface-variant)", + "font-size": "12sp", + "text-overflow": "ellipsis" + }, + "key[code=-201,-202,-203]": { + "font-size": "22sp" + }, + "key[code=-204,-205]": { + "font-size": "16sp" + }, + "key[code=-205]": { + "text-max-lines": "2" + }, + "key[code=-11][shiftstate=`caps_lock`]": { + "foreground": "var(--secondary)" + }, + "key-hint": { + "background": "transparent", + "foreground": "var(--on-surface-variant)", + "font-family": "monospace", + "font-size": "12sp", + "padding": "0dp 1dp 1dp 0dp", + "text-max-lines": "1" + }, + "key-popup-box": { + "background": "var(--popup-surface)", + "foreground": "var(--on-surface)", + "font-size": "26sp", + "font-family": "sans-serif", + "shape": "var(--shape)", + "shadow-elevation": "2dp" + }, + "key-popup-element:focus": { + "background": "var(--focused-popup-surface)", + "shape": "var(--shape)" + }, + "key-popup-element[code=-255]": { + "font-size": "22sp", + "text-max-lines": "1" + }, + "key-popup-extended-indicator": { + "font-size": "20sp" + }, + + "smartbar": { + "font-size": "18sp" + }, + "smartbar-shared-actions-toggle": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "margin": "6dp", + "shape": "circle()", + "shadow-elevation": "2dp" + }, + "smartbar-extended-actions-toggle": { + "background": "transparent", + "foreground": "var(--on-surface-variant)", + "margin": "6dp", + "shape": "circle()" + }, + "smartbar-action-key": { + "background": "transparent", + "foreground": "var(--on-background)", + "shape": "var(--shape)" + }, + "smartbar-action-key:disabled": { + "foreground": "var(--on-background-disabled)" + }, + + "smartbar-actions-overflow": { + "margin": "4dp" + }, + "smartbar-actions-overflow-customize-button": { + "background": "var(--primary)", + "foreground": "var(--on-primary)", + "font-size": "14sp", + "margin": "0dp 8dp 0dp 0dp", + "shape": "rounded-corner(24dp, 24dp, 24dp, 24dp)" + }, + "smartbar-action-tile": { + "background": "var(--background-variant)", + "foreground": "var(--on-background)", + "font-size": "14sp", + "margin": "4dp", + "padding": "4dp", + "shape": "rounded-corner(20%, 20%, 20%, 20%)", + "text-align": "center", + "text-max-lines": "2", + "text-overflow": "ellipsis" + }, + "smartbar-action-tile:disabled": { + "foreground": "var(--on-background-disabled)" + }, + "smartbar-action-tile-icon": { + "font-size": "24sp", + "margin": "0dp 0dp 0dp 8dp" + }, + + "smartbar-actions-editor": { + "background": "var(--background)", + "foreground": "var(--on-background)", + "shape": "rounded-corner(24dp, 24dp, 0dp, 0dp)" + }, + "smartbar-actions-editor-header": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "font-size": "16sp", + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "smartbar-actions-editor-header-button": { + "margin": "4dp", + "shape": "circle()" + }, + "smartbar-actions-editor-subheader": { + "foreground": "var(--secondary)", + "font-size": "16sp", + "font-weight": "bold", + "padding": "12dp 16dp 12dp 8dp", + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "smartbar-actions-editor-tile-grid": { + "margin": "4dp 0dp" + }, + "smartbar-actions-editor-tile": { + "margin": "4dp", + "padding": "8dp", + "text-align": "center", + "text-max-lines": "2", + "text-overflow": "ellipsis" + }, + "smartbar-actions-editor-tile[code=-999]": { + "foreground": "var(--on-background-disabled)" + }, + "smartbar-actions-editor-tile[code=-991]": { + "foreground": "var(--drag-marker)" + }, + + "smartbar-candidate-word": { + "background": "transparent", + "foreground": "var(--on-background)", + "font-size": "14sp", + "margin": "4dp", + "padding": "8dp 0dp", + "shape": "rectangle()", + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "smartbar-candidate-word:pressed": { + "background": "var(--surface)", + "foreground": "var(--on-surface)" + }, + "smartbar-candidate-word-secondary-text": { + "font-size": "8sp", + "margin": "0dp 2dp 0dp 0dp" + }, + "smartbar-candidate-clip": { + "background": "transparent", + "foreground": "var(--on-background)", + "font-size": "14sp", + "margin": "4dp", + "padding": "8dp 0dp", + "shape": "rounded-corner(8%, 8%, 8%, 8%)", + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "smartbar-candidate-clip:pressed": { + "background": "var(--surface)", + "foreground": "var(--on-surface)" + }, + "smartbar-candidate-clip-icon": { + "margin": "0dp 0dp 4dp 0dp" + }, + "smartbar-candidate-spacer": { + "foreground": "var(--spacer-color)" + }, + + "clipboard-header": { + "foreground": "var(--on-background)", + "font-size": "16sp" + }, + "clipboard-header-button": { + "margin": "4dp", + "shape": "circle()" + }, + "clipboard-header-button:disabled": { + "foreground": "var(--on-background-disabled)" + }, + "clipboard-header-text": { + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "clipboard-subheader": { + "font-size": "14sp", + "margin": "6dp 10dp 6dp 6dp" + }, + "clipboard-content": { + "padding": "10dp 0dp" + }, + "clipboard-filter-row": { + "background": "var(--background-variant)", + "foreground": "var(--on-background)", + "padding": "0dp 0dp 4dp 0dp", + "shape": "var(--shape-variant)" + }, + "clipboard-filter-chip": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "margin": "4dp 4dp 0dp 4dp", + "padding": "8dp 4dp", + "shape": "var(--shape-chip)" + }, + "clipboard-filter-chip[state=`active`]": { + "background": "var(--primary)", + "foreground": "var(--on-primary)" + }, + "clipboard-filter-chip-text": { + "margin": "4dp 0dp 0dp 0dp" + }, + "clipboard-grid": { + "shape": "var(--shape-variant)" + }, + "clipboard-item": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "font-size": "14sp", + "margin": "4dp", + "shape": "var(--shape-variant)", + "shadow-elevation": "2dp", + "text-max-lines": "10", + "text-overflow": "ellipsis" + }, + "clipboard-item[type=`text`]": { + "padding": "12dp 8dp" + }, + "clipboard-item-description": { + "font-size": "12sp", + "font-style": "italic" + }, + "clipboard-item-popup": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "font-size": "14sp", + "margin": "4dp", + "shape": "var(--shape-variant)", + "shadow-elevation": "2dp" + }, + "clipboard-item-popup[type=`text`]": { + "padding": "12dp 8dp" + }, + "clipboard-item-timestamp": { + "font-size": "11sp", + "padding": "16dp 8dp" + }, + "clipboard-item-actions": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "margin": "4dp", + "shape": "var(--shape-variant)", + "shadow-elevation": "2dp" + }, + "clipboard-item-action": { + "font-size": "16sp", + "padding": "12dp" + }, + "clipboard-item-action-text": { + "margin": "4dp 0dp 0dp 0dp" + }, + "clipboard-clear-all-dialog": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "shape": "var(--shape-variant)", + "shadow-elevation": "1dp" + }, + "clipboard-clear-all-dialog-message": { + "padding": "16dp" + }, + "clipboard-clear-all-dialog-buttons": { + "padding": "4dp" + }, + "clipboard-clear-all-dialog-button": { + "background": "transparent", + "foreground": "var(--on-surface)", + "shape": "var(--shape-variant)" + }, + "clipboard-history-disabled-title": { + "font-weight": "bold" + }, + "clipboard-history-disabled-message": { + "padding": "0dp 4dp 0dp 8dp" + }, + "clipboard-history-disabled-button": { + "background": "var(--primary)", + "foreground": "var(--on-primary)", + "shape": "rounded-corner(24dp,24dp,24dp,24dp)" + }, + "clipboard-history-locked-title": { + "font-weight": "bold", + "text-align": "center" + }, + "clipboard-history-locked-message": { + "padding": "0dp 4dp 0dp 0dp", + "text-align": "center" + }, + + "extracted-landscape-input-layout": { + "background": "var(--background)" + }, + "extracted-landscape-input-field": { + "background": "transparent", + "foreground": "var(--on-background)", + "font-size": "16sp", + "shape": "rounded-corner(12dp, 12dp, 12dp, 12dp)", + "border-color": "var(--secondary)", + "border-width": "2dp" + }, + "extracted-landscape-input-action": { + "background": "var(--primary)", + "foreground": "var(--on-surface)", + "shape": "rounded-corner(4dp, 4dp, 4dp, 4dp)" + }, + + "glide-trail": { + "foreground": "var(--primary)" + }, + + "incognito-mode-indicator": { + "foreground": "var(--incognito-icon-color)" + }, + + "inline-autofill-chip": { + "background": "var(--surface)", + "foreground": "var(--on-surface)" + }, + + "media-emoji-subheader": { + "font-weight": "bold", + "margin": "4dp" + }, + "media-emoji-key": { + "background": "transparent", + "foreground": "var(--on-background)", + "font-size": "22sp", + "shape": "var(--shape)" + }, + "media-emoji-key:pressed": { + "background": "var(--surface)", + "foreground": "var(--on-surface)" + }, + "media-emoji-key-popup-box": { + "background": "var(--popup-surface)", + "foreground": "var(--on-surface)", + "font-size": "22sp", + "shape": "var(--shape)", + "shadow-elevation": "2dp" + }, + "media-emoji-key-popup-element:focus": { + "background": "var(--focused-popup-surface)", + "shape": "var(--shape)" + }, + "media-emoji-tab": { + "foreground": "var(--on-background)" + }, + "media-emoji-tab:focus": { + "foreground": "var(--primary)" + }, + "media-bottom-row-button": { + "padding": "16dp 0dp", + "shape": "var(--shape)" + }, + "media-emoji-key-popup-extended-indicator": { + "foreground": "inherit" + }, + + "one-handed-panel": { + "background": "var(--one-hand-background)", + "foreground": "var(--one-hand-foreground)" + }, + "one-handed-panel-button": { + "padding": "8dp", + "font-size": "24sp", + "background": "var(--surface)", + "shape": "circle()" + }, + + "subtype-panel": { + "background": "var(--background)", + "foreground": "var(--on-background)", + "shape": "rounded-corner(24dp, 24dp, 0dp, 0dp)" + }, + "subtype-panel-header": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "font-size": "18sp", + "padding": "12dp", + "text-align": "center", + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "subtype-panel-list-item": { + "font-size": "16sp", + "padding": "16dp" + }, + "subtype-panel-list-item-icon-leading": { + "font-size": "24sp", + "padding": "0dp 0dp 16dp 0dp" + }, + "subtype-panel-list-item-text": { + "text-max-lines": "1", + "text-overflow": "ellipsis" + } +} diff --git a/app/src/main/assets/ime/theme/com.trackman.themes/stylesheets/trackman_night.json b/app/src/main/assets/ime/theme/com.trackman.themes/stylesheets/trackman_night.json new file mode 100644 index 0000000000..2a7f721449 --- /dev/null +++ b/app/src/main/assets/ime/theme/com.trackman.themes/stylesheets/trackman_night.json @@ -0,0 +1,498 @@ +{ + "$schema": "https://schemas.florisboard.org/snygg/v2/stylesheet", + "@defines": { + "--primary": "#ec691b", + "--primary-variant": "#bc5314", + "--secondary": "#f57c00", + "--secondary-variant": "#e65100", + "--background": "#212121", + "--background-variant": "#313131", + "--surface": "#424242", + "--surface-variant": "#616161", + "--popup-surface": "#757575", + "--focused-popup-surface": "#bdbdbd", + "--drag-marker": "rgb(255,0,0)", + "--spacer-color": "rgba(255, 255, 255, 0.25)", + "--one-hand-background": "#1b5e20", + "--one-hand-foreground": "#eeeeee", + "--incognito-icon-color": "#ffffff11", + "--on-primary": "#f0f0f0", + "--on-background": "#dcdcdc", + "--on-background-disabled": "#dcdcdc48", + "--on-surface": "#ffffff", + "--on-surface-variant": "#a0a0a0", + + "--shape": "rounded-corner(8dp, 8dp, 8dp, 8dp)", + "--shape-variant": "rounded-corner(12dp, 12dp, 12dp, 12dp)", + "--shape-chip": "rounded-corner(50%, 50%, 50%, 50%)" + }, + + "window": { + "background": "var(--background)", + "foreground": "var(--on-background)" + }, + "window[windowmode=`floating`]": { + "shadow-elevation": "8dp", + "shape": "rounded-corner(5%, 5%, 5%, 5%)" + }, + "window-move-handle[windowmode=`fixed`]": { + "background": "var(--surface)", + "foreground": "var(--primary)", + "font-size": "24sp", + "margin": "16dp 0dp", + "padding": "8dp", + "shape": "circle()" + }, + "window-resize-handle": { + "background": "var(--primary)" + }, + "window-resize-action[windowmode=`fixed`]": { + "background": "var(--primary)", + "foreground": "var(--on-primary)", + "font-size": "24sp", + "padding": "8dp", + "shape": "circle()" + }, + "window-resize-action[windowmode=`floating`]": { + "background": "var(--surface)", + "foreground": "var(--primary)", + "shape": "circle()" + }, + "floating-dock-to-fixed-indicator": { + "background": "var(--primary)" + }, + + "key": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "font-size": "22sp", + "shape": "var(--shape)", + "shadow-elevation": "2dp", + "text-max-lines": "1" + }, + "key:pressed": { + "background": "var(--surface-variant)", + "foreground": "var(--on-surface)" + }, + "key[code=10]": { + "background": "var(--primary)", + "foreground": "var(--on-surface)" + }, + "key[code=10]:pressed": { + "background": "var(--primary-variant)", + "foreground": "var(--on-surface)" + }, + "key[code=32]": { + "background": "var(--surface)", + "foreground": "var(--on-surface-variant)", + "font-size": "12sp", + "text-overflow": "ellipsis" + }, + "key[code=-201,-202,-203]": { + "font-size": "18sp" + }, + "key[code=-204,-205]": { + "font-size": "12sp" + }, + "key[code=-205]": { + "text-max-lines": "2" + }, + "key[code=-11][shiftstate=`caps_lock`]": { + "foreground": "var(--secondary)" + }, + "key-hint": { + "background": "transparent", + "foreground": "var(--on-surface-variant)", + "font-family": "monospace", + "font-size": "12sp", + "padding": "0dp 1dp 1dp 0dp", + "text-max-lines": "1" + }, + "key-popup-box": { + "background": "var(--popup-surface)", + "foreground": "var(--on-surface)", + "font-size": "22sp", + "shape": "var(--shape)", + "shadow-elevation": "2dp" + }, + "key-popup-element:focus": { + "background": "var(--focused-popup-surface)", + "shape": "var(--shape)" + }, + "key-popup-element[code=-255]": { + "font-size": "18sp", + "text-max-lines": "1" + }, + "key-popup-extended-indicator": { + "font-size": "16sp" + }, + + "smartbar": { + "font-size": "18sp" + }, + "smartbar-shared-actions-toggle": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "margin": "6dp", + "shape": "circle()", + "shadow-elevation": "2dp" + }, + "smartbar-extended-actions-toggle": { + "background": "transparent", + "foreground": "var(--on-surface-variant)", + "margin": "6dp", + "shape": "circle()" + }, + "smartbar-action-key": { + "background": "transparent", + "foreground": "var(--on-background)", + "shape": "var(--shape)" + }, + "smartbar-action-key:disabled": { + "foreground": "var(--on-background-disabled)" + }, + + "smartbar-actions-overflow": { + "margin": "4dp" + }, + "smartbar-actions-overflow-customize-button": { + "background": "var(--primary)", + "foreground": "var(--on-primary)", + "font-size": "14sp", + "margin": "0dp 8dp 0dp 0dp", + "shape": "rounded-corner(24dp, 24dp, 24dp, 24dp)" + }, + "smartbar-action-tile": { + "background": "var(--background-variant)", + "foreground": "var(--on-background)", + "font-size": "14sp", + "margin": "4dp", + "padding": "4dp", + "shape": "rounded-corner(20%, 20%, 20%, 20%)", + "text-align": "center", + "text-max-lines": "2", + "text-overflow": "ellipsis" + }, + "smartbar-action-tile:disabled": { + "foreground": "var(--on-background-disabled)" + }, + "smartbar-action-tile-icon": { + "font-size": "24sp", + "margin": "0dp 0dp 0dp 8dp" + }, + + "smartbar-actions-editor": { + "background": "var(--background)", + "foreground": "var(--on-background)", + "shape": "rounded-corner(24dp, 24dp, 0dp, 0dp)" + }, + "smartbar-actions-editor-header": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "font-size": "16sp", + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "smartbar-actions-editor-header-button": { + "margin": "4dp", + "shape": "circle()" + }, + "smartbar-actions-editor-subheader": { + "foreground": "var(--secondary)", + "font-size": "16sp", + "font-weight": "bold", + "padding": "12dp 16dp 12dp 8dp", + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "smartbar-actions-editor-tile-grid": { + "margin": "4dp 0dp" + }, + "smartbar-actions-editor-tile": { + "margin": "4dp", + "padding": "8dp", + "text-align": "center", + "text-max-lines": "2", + "text-overflow": "ellipsis" + }, + "smartbar-actions-editor-tile[code=-999]": { + "foreground": "var(--on-background-disabled)" + }, + "smartbar-actions-editor-tile[code=-991]": { + "foreground": "var(--drag-marker)" + }, + + "smartbar-candidate-word": { + "background": "transparent", + "foreground": "var(--on-background)", + "font-size": "14sp", + "margin": "4dp", + "padding": "8dp 0dp", + "shape": "rectangle()", + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "smartbar-candidate-word:pressed": { + "background": "var(--surface)", + "foreground": "var(--on-surface)" + }, + "smartbar-candidate-word-secondary-text": { + "font-size": "8sp", + "margin": "0dp 2dp 0dp 0dp" + }, + "smartbar-candidate-clip": { + "background": "transparent", + "foreground": "var(--on-background)", + "font-size": "14sp", + "margin": "4dp", + "padding": "8dp 0dp", + "shape": "rounded-corner(8%, 8%, 8%, 8%)", + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "smartbar-candidate-clip:pressed": { + "background": "var(--surface)", + "foreground": "var(--on-surface)" + }, + "smartbar-candidate-clip-icon": { + "margin": "0dp 0dp 4dp 0dp" + }, + "smartbar-candidate-spacer": { + "foreground": "var(--spacer-color)" + }, + + "clipboard-header": { + "foreground": "var(--on-background)", + "font-size": "16sp" + }, + "clipboard-header-button": { + "margin": "4dp", + "shape": "circle()" + }, + "clipboard-header-button:disabled": { + "foreground": "var(--on-background-disabled)" + }, + "clipboard-header-text": { + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "clipboard-subheader": { + "font-size": "14sp", + "margin": "6dp 10dp 6dp 6dp" + }, + "clipboard-content": { + "padding": "10dp 0dp" + }, + "clipboard-filter-row": { + "background": "var(--background-variant)", + "foreground": "var(--on-background)", + "padding": "0dp 0dp 4dp 0dp", + "shape": "var(--shape-variant)" + }, + "clipboard-filter-chip": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "margin": "4dp 4dp 0dp 4dp", + "padding": "8dp 4dp", + "shape": "var(--shape-chip)" + }, + "clipboard-filter-chip[state=`active`]": { + "background": "var(--primary)", + "foreground": "var(--on-primary)" + }, + "clipboard-filter-chip-text": { + "margin": "4dp 0dp 0dp 0dp" + }, + "clipboard-grid": { + "shape": "var(--shape-variant)" + }, + "clipboard-item": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "font-size": "14sp", + "margin": "4dp", + "shape": "var(--shape-variant)", + "shadow-elevation": "2dp", + "text-max-lines": "10", + "text-overflow": "ellipsis" + }, + "clipboard-item[type=`text`]": { + "padding": "12dp 8dp" + }, + "clipboard-item-description": { + "font-size": "12sp", + "font-style": "italic" + }, + "clipboard-item-popup": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "font-size": "14sp", + "margin": "4dp", + "shape": "var(--shape-variant)", + "shadow-elevation": "2dp" + }, + "clipboard-item-popup[type=`text`]": { + "padding": "12dp 8dp" + }, + "clipboard-item-timestamp": { + "font-size": "11sp", + "padding": "16dp 8dp" + }, + "clipboard-item-actions": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "margin": "4dp", + "shape": "var(--shape-variant)", + "shadow-elevation": "2dp" + }, + "clipboard-item-action": { + "font-size": "16sp", + "padding": "12dp" + }, + "clipboard-item-action-text": { + "margin": "4dp 0dp 0dp 0dp" + }, + "clipboard-clear-all-dialog": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "shape": "var(--shape-variant)", + "shadow-elevation": "1dp" + }, + "clipboard-clear-all-dialog-message": { + "padding": "16dp" + }, + "clipboard-clear-all-dialog-buttons": { + "padding": "4dp" + }, + "clipboard-clear-all-dialog-button": { + "background": "transparent", + "foreground": "var(--on-surface)", + "shape": "var(--shape-variant)" + }, + "clipboard-history-disabled-title": { + "font-weight": "bold" + }, + "clipboard-history-disabled-message": { + "padding": "0dp 4dp 0dp 8dp" + }, + "clipboard-history-disabled-button": { + "background": "var(--primary)", + "foreground": "var(--on-primary)", + "shape": "rounded-corner(24dp,24dp,24dp,24dp)" + }, + "clipboard-history-locked-title": { + "font-weight": "bold", + "text-align": "center" + }, + "clipboard-history-locked-message": { + "padding": "0dp 4dp 0dp 0dp", + "text-align": "center" + }, + + "extracted-landscape-input-layout": { + "background": "var(--background)" + }, + "extracted-landscape-input-field": { + "background": "transparent", + "foreground": "var(--on-background)", + "font-size": "16sp", + "shape": "rounded-corner(12dp, 12dp, 12dp, 12dp)", + "border-color": "var(--secondary)", + "border-width": "2dp" + }, + "extracted-landscape-input-action": { + "background": "var(--primary)", + "foreground": "var(--on-surface)", + "shape": "rounded-corner(4dp, 4dp, 4dp, 4dp)" + }, + + "glide-trail": { + "foreground": "var(--primary)" + }, + + "incognito-mode-indicator": { + "foreground": "var(--incognito-icon-color)" + }, + + "inline-autofill-chip": { + "background": "var(--surface)", + "foreground": "var(--on-surface)" + }, + + "media-emoji-subheader": { + "font-weight": "bold", + "margin": "4dp" + }, + "media-emoji-key": { + "background": "transparent", + "foreground": "var(--on-background)", + "font-size": "22sp", + "shape": "var(--shape)" + }, + "media-emoji-key:pressed": { + "background": "var(--surface)", + "foreground": "var(--on-surface)" + }, + "media-emoji-key-popup-box": { + "background": "var(--popup-surface)", + "foreground": "var(--on-surface)", + "font-size": "22sp", + "shape": "var(--shape)", + "shadow-elevation": "2dp" + }, + "media-emoji-key-popup-element:focus": { + "background": "var(--focused-popup-surface)", + "shape": "var(--shape)" + }, + "media-emoji-tab": { + "foreground": "var(--on-background)" + }, + "media-emoji-tab:focus": { + "foreground": "var(--primary)" + }, + "media-bottom-row-button": { + "padding": "16dp 0dp", + "shape": "var(--shape)" + }, + "media-emoji-key-popup-extended-indicator": { + "foreground": "inherit" + }, + + "one-handed-panel": { + "background": "var(--one-hand-background)", + "foreground": "var(--one-hand-foreground)" + }, + "one-handed-panel-button": { + "padding": "8dp", + "font-size": "24sp", + "background": "var(--surface)", + "shape": "circle()" + }, + + "subtype-panel": { + "background": "var(--background)", + "foreground": "var(--on-background)", + "shape": "rounded-corner(24dp, 24dp, 0dp, 0dp)" + }, + "subtype-panel-header": { + "background": "var(--surface)", + "foreground": "var(--on-surface)", + "font-size": "18sp", + "padding": "12dp", + "text-align": "center", + "text-max-lines": "1", + "text-overflow": "ellipsis" + }, + "subtype-panel-list-item": { + "font-size": "16sp", + "padding": "16dp" + }, + "subtype-panel-list-item-icon-leading": { + "font-size": "24sp", + "padding": "0dp 0dp 16dp 0dp" + }, + "subtype-panel-list-item-text": { + "text-max-lines": "1", + "text-overflow": "ellipsis" + } +} diff --git a/app/src/main/kotlin/dev/patrickgold/florisboard/app/AppPrefs.kt b/app/src/main/kotlin/dev/patrickgold/florisboard/app/AppPrefs.kt index 839b0b8983..5a133c00e9 100644 --- a/app/src/main/kotlin/dev/patrickgold/florisboard/app/AppPrefs.kt +++ b/app/src/main/kotlin/dev/patrickgold/florisboard/app/AppPrefs.kt @@ -19,6 +19,7 @@ package dev.patrickgold.florisboard.app import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration +import dev.patrickgold.florisboard.app.localization.Subtypes import dev.patrickgold.florisboard.app.settings.theme.ColorPreferenceSerializer import dev.patrickgold.florisboard.app.settings.theme.DisplayKbdAfterDialogs import dev.patrickgold.florisboard.app.settings.theme.SnyggLevel @@ -91,7 +92,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val suggestionEnabled = boolean( key = "clipboard__suggestion_enabled", - default = true, + default = false, ) val suggestionTimeout = int( key = "clipboard__suggestion_timeout", @@ -168,7 +169,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val doubleSpacePeriod = boolean( key = "correction__double_space_period", - default = true, + default = false, ) val rememberCapsLockState = boolean( key = "correction__remember_caps_lock_state", @@ -216,11 +217,11 @@ abstract class FlorisPreferenceModel : PreferenceModel() { inner class Dictionary { val enableSystemUserDictionary = boolean( key = "suggestion__enable_system_user_dictionary", - default = true, + default = false, ) val enableFlorisUserDictionary = boolean( key = "suggestion__enable_floris_user_dictionary", - default = true, + default = false, ) } @@ -236,7 +237,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val historyEnabled = boolean( key = "emoji__history_enabled", - default = true, + default = false, ) val historyData = custom( key = "emoji__history_data", @@ -261,7 +262,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val suggestionEnabled = boolean( key = "emoji__suggestion_enabled", - default = true, + default = false, ) val suggestionType = enum( key = "emoji__suggestion_type", @@ -269,7 +270,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val suggestionUpdateHistory = boolean( key = "emoji__suggestion_update_history", - default = true, + default = false, ) val suggestionCandidateShowName = boolean( key = "emoji__suggestion_candidate_show_name", @@ -297,11 +298,11 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val swipeLeft = enum( key = "gestures__swipe_left", - default = SwipeAction.SWITCH_TO_NEXT_SUBTYPE, + default = SwipeAction.NO_ACTION, ) val swipeRight = enum( key = "gestures__swipe_right", - default = SwipeAction.SWITCH_TO_PREV_SUBTYPE, + default = SwipeAction.NO_ACTION, ) val spaceBarSwipeUp = enum( key = "gestures__space_bar_swipe_up", @@ -317,7 +318,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val spaceBarLongPress = enum( key = "gestures__space_bar_long_press", - default = SwipeAction.SHOW_INPUT_METHOD_PICKER, + default = SwipeAction.NO_ACTION, ) val deleteKeySwipeLeft = enum( key = "gestures__delete_key_swipe_left", @@ -345,7 +346,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val showTrail = boolean( key = "glide__show_trail", - default = true, + default = false, ) val trailDuration = int( key = "glide__trail_fade_duration", @@ -353,7 +354,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val showPreview = boolean( key = "glide__show_preview", - default = true, + default = false, ) val previewRefreshDelay = int( key = "glide__preview_refresh_delay", @@ -361,7 +362,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val immediateBackspaceDeletesWord = boolean( key = "glide__immediate_backspace_deletes_word", - default = true, + default = false, ) } @@ -369,7 +370,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { inner class InputFeedback { val audioEnabled = boolean( key = "input_feedback__audio_enabled", - default = true, + default = false, ) val audioActivationMode = enum( key = "input_feedback__audio_activation_mode", @@ -381,7 +382,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val audioFeatKeyPress = boolean( key = "input_feedback__audio_feat_key_press", - default = true, + default = false, ) val audioFeatKeyLongPress = boolean( key = "input_feedback__audio_feat_key_long_press", @@ -402,7 +403,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { val hapticEnabled = boolean( key = "input_feedback__haptic_enabled", - default = true, + default = false, ) val hapticActivationMode = enum( key = "input_feedback__haptic_activation_mode", @@ -422,7 +423,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val hapticFeatKeyPress = boolean( key = "input_feedback__haptic_feat_key_press", - default = true, + default = false, ) val hapticFeatKeyLongPress = boolean( key = "input_feedback__haptic_feat_key_long_press", @@ -430,7 +431,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val hapticFeatKeyRepeatedAction = boolean( key = "input_feedback__haptic_feat_key_repeated_action", - default = true, + default = false, ) val hapticFeatGestureSwipe = boolean( key = "input_feedback__haptic_feat_gesture_swipe", @@ -438,7 +439,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val hapticFeatGestureMovingSwipe = boolean( key = "input_feedback__haptic_feat_gesture_moving_swipe", - default = true, + default = false, ) } @@ -483,7 +484,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val hintedNumberRowEnabled = boolean( key = "keyboard__hinted_number_row_enabled", - default = true, + default = false, ) val hintedNumberRowMode = enum( key = "keyboard__hinted_number_row_mode", @@ -491,7 +492,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val hintedSymbolsEnabled = boolean( key = "keyboard__hinted_symbols_enabled", - default = true, + default = false, ) val hintedSymbolsMode = enum( key = "keyboard__hinted_symbols_mode", @@ -503,11 +504,11 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val utilityKeyAction = enum( key = "keyboard__utility_key_action", - default = UtilityKeyAction.DYNAMIC_SWITCH_LANGUAGE_EMOJIS, + default = UtilityKeyAction.SWITCH_LANGUAGE, ) val spaceBarMode = enum( key = "keyboard__space_bar_display_mode", - default = SpaceBarMode.CURRENT_LANGUAGE, + default = SpaceBarMode.NOTHING, ) val capitalizationBehavior = enum( key = "keyboard__capitalization_behavior", @@ -523,7 +524,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val landscapeInputUiMode = enum( key = "keyboard__landscape_input_ui_mode", - default = LandscapeInputUiMode.DYNAMICALLY_SHOW, + default = LandscapeInputUiMode.NEVER_SHOW, ) val keySpacingVertical = int( key = "keyboard__key_spacing_vertical", @@ -535,7 +536,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val popupEnabled = boolean( key = "keyboard__popup_enabled", - default = true, + default = false, ) val mergeHintPopupsEnabled = boolean( key = "keyboard__merge_hint_popups_enabled", @@ -585,7 +586,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val subtypes = string( key = "localization__subtypes", - default = "[]", + default = Subtypes.TRACKMAN, ) } @@ -622,7 +623,7 @@ abstract class FlorisPreferenceModel : PreferenceModel() { inner class Smartbar { val enabled = boolean( key = "smartbar__enabled", - default = true, + default = false, ) val layout = enum( key = "smartbar__layout", @@ -668,11 +669,11 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val useContacts = boolean( key = "spelling__use_contacts", - default = true, + default = false, ) val useUdmEntries = boolean( key = "spelling__use_udm_entries", - default = true, + default = false, ) } @@ -713,12 +714,12 @@ abstract class FlorisPreferenceModel : PreferenceModel() { ) val dayThemeId = custom( key = "theme__day_theme_id", - default = extCoreTheme("floris_day"), + default = extCoreTheme("trackman_day"), serializer = ExtensionComponentName.Serializer, ) val nightThemeId = custom( key = "theme__night_theme_id", - default = extCoreTheme("floris_night"), + default = extCoreTheme("trackman_night"), serializer = ExtensionComponentName.Serializer, ) val accentColor = custom( diff --git a/app/src/main/kotlin/dev/patrickgold/florisboard/app/FlorisAppActivity.kt b/app/src/main/kotlin/dev/patrickgold/florisboard/app/FlorisAppActivity.kt index a05e288a86..cc6228df71 100644 --- a/app/src/main/kotlin/dev/patrickgold/florisboard/app/FlorisAppActivity.kt +++ b/app/src/main/kotlin/dev/patrickgold/florisboard/app/FlorisAppActivity.kt @@ -123,7 +123,7 @@ class FlorisAppActivity : ComponentActivity() { setContent { ProvideLocalizedResources( resourcesContext, - appName = R.string.app_name, + appName = R.string.floris_app_name, ) { FlorisAppTheme(theme = appTheme) { Surface(color = MaterialTheme.colorScheme.background) { diff --git a/app/src/main/kotlin/dev/patrickgold/florisboard/app/localization/Subtypes.kt b/app/src/main/kotlin/dev/patrickgold/florisboard/app/localization/Subtypes.kt new file mode 100644 index 0000000000..89ca93ff55 --- /dev/null +++ b/app/src/main/kotlin/dev/patrickgold/florisboard/app/localization/Subtypes.kt @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2026 The FlorisBoard Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package dev.patrickgold.florisboard.app.localization + +object Subtypes { + + const val TRACKMAN = + """ + [ + { + "id": 1769611616082, + "primaryLocale": "en-US", + "secondaryLocales": [], + "nlpProviders": { + "spelling": "org.florisboard.nlp.providers.latin", + "suggestion": "org.florisboard.nlp.providers.latin" + }, + "composer": "org.florisboard.composers:appender", + "currencySet": "org.florisboard.currencysets:dollar", + "punctuationRule": "org.florisboard.localization:default", + "popupMapping": "org.florisboard.localization:en", + "layoutMap": { + "characters": "org.florisboard.layouts:qwerty", + "symbols": "org.florisboard.layouts:western", + "symbols2": "org.florisboard.layouts:western", + "numeric": "org.florisboard.layouts:western_arabic", + "numericAdvanced": "org.florisboard.layouts:western_arabic", + "numericRow": "org.florisboard.layouts:western_arabic", + "phone": "org.florisboard.layouts:telpad", + "phone2": "org.florisboard.layouts:telpad" + } + }, + { + "id": 1769611643712, + "primaryLocale": "ja-JP-jis", + "secondaryLocales": [], + "nlpProviders": { + "spelling": "org.florisboard.nlp.providers.latin", + "suggestion": "org.florisboard.nlp.providers.latin" + }, + "composer": "org.florisboard.composers:kana-unicode", + "currencySet": "org.florisboard.currencysets:yen", + "punctuationRule": "org.florisboard.localization:default", + "popupMapping": "org.florisboard.localization:ja-JP-jis", + "layoutMap": { + "characters": "org.florisboard.layouts:jis", + "symbols": "org.florisboard.layouts:cjk", + "symbols2": "org.florisboard.layouts:cjk", + "numeric": "org.florisboard.layouts:western_arabic", + "numericAdvanced": "org.florisboard.layouts:western_arabic", + "numericRow": "org.florisboard.layouts:cjk", + "phone": "org.florisboard.layouts:telpad", + "phone2": "org.florisboard.layouts:telpad" + } + }, + { + "id": 1769611666307, + "primaryLocale": "ko-KR", + "secondaryLocales": [], + "nlpProviders": { + "spelling": "org.florisboard.nlp.providers.latin", + "suggestion": "org.florisboard.nlp.providers.latin" + }, + "composer": "org.florisboard.composers:hangul-unicode", + "currencySet": "org.florisboard.currencysets:south_korean_won", + "punctuationRule": "org.florisboard.localization:default", + "popupMapping": "org.florisboard.localization:ko", + "layoutMap": { + "characters": "org.florisboard.layouts:korean_phonetic", + "symbols": "org.florisboard.layouts:western", + "symbols2": "org.florisboard.layouts:western", + "numeric": "org.florisboard.layouts:western_arabic", + "numericAdvanced": "org.florisboard.layouts:western_arabic", + "numericRow": "org.florisboard.layouts:western_arabic", + "phone": "org.florisboard.layouts:telpad", + "phone2": "org.florisboard.layouts:telpad" + } + } + ] + """ +} diff --git a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/FlorisCopyToClipboardActivity.kt b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/FlorisCopyToClipboardActivity.kt index 179a364ab0..2b859db29b 100644 --- a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/FlorisCopyToClipboardActivity.kt +++ b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/clipboard/FlorisCopyToClipboardActivity.kt @@ -138,7 +138,7 @@ class FlorisCopyToClipboardActivity : ComponentActivity() { val prefs by FlorisPreferenceStore ProvideLocalizedResources( resourcesContext = this, - appName = R.string.app_name, + appName = R.string.floris_app_name, forceLayoutDirection = LayoutDirection.Ltr, ) { val theme by prefs.other.settingsTheme.collectAsState() diff --git a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/landscapeinput/ExtractedInputRootView.kt b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/landscapeinput/ExtractedInputRootView.kt index 8f70a4aeb5..ed54663e35 100644 --- a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/landscapeinput/ExtractedInputRootView.kt +++ b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/landscapeinput/ExtractedInputRootView.kt @@ -85,7 +85,7 @@ class ExtractedInputRootView(val ims: FlorisImeService, eet: ExtractEditText?) : ) { ProvideLocalizedResources( ims.resourcesContext, - appName = R.string.app_name, + appName = R.string.floris_app_name, forceLayoutDirection = LayoutDirection.Ltr, ) { FlorisImeTheme { diff --git a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/TextKeyboardLayout.kt b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/TextKeyboardLayout.kt index 147958b6db..153f1fd79e 100644 --- a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/TextKeyboardLayout.kt +++ b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/text/keyboard/TextKeyboardLayout.kt @@ -27,6 +27,7 @@ import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.absoluteOffset import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.runtime.Composable @@ -56,6 +57,7 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.toSize import dev.patrickgold.florisboard.FlorisImeService import dev.patrickgold.florisboard.app.FlorisPreferenceStore @@ -343,7 +345,7 @@ private fun TextKeyButton( val isTelPadKey = key.computedData.type == KeyType.NUMERIC && evaluator.keyboard.mode == KeyboardMode.PHONE key.label?.let { label -> var customLabel = label - if (key.computedData.code == KeyCode.SPACE) { + if (key.computedData.isSpaceKey()) { val prefs by FlorisPreferenceStore val spaceBarMode by prefs.keyboard.spaceBarMode.collectAsState() when (spaceBarMode) { @@ -366,6 +368,7 @@ private fun TextKeyButton( selector = selector, modifier = Modifier .wrapContentSize() + .padding(all = 4.dp) .align(if (isTelPadKey) BiasAlignment(0.5f, 0f) else Alignment.TopEnd), text = hintedLabel, ) @@ -583,7 +586,7 @@ private class TextKeyboardLayoutController( false } KeyCode.LANGUAGE_SWITCH -> { - inputEventDispatcher.sendDownUp(TextKeyData.SYSTEM_INPUT_METHOD_PICKER) + inputEventDispatcher.sendDownUp(TextKeyData.SHOW_SUBTYPE_PICKER) true } else -> { diff --git a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/theme/ThemeExtensionComponent.kt b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/theme/ThemeExtensionComponent.kt index 4a8fb473ef..40b4972660 100644 --- a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/theme/ThemeExtensionComponent.kt +++ b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/theme/ThemeExtensionComponent.kt @@ -27,7 +27,7 @@ import org.florisboard.lib.snygg.SnyggStylesheetEditor @Suppress("NOTHING_TO_INLINE") inline fun extCoreTheme(id: String) = ExtensionComponentName( - extensionId = "org.florisboard.themes", + extensionId = "com.trackman.themes", componentId = id, ) diff --git a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/window/ImeRootView.kt b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/window/ImeRootView.kt index e5860295c4..bc113db77a 100644 --- a/app/src/main/kotlin/dev/patrickgold/florisboard/ime/window/ImeRootView.kt +++ b/app/src/main/kotlin/dev/patrickgold/florisboard/ime/window/ImeRootView.kt @@ -63,7 +63,7 @@ class ImeRootView(val ims: FlorisImeService) : AbstractComposeView(ims) { ) { ProvideLocalizedResources( resourcesContext = ims.resourcesContext, - appName = R.string.app_name, + appName = R.string.floris_app_name, forceLayoutDirection = LayoutDirection.Ltr, ) { FlorisImeTheme { diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 37ebff2e61..39d827579c 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -549,7 +549,7 @@ Klik di sini untuk menyelesaikan masalah ini. {app_name} sekarang sudah diaktifkan di sistem Anda. Untuk menggunakannya secara aktif, beralihlah ke {app_name} dengan memilihnya di dialog pemilih input! Ubah Papan Ketik Izinkan Notifikasi Pelaporan Crash - Per-Android 13+, apl harus meminta izin untuk + Per-Android 13+, apl harus meminta izin untuk mengirim notifikasi. Pada Florisboard, izin tersebut hanya digunakan untuk membuka jendela pelaporan crash pada saat terjadi crash. Izin ini dapat diubah kapanpun pada setelan sistem. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2995f45dc5..f0cfd414d2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -892,10 +892,10 @@ Автоматическая сортировка (добавление в конец) Автоматическое изменение порядка расположения эмодзи в зависимости от их использования. Новые эмодзи добавляются в конец. Ручная сортировка (добавление в начало) - Не происходит автоматической перестановки эмодзи в зависимости от их использования. + Не происходит автоматической перестановки эмодзи в зависимости от их использования. Новые эмодзи добавляются в начало. Ручная сортировка (добавление в конец) - Не происходит автоматической перестановки эмодзи в зависимости от их использования. + Не происходит автоматической перестановки эмодзи в зависимости от их использования. Новые эмодзи добавляются в конец. Цвет кожи {emoji} по умолчанию Светлый цвет кожи {emoji} diff --git a/app/src/main/res/values/strings_dont_translate.xml b/app/src/main/res/values/strings_dont_translate.xml index 9b4167cca2..490a857b92 100644 --- a/app/src/main/res/values/strings_dont_translate.xml +++ b/app/src/main/res/values/strings_dont_translate.xml @@ -1,5 +1,5 @@ - @string/app_name + Trackman Keyboard https://github.com/florisboard/florisboard https://github.com/florisboard/florisboard/issues diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 0000000000..19ad276b86 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,97 @@ +trigger: none + +pool: + vmImage: 'ubuntu-latest' + +variables: + - group: TrackmanKeyboard + +steps: + - checkout: self + submodules: true + + - task: JavaToolInstaller@0 + inputs: + versionSpec: '17' + jdkArchitectureOption: 'x64' + jdkSourceOption: 'PreInstalled' + displayName: 'Set up JDK 17' + + - script: | + sudo apt-get update + sudo apt-get install -y cmake ninja-build + displayName: 'Set up CMake and Ninja' + + - script: | + LATEST_BUILD_TOOLS=$(ls -1 $ANDROID_HOME/build-tools | sort -n | tail -1) + echo "##vso[task.setvariable variable=LATEST_BUILD_TOOLS]$LATEST_BUILD_TOOLS" + echo "Found build-tools: $LATEST_BUILD_TOOLS" + displayName: 'Detect latest Android Build Tools' + + - task: DownloadSecureFile@1 + name: downloadSigningCert + inputs: + secureFile: $(keystoreFileName) + displayName: 'Download Standard Signing Certificate' + + - task: DownloadSecureFile@1 + name: platformKeyFile + inputs: + secureFile: msinda2_platform.pk8 + displayName: 'Download MSI Platform Key' + + - task: DownloadSecureFile@1 + name: platformCertFile + inputs: + secureFile: msinda2_platform.x509.pem + displayName: 'Download MSI Platform Certificate' + + - script: | + cp keystore.properties keystore.properties.bak + cat < keystore.properties + storeFile=$(downloadSigningCert.secureFilePath) + storePassword=$(keystorePassword) + keyAlias=$(keystoreAlias) + keyPassword=$(keystorePassword) + EOF + displayName: 'Configure Release keystore.properties' + + - script: ./gradlew clean assembleStandardRelease assembleMsiRelease + displayName: 'Build Release APKs (Standard & MSI)' + + - script: mv app/build/outputs/apk/standard/release/app-standard-release.apk dk.trackman.keyboard.apk + displayName: 'Rename Standard Signed APK' + + # Create MSI Variant: Re-sign the APK with Platform Keys + - script: | + echo "Locating apksigner..." + APKSIGNER="$ANDROID_HOME/build-tools/$(LATEST_BUILD_TOOLS)/apksigner" + + echo "Signing MSI APK with Platform Keys..." + "$APKSIGNER" sign \ + --key $(platformKeyFile.secureFilePath) \ + --cert $(platformCertFile.secureFilePath) \ + --out dk.trackman.keyboard.msinda2.apk \ + app/build/outputs/apk/msi/release/app-msi-release.apk + + echo "Verifying MSI Signature..." + "$APKSIGNER" verify --verbose dk.trackman.keyboard.msinda2.apk + displayName: 'Sign MSI APK with Platform Keys' + + - script: mv keystore.properties.bak keystore.properties + displayName: 'Restore original keystore.properties' + + - script: | + ./gradlew --stop + displayName: 'Gradlew stop' + + - script: | + cp dk.trackman.keyboard.apk $(Build.ArtifactStagingDirectory) + cp dk.trackman.keyboard.msinda2.apk $(Build.ArtifactStagingDirectory) + displayName: 'Copy APKs to Artifact folder' + + - task: PublishBuildArtifacts@1 + displayName: 'Publish APK Artifacts' + inputs: + PathtoPublish: '$(Build.ArtifactStagingDirectory)' + ArtifactName: 'trackman-keyboard-release' diff --git a/crowdin.yml b/crowdin.yml deleted file mode 100644 index 78f56e1ddb..0000000000 --- a/crowdin.yml +++ /dev/null @@ -1,47 +0,0 @@ -project_id_env: "FSEC_CROWDIN_PROJECT_ID" -api_token_env: "FSEC_CROWDIN_PERSONAL_TOKEN" -base_path: "." -base_url: "https://api.crowdin.com" -preserve_hierarchy: true - -files: - - source: "/app/src/main/res/values/strings.xml" - translation: "/app/src/main/res/values-%android_code%/%original_file_name%" - translate_attributes: 0 - languages_mapping: - android_code: - ar: "ar" - ast: "ast-rES" - bg: "bg" - bs: "bs" - ca: "ca" - ckb: "ckb" - cs: "cs" - da: "da" - de: "de" - el: "el" - eo: "eo" - es-ES: "es" - fa: "fa" - fi: "fi" - fr: "fr" - he: "iw" - hr: "hr" - hu: "hu" - id: "in" - it: "it" - ja: "ja" - kmr: "ku" - mk: "mk" - nl: "nl" - "no": "no" - pl: "pl" - pt-PT: "pt" - ru: "ru" - sk: "sk" - sl: "sl" - sr: "sr" - sv-SE: "sv" - tr: "tr" - uk: "uk" - zgh: "zgh" diff --git a/debug.keystore b/debug.keystore new file mode 100644 index 0000000000..24e4a192bb Binary files /dev/null and b/debug.keystore differ diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt index a417fccff7..223496ad98 100644 --- a/fastlane/metadata/android/en-US/title.txt +++ b/fastlane/metadata/android/en-US/title.txt @@ -1 +1 @@ -FlorisBoard \ No newline at end of file +FlorisBoard diff --git a/fastlane/metadata/android/es-ES/full_description.txt b/fastlane/metadata/android/es-ES/full_description.txt index b07a918260..4bbca89eff 100644 --- a/fastlane/metadata/android/es-ES/full_description.txt +++ b/fastlane/metadata/android/es-ES/full_description.txt @@ -15,4 +15,4 @@
  • Símbolos especiales integrados en distribuciones de caracteres
  • Barra de herramientas de portapapeles/cursor
  • Gestor/historial del portapapeles
  • - \ No newline at end of file + diff --git a/fastlane/metadata/android/es-ES/title.txt b/fastlane/metadata/android/es-ES/title.txt index a417fccff7..223496ad98 100644 --- a/fastlane/metadata/android/es-ES/title.txt +++ b/fastlane/metadata/android/es-ES/title.txt @@ -1 +1 @@ -FlorisBoard \ No newline at end of file +FlorisBoard diff --git a/fastlane/metadata/androidbeta/es-ES/full_description.txt b/fastlane/metadata/androidbeta/es-ES/full_description.txt index b07a918260..4bbca89eff 100644 --- a/fastlane/metadata/androidbeta/es-ES/full_description.txt +++ b/fastlane/metadata/androidbeta/es-ES/full_description.txt @@ -15,4 +15,4 @@
  • Símbolos especiales integrados en distribuciones de caracteres
  • Barra de herramientas de portapapeles/cursor
  • Gestor/historial del portapapeles
  • - \ No newline at end of file + diff --git a/fastlane/metadata/androidbeta/es-ES/title.txt b/fastlane/metadata/androidbeta/es-ES/title.txt index a417fccff7..223496ad98 100644 --- a/fastlane/metadata/androidbeta/es-ES/title.txt +++ b/fastlane/metadata/androidbeta/es-ES/title.txt @@ -1 +1 @@ -FlorisBoard \ No newline at end of file +FlorisBoard diff --git a/gradle.properties b/gradle.properties index 01a4bb21b5..f6ceed632f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,8 +11,8 @@ projectMinSdk=26 projectTargetSdk=36 projectCompileSdk=36 -projectVersionCode=119 -projectVersionName=0.6.0-alpha02 +projectVersionCode=120 +projectVersionName=0.6.1 # TODO: Remove if https://github.com/mikepenz/AboutLibraries/pull/1283 is contained in stable release (e.g: 14.0.0) # and :lib:snygg:generateJsonSchema was reworked android.newDsl=false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b93550209a..87010bcf6b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] # Main -android-gradle-plugin = "9.0.0" +android-gradle-plugin = "9.0.1" androidx-activity = "1.12.4" androidx-autofill = "1.3.0" androidx-collection = "1.5.0" diff --git a/keystore.properties b/keystore.properties new file mode 100644 index 0000000000..3d38a8a0da --- /dev/null +++ b/keystore.properties @@ -0,0 +1,4 @@ +storePassword=android +keyPassword=android +keyAlias=androiddebugkey +storeFile=../debug.keystore diff --git a/lib/compose/src/main/kotlin/org/florisboard/lib/compose/Resources.kt b/lib/compose/src/main/kotlin/org/florisboard/lib/compose/Resources.kt index fc37911f85..d786e723e0 100644 --- a/lib/compose/src/main/kotlin/org/florisboard/lib/compose/Resources.kt +++ b/lib/compose/src/main/kotlin/org/florisboard/lib/compose/Resources.kt @@ -42,7 +42,7 @@ private val LocalResourcesContext = staticCompositionLocalOf { } private val LocalAppNameString = staticCompositionLocalOf { - "FlorisBoard" + "Trackman Keyboard" } val LocalLocalizedDateTimeFormatter = staticCompositionLocalOf {