Compare commits

..

1 Commits

Author SHA1 Message Date
Jules Aguillon
8662f3afd4 Ignore presses too close from an other pointer
These might be gliches.
2022-03-16 12:35:14 +01:00
136 changed files with 1895 additions and 3947 deletions

View File

@@ -9,39 +9,28 @@ jobs:
Build-Apk: Build-Apk:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/setup-java@v3 - name: Install nix
uses: cachix/install-nix-action@v15
with: with:
distribution: 'zulu' # See 'Supported distributions' for available options nix_path: nixpkgs=channel:nixos-unstable
java-version: '11' - uses: cachix/cachix-action@v10
- name: Checkout repo with:
uses: actions/checkout@v3 name: julow
signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
- name: Checkout Repo
uses: actions/checkout@v2
- name: Cache debug certificate - name: Cache debug certificate
uses: actions/cache@v3 uses: actions/cache@v2
with: with:
path: _build/debug.keystore path: _build/debug.keystore
key: debug-keystore key: debug-keystore
- name: Restore debug keystore from github Secrets - name: Run nix-shell and Make
run: | uses: ZenithalHourlyRate/nix-shell-action@v4
mkdir -p _build
cd "_build"
# Check if exist and use the secret named DEBUG_KEYSTORE
# The contents of the secret can be obtained -
# from the debug.keystore.asc from you local _build folder
if [[ ! "${{ secrets.DEBUG_KEYSTORE }}" = "" ]]; then
echo "${{ secrets.DEBUG_KEYSTORE }}" > "debug.keystore.asc"
if [[ -s "debug.keystore.asc" ]]; then
gpg -d --passphrase "debug0" --batch "debug.keystore.asc" > "debug.keystore"
fi
fi
- name: Build
run: make
- name: Artifact naming
run: |
artifact="${{github.repository_owner}} ${{github.ref_name}}"
artifact="${artifact//\//-}" # replace slashes
echo "artifact=${artifact}" >> $GITHUB_ENV
- name: Save debug apk
uses: actions/upload-artifact@v3
with: with:
name: "${{env.artifact}} debug_apk" file: shell.nix
script: make
- name: Save debug apk
uses: actions/upload-artifact@v2
with:
name: debug apk
path: _build/*.apk path: _build/*.apk

1
.gitignore vendored
View File

@@ -1,4 +1,3 @@
*.keystore *.keystore
*.keystore.asc
_build _build
/*-keystore.conf /*-keystore.conf

View File

@@ -1,19 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="juloo.keyboard2" android:versionCode="27" android:versionName="1.19.0" android:hardwareAccelerated="false"> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="juloo.keyboard2" android:versionCode="18" android:versionName="1.13.1" android:hardwareAccelerated="false">
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="30"/> <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="30"/>
<application android:label="@string/app_name" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:hardwareAccelerated="false"> <application android:label="@string/app_name" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:hardwareAccelerated="false">
<service android:name="juloo.keyboard2.Keyboard2" android:label="@string/app_name" android:permission="android.permission.BIND_INPUT_METHOD" android:exported="true" android:directBootAware="true"> <service android:name="juloo.keyboard2.Keyboard2" android:label="@string/app_name" android:permission="android.permission.BIND_INPUT_METHOD">
<intent-filter> <intent-filter>
<action android:name="android.view.InputMethod"/> <action android:name="android.view.InputMethod"/>
</intent-filter> </intent-filter>
<meta-data android:name="android.view.im" android:resource="@xml/method"/> <meta-data android:name="android.view.im" android:resource="@xml/method"/>
</service> </service>
<activity android:name="juloo.keyboard2.SettingsActivity" android:icon="@drawable/ic_launcher" android:label="@string/settings_activity_label" android:theme="@style/android:Theme.DeviceDefault"> <activity android:name="juloo.keyboard2.SettingsActivity" android:icon="@drawable/ic_launcher" android:label="@string/settings_activity_label" android:theme="@style/android:Theme.Material">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
</intent-filter> </intent-filter>
</activity> </activity>
</application> </application>
<uses-permission android:name="android.permission.VIBRATE"/> <uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
</manifest> </manifest>

View File

@@ -12,8 +12,7 @@ Fortunately, there's not many dependencies:
- Android SDK: build tools (minimum `28.0.1`), platform `30` - Android SDK: build tools (minimum `28.0.1`), platform `30`
- Make sure to have the `$ANDROID_HOME` environment variable set. - Make sure to have the `$ANDROID_HOME` environment variable set.
For Nix users, the right environment can be obtained with `nix-shell ./shell.nix`. For Nix users, there's a `shell.nix` for setting-up the right environment.
Instructions to install Nix are [here](https://nixos.wiki/wiki/Nix_Installation_Guide).
Building the debug apk: Building the debug apk:
@@ -21,25 +20,8 @@ Building the debug apk:
make make
``` ```
If the build succeed, the debug apk is located in `_build/juloo.keyboard2.debug.apk`. If the build succeed, the debug apk is located in
`_build/juloo.keyboard2.debug.apk`.
## Using the local debug.keystore on the Github CI actions
It's possible to save the local debug.keystore into a github secret, so the same keystore is utilized to build the debug apk in the CI github actions.
Doing this, they wil have the same signature, thus the debug apk can be updated without having to uninstall it first.
After you sucessfully run `make`, (thus a debug.keystore exists) you can use this second command to generate a base64 stringified version of it
```sh
cd _build
gpg -c --armor --pinentry-mode loopback --passphrase debug0 --yes "debug.keystore"
```
A file will be generated inside the local `_build/` folder, called `debug.keystore.asc`
You can copy the content of this file, and with that, paste it into a new github secret in your repo settings.
The secret must be named `DEBUG_KEYSTORE`
## Debugging on your phone ## Debugging on your phone
@@ -78,59 +60,26 @@ make installd
## Guidelines ## Guidelines
### Adding a layout ### Add a localized layout
Layouts are defined in XML, see `res/xml/qwerty.xml`. Localized layouts (a layout specific to a language) are generally accepted.
An entry must be added to the layout option in `res/values/arrays.xml`, to both
`pref_layout_values` (correspond to the file name) and `pref_layout_entries`
(display name).
The layout must also be referenced in `srcs/juloo.keyboard2/Config.java` in
`layoutId_of_string`.
#### Adding a programming layout
A programming layout must contains every ASCII characters.
The current programming layouts are: QWERTY, Dvorak and Colemak.
Keys with a name starting in `loc ` are hidden unless they are configured for
the user's installed languages in `res/xml/method.xml`. These keys are optional
and will be added automatically when necessary.
Some users cannot easily type the characters close the the edges of the screen
due to a bulky phone case. It is best to avoid placing important characters
there (such as the digits or punctuation).
#### Adding a localized layout
Localized layouts (a layout specific to a language) are gladly accepted.
See for example: 4333575 (Bulgarian), 88e2175 (Latvian), 133b6ec (German). See for example: 4333575 (Bulgarian), 88e2175 (Latvian), 133b6ec (German).
They don't need to contain every ASCII characters (although it's useful in This keyboard is intended for programmers. If your language uses the Latin script, make sure it is possible to type every letters on the QWERTY keyboard.
passwords) and dead-keys. This is generally done using dead-keys, for example: 0bf7ff5 (Latvian), 573c13f (Swedish).
It is also possible to add some characters that are hidden in other languages, for example 93e84ba (ß), though the space is limited.
### Adding support for a language ### Add a programming layout
Supported locales are defined in `res/xml/method.xml`. A programming layout must contains every ASCII characters as well as every dead-keys.
Currently, the only example is QWERTY.
The attributes `languageTag` and `imeSubtypeLocale` define a locale, the
attribute `imeSubtypeExtraValue` defines the default layout and the dead-keys
and other extra keys to show.
### Translations ### Translations
Translations are always welcome ! Translations are always welcome ! See for example: 1723288 (Latvian), baf867a (French).
The app can be translated by writing `res/values-<language code>/strings.xml` (for example `values-fr`, `values-lv`), based on the default: `res/values/strings.xml` (English).
See for example: 1723288 (Latvian), baf867a (French). The store description is found in `metadata/android/<locale>/`, `short_description.txt` and `full_description.txt`.
The app can be translated by writing `res/values-<language code>/strings.xml` The full description changes very infrequently (it was changed once in 6 years). But if it changes too much, outdated translation might be removed.
(for example `values-fr`, `values-lv`), based on the default:
`res/values/strings.xml` (English).
The store description is found in `metadata/android/<locale>/`, Translating changelogs is not useful because they evolve too fast. Changelogs are generally written entirely just before a release, translating them would delay releases too much. Old changelogs are not shown to anyone currently.
`short_description.txt` and `full_description.txt`.
Translating changelogs is not useful. Changelogs are written quickly just
before a release and older ones are never shown to anyone currently.
The app name might be partially translated, the "unexpected" word should remain
untranslated.

View File

@@ -3,9 +3,10 @@
PACKAGE_NAME = juloo.keyboard2 PACKAGE_NAME = juloo.keyboard2
ANDROID_PLATFORM_VERSION = android-30 ANDROID_PLATFORM_VERSION = android-30
JAVA_VERSION = 1.7 JAVA_VERSION = 1.8
SRC_DIR = srcs SRC_DIR = srcs
ASSETS_DIR = assets
RES_DIR = res RES_DIR = res
EXTRA_JARS = EXTRA_JARS =
@@ -16,16 +17,13 @@ debug: _build/$(PACKAGE_NAME).debug.apk
release: _build/$(PACKAGE_NAME).apk release: _build/$(PACKAGE_NAME).apk
installd: _build/$(PACKAGE_NAME).debug.apk installd: _build/$(PACKAGE_NAME).debug.apk
adb install -r "$<" adb install "$<"
clean: clean:
rm -rf _build/*.dex _build/class _build/gen _build/*.apk _build/*.unsigned-apk \ rm -rf _build/*.dex _build/class _build/gen _build/*.apk _build/*.unsigned-apk \
_build/*.idsig _build/assets _build/*.idsig
rebuild_special_font: .PHONY: release debug installd clean
cd srcs/special_font && fontforge -lang=ff -script build.pe *.svg
.PHONY: release debug installd clean rebuild_special_font
$(shell mkdir -p _build) $(shell mkdir -p _build)
@@ -48,6 +46,7 @@ JAVAC_FLAGS = -source $(JAVA_VERSION) -target $(JAVA_VERSION) -encoding utf8
MANIFEST_FILE = AndroidManifest.xml MANIFEST_FILE = AndroidManifest.xml
JAVA_FILES = $(shell find $(SRC_DIR) -name '*.java') JAVA_FILES = $(shell find $(SRC_DIR) -name '*.java')
RES_FILES = $(shell find $(RES_DIR) -type f) RES_FILES = $(shell find $(RES_DIR) -type f)
ASSETS_FILES = $(shell find $(ASSETS_DIR) -type f 2>/dev/null)
# Debug signing # Debug signing
@@ -81,17 +80,11 @@ _build/%.apk: _build/%.unsigned-apk %-keystore.conf
_build/%.unsigned-apk: _build/%.unaligned-apk _build/%.unsigned-apk: _build/%.unaligned-apk
$(ANDROID_BUILD_TOOLS)/zipalign -fp 4 "$<" "$@" $(ANDROID_BUILD_TOOLS)/zipalign -fp 4 "$<" "$@"
APK_EXTRA_FILES = classes.dex assets/special_font.ttf _build/%.unaligned-apk: _build/classes.dex $(MANIFEST_FILE) $(ASSETS_FILES)
_build/%.unaligned-apk: $(addprefix _build/,$(APK_EXTRA_FILES)) $(MANIFEST_FILE)
$(ANDROID_BUILD_TOOLS)/aapt package -f -M $(MANIFEST_FILE) -S $(RES_DIR) \ $(ANDROID_BUILD_TOOLS)/aapt package -f -M $(MANIFEST_FILE) -S $(RES_DIR) \
-I $(ANDROID_PLATFORM)/android.jar -F "$@" $(AAPT_PACKAGE_FLAGS) -I $(ANDROID_PLATFORM)/android.jar -F "$@" $(AAPT_PACKAGE_FLAGS)
cd $(@D) && $(ANDROID_BUILD_TOOLS)/aapt add $(@F) $(APK_EXTRA_FILES) [ -z "$(ASSETS_FILES)" ] || $(ANDROID_BUILD_TOOLS)/aapt add "$@" $(ASSETS_FILES)
cd $(@D) && $(ANDROID_BUILD_TOOLS)/aapt add $(@F) classes.dex
# Copy the special font file into _build because aapt requires relative paths
_build/assets/special_font.ttf: srcs/special_font/result.ttf
mkdir -p $(@D)
cp "$<" "$@"
# R.java # R.java

View File

@@ -1,9 +1,8 @@
# Unexpected Keyboard # Unexpected Keyboard
A lightweight virtual keyboard for developers. A lightweight virtual keyboard for developers.
| <img src="/metadata/android/en-US/images/phoneScreenshots/1.png" alt="Screenshot-1" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/2.png" alt="Screenshot-2"/> | <img src="/metadata/android/en-US/images/phoneScreenshots/3.png" alt="Screenshot-3"/> |
| --- | --- | --- | ![Unexpected Keyboard](metadata/android/en-US/images/featureGraphic.png)
| <img src="/metadata/android/en-US/images/phoneScreenshots/4.png" alt="Screenshot-4" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/5.png" alt="Screenshot-5" /> | <img src="/metadata/android/en-US/images/phoneScreenshots/6.png" alt="Screenshot-6" /> |
This app is a virtual keyboard for Android. The main features are easy typing of every ASCII character using the swipe gesture, dead keys for accents and modifier keys and the presence of special keys (tab, esc, arrows, etc..). This app is a virtual keyboard for Android. The main features are easy typing of every ASCII character using the swipe gesture, dead keys for accents and modifier keys and the presence of special keys (tab, esc, arrows, etc..).
@@ -19,7 +18,7 @@ Highlight of some of the features:
- Very light and fast. Use 500x times less space than Google's keyboard and 15x times less than the default keyboard. No ad, no tracking. - Very light and fast. Use 500x times less space than Google's keyboard and 15x times less than the default keyboard. No ad, no tracking.
- Personalizable with many options, layouts and themes. - Multiple layouts: QWERTY, QWERTZ, AZERTY. Themes: White, Dark, OLED Black. And many other options.
Like any other virtual keyboards, it must be enabled in the system settings. Open the System Settings and go to: Like any other virtual keyboards, it must be enabled in the system settings. Open the System Settings and go to:
System > Languages & input > On-screen keyboard > Manage on-screen keyboards. System > Languages & input > On-screen keyboard > Manage on-screen keyboards.

15
assets/fonts/README.md Normal file
View File

@@ -0,0 +1,15 @@
# Fonts
The glyphs from this font are made by:
- Home and End
Author: @sdrapha
- Cog
Copyright (C) 2016 by Dave Gandy
Author: Dave Gandy
License: SIL ()
- Emoticon, PageUp and PageDown
IcoMoon-Free is a free vector icon pack by Keyamoon.
License: Attribution 4.0 International (CC BY 4.0)

BIN
assets/fonts/keys.ttf Normal file

Binary file not shown.

908
emoji_gen.py Normal file
View File

@@ -0,0 +1,908 @@
from enum import Enum
import sys
class Line(Enum):
IGNORE = 0
GROUP = 1
ENTRY = 2
def parse_line(line):
if line.startswith("# group:"):
return (Line.GROUP, line.split(":")[1].strip())
else:
lr = line.split("#", 1)
if lr[0] == "" or len(lr) != 2:
return (Line.IGNORE, line)
else:
code, status = lr[0].split(";", 1)
desc = lr[1].strip().split(" ", 2)[2]
return (Line.ENTRY, (code.strip(), status.strip(), desc))
def parse_lines(inp):
entries = {}
group = "none"
for line in inp:
tok, k = parse_line(line)
if tok == Line.GROUP:
group = k
elif tok == Line.ENTRY:
entries.setdefault(group, []).append(k)
return entries
name_map = {
"1F44D": ":+1:",
"1F44E": ":-1:",
"1F4AF": ":100:",
"1F522": ":1234:",
"1F3B1": ":8ball:",
"1F170": ":a:",
"1F18E": ":ab:",
"1F524": ":abc:",
"1F521": ":abcd:",
"1F251": ":accept:",
"1F6A1": ":aerial_tramway:",
"02708": ":airplane:",
"023F0": ":alarm_clock:",
"1F47D": ":alien:",
"1F691": ":ambulance:",
"02693": ":anchor:",
"1F47C": ":angel:",
"1F4A2": ":anger:",
"1F620": ":angry:",
"1F627": ":anguished:",
"1F41C": ":ant:",
"1F34E": ":apple:",
"02652": ":aquarius:",
"02648": ":aries:",
"025C0": ":arrow_backward:",
"023EC": ":arrow_double_down:",
"023EB": ":arrow_double_up:",
"02B07": ":arrow_down:",
"1F53D": ":arrow_down_small:",
"025B6": ":arrow_forward:",
"02935": ":arrow_heading_down:",
"02934": ":arrow_heading_up:",
"02B05": ":arrow_left:",
"02199": ":arrow_lower_left:",
"02198": ":arrow_lower_right:",
"027A1": ":arrow_right:",
"021AA": ":arrow_right_hook:",
"02B06": ":arrow_up:",
"02195": ":arrow_up_down:",
"1F53C": ":arrow_up_small:",
"02196": ":arrow_upper_left:",
"02197": ":arrow_upper_right:",
"1F503": ":arrows_clockwise:",
"1F504": ":arrows_counterclockwise:",
"1F3A8": ":art:",
"1F69B": ":articulated_lorry:",
"1F632": ":astonished:",
"1F45F": ":athletic_shoe:",
"1F3E7": ":atm:",
"1F171": ":b:",
"1F476": ":baby:",
"1F37C": ":baby_bottle:",
"1F424": ":baby_chick:",
"1F6BC": ":baby_symbol:",
"1F519": ":back:",
"1F6C4": ":baggage_claim:",
"1F388": ":balloon:",
"02611": ":ballot_box_with_check:",
"1F38D": ":bamboo:",
"1F34C": ":banana:",
"0203C": ":bangbang:",
"1F3E6": ":bank:",
"1F4CA": ":bar_chart:",
"1F488": ":barber:",
"026BE": ":baseball:",
"1F3C0": ":basketball:",
"1F6C0": ":bath:",
"1F6C1": ":bathtub:",
"1F50B": ":battery:",
"1F43B": ":bear:",
"1F41D": ":bee:",
"1F37A": ":beer:",
"1F37B": ":beers:",
"1F41E": ":beetle:",
"1F530": ":beginner:",
"1F514": ":bell:",
"1F371": ":bento:",
"1F6B4": ":bicyclist:",
"1F6B2": ":bike:",
"1F459": ":bikini:",
"1F426": ":bird:",
"1F382": ":birthday:",
"026AB": ":black_circle:",
"1F0CF": ":black_joker:",
"02B1B": ":black_large_square:",
"025FE": ":black_medium_small_square:",
"025FC": ":black_medium_square:",
"02712": ":black_nib:",
"025AA": ":black_small_square:",
"1F532": ":black_square_button:",
"1F33C": ":blossom:",
"1F421": ":blowfish:",
"1F4D8": ":blue_book:",
"1F699": ":blue_car:",
"1F499": ":blue_heart:",
"1F60A": ":blush:",
"1F417": ":boar:",
"026F5": ":boat:",
"1F4A3": ":bomb:",
"1F4D6": ":book:",
"1F516": ":bookmark:",
"1F4D1": ":bookmark_tabs:",
"1F4DA": ":books:",
"1F4A5": ":boom:",
"1F462": ":boot:",
"1F490": ":bouquet:",
"1F647": ":bow:",
"1F3B3": ":bowling:",
"1F466": ":boy:",
"1F35E": ":bread:",
"1F470": ":bride_with_veil:",
"1F309": ":bridge_at_night:",
"1F4BC": ":briefcase:",
"1F494": ":broken_heart:",
"1F41B": ":bug:",
"1F4A1": ":bulb:",
"1F685": ":bullettrain_front:",
"1F684": ":bullettrain_side:",
"1F68C": ":bus:",
"1F68F": ":busstop:",
"1F464": ":bust_in_silhouette:",
"1F465": ":busts_in_silhouette:",
"1F335": ":cactus:",
"1F370": ":cake:",
"1F4C6": ":calendar:",
"1F4F2": ":calling:",
"1F42B": ":camel:",
"1F4F7": ":camera:",
"0264B": ":cancer:",
"1F36C": ":candy:",
"1F520": ":capital_abcd:",
"02651": ":capricorn:",
"1F697": ":car:",
"1F4C7": ":card_index:",
"1F3A0": ":carousel_horse:",
"1F431": ":cat:",
"1F408": ":cat2:",
"1F4BF": ":cd:",
"1F4B9": ":chart:",
"1F4C9": ":chart_with_downwards_trend:",
"1F4C8": ":chart_with_upwards_trend:",
"1F3C1": ":checkered_flag:",
"1F352": ":cherries:",
"1F338": ":cherry_blossom:",
"1F330": ":chestnut:",
"1F414": ":chicken:",
"1F6B8": ":children_crossing:",
"1F36B": ":chocolate_bar:",
"1F384": ":christmas_tree:",
"026EA": ":church:",
"1F3A6": ":cinema:",
"1F3AA": ":circus_tent:",
"1F307": ":city_sunrise:",
"1F306": ":city_sunset:",
"1F191": ":cl:",
"1F44F": ":clap:",
"1F3AC": ":clapper:",
"1F4CB": ":clipboard:",
"1F550": ":clock1:",
"1F559": ":clock10:",
"1F565": ":clock1030:",
"1F55A": ":clock11:",
"1F566": ":clock1130:",
"1F55B": ":clock12:",
"1F567": ":clock1230:",
"1F55C": ":clock130:",
"1F551": ":clock2:",
"1F55D": ":clock230:",
"1F552": ":clock3:",
"1F55E": ":clock330:",
"1F553": ":clock4:",
"1F55F": ":clock430:",
"1F554": ":clock5:",
"1F560": ":clock530:",
"1F555": ":clock6:",
"1F561": ":clock630:",
"1F556": ":clock7:",
"1F562": ":clock730:",
"1F557": ":clock8:",
"1F563": ":clock830:",
"1F558": ":clock9:",
"1F564": ":clock930:",
"1F4D5": ":closed_book:",
"1F510": ":closed_lock_with_key:",
"1F302": ":closed_umbrella:",
"02601": ":cloud:",
"02663": ":clubs:",
"1F378": ":cocktail:",
"02615": ":coffee:",
"1F630": ":cold_sweat:",
"1F4A5": ":collision:",
"1F4BB": ":computer:",
"1F38A": ":confetti_ball:",
"1F616": ":confounded:",
"1F615": ":confused:",
"03297": ":congratulations:",
"1F6A7": ":construction:",
"1F477": ":construction_worker:",
"1F3EA": ":convenience_store:",
"1F36A": ":cookie:",
"1F192": ":cool:",
"1F46E": ":cop:",
"000A9": ":copyright:",
"1F33D": ":corn:",
"1F46B": ":couple:",
"1F491": ":couple_with_heart:",
"1F48F": ":couplekiss:",
"1F42E": ":cow:",
"1F404": ":cow2:",
"1F4B3": ":credit_card:",
"1F319": ":crescent_moon:",
"1F40A": ":crocodile:",
"1F38C": ":crossed_flags:",
"1F451": ":crown:",
"1F622": ":cry:",
"1F63F": ":crying_cat_face:",
"1F52E": ":crystal_ball:",
"1F498": ":cupid:",
"027B0": ":curly_loop:",
"1F4B1": ":currency_exchange:",
"1F35B": ":curry:",
"1F36E": ":custard:",
"1F6C3": ":customs:",
"1F300": ":cyclone:",
"1F483": ":dancer:",
"1F46F": ":dancers:",
"1F361": ":dango:",
"1F3AF": ":dart:",
"1F4A8": ":dash:",
"1F4C5": ":date:",
"1F333": ":deciduous_tree:",
"1F3EC": ":department_store:",
"1F4A0": ":diamond_shape_with_a_dot_inside:",
"02666": ":diamonds:",
"1F61E": ":disappointed:",
"1F625": ":disappointed_relieved:",
"1F4AB": ":dizzy:",
"1F635": ":dizzy_face:",
"1F6AF": ":do_not_litter:",
"1F436": ":dog:",
"1F415": ":dog2:",
"1F4B5": ":dollar:",
"1F38E": ":dolls:",
"1F42C": ":dolphin:",
"1F6AA": ":door:",
"1F369": ":doughnut:",
"1F409": ":dragon:",
"1F432": ":dragon_face:",
"1F457": ":dress:",
"1F42A": ":dromedary_camel:",
"1F4A7": ":droplet:",
"1F4C0": ":dvd:",
"1F4E7": ":e-mail:",
"1F442": ":ear:",
"1F33E": ":ear_of_rice:",
"1F30D": ":earth_africa:",
"1F30E": ":earth_americas:",
"1F30F": ":earth_asia:",
"1F373": ":egg:",
"1F346": ":eggplant:",
"02734": ":eight_pointed_black_star:",
"02733": ":eight_spoked_asterisk:",
"1F50C": ":electric_plug:",
"1F418": ":elephant:",
"02709": ":email:",
"1F51A": ":end:",
"02709": ":envelope:",
"1F4E9": ":envelope_with_arrow:",
"1F4B6": ":euro:",
"1F3F0": ":european_castle:",
"1F3E4": ":european_post_office:",
"1F332": ":evergreen_tree:",
"02757": ":exclamation:",
"1F611": ":expressionless:",
"1F453": ":eyeglasses:",
"1F440": ":eyes:",
"1F44A": ":facepunch:",
"1F3ED": ":factory:",
"1F342": ":fallen_leaf:",
"1F46A": ":family:",
"023E9": ":fast_forward:",
"1F4E0": ":fax:",
"1F628": ":fearful:",
"1F43E": ":feet:",
"1F3A1": ":ferris_wheel:",
"1F4C1": ":file_folder:",
"1F525": ":fire:",
"1F692": ":fire_engine:",
"1F386": ":fireworks:",
"1F313": ":first_quarter_moon:",
"1F31B": ":first_quarter_moon_with_face:",
"1F41F": ":fish:",
"1F365": ":fish_cake:",
"1F3A3": ":fishing_pole_and_fish:",
"0270A": ":fist:",
"1F38F": ":flags:",
"1F526": ":flashlight:",
"1F42C": ":flipper:",
"1F4BE": ":floppy_disk:",
"1F3B4": ":flower_playing_cards:",
"1F633": ":flushed:",
"1F301": ":foggy:",
"1F3C8": ":football:",
"1F463": ":footprints:",
"1F374": ":fork_and_knife:",
"026F2": ":fountain:",
"1F340": ":four_leaf_clover:",
"1F193": ":free:",
"1F364": ":fried_shrimp:",
"1F35F": ":fries:",
"1F438": ":frog:",
"1F626": ":frowning:",
"026FD": ":fuelpump:",
"1F315": ":full_moon:",
"1F31D": ":full_moon_with_face:",
"1F3B2": ":game_die:",
"1F48E": ":gem:",
"0264A": ":gemini:",
"1F47B": ":ghost:",
"1F381": ":gift:",
"1F49D": ":gift_heart:",
"1F467": ":girl:",
"1F310": ":globe_with_meridians:",
"1F410": ":goat:",
"026F3": ":golf:",
"1F347": ":grapes:",
"1F34F": ":green_apple:",
"1F4D7": ":green_book:",
"1F49A": ":green_heart:",
"02755": ":grey_exclamation:",
"02754": ":grey_question:",
"1F62C": ":grimacing:",
"1F601": ":grin:",
"1F600": ":grinning:",
"1F482": ":guardsman:",
"1F3B8": ":guitar:",
"1F52B": ":gun:",
"1F487": ":haircut:",
"1F354": ":hamburger:",
"1F528": ":hammer:",
"1F439": ":hamster:",
"0270B": ":hand:",
"1F45C": ":handbag:",
"1F4A9": ":hankey:",
"1F425": ":hatched_chick:",
"1F423": ":hatching_chick:",
"1F3A7": ":headphones:",
"1F649": ":hear_no_evil:",
"02764": ":heart:",
"1F49F": ":heart_decoration:",
"1F60D": ":heart_eyes:",
"1F63B": ":heart_eyes_cat:",
"1F493": ":heartbeat:",
"1F497": ":heartpulse:",
"02665": ":hearts:",
"02714": ":heavy_check_mark:",
"02797": ":heavy_division_sign:",
"1F4B2": ":heavy_dollar_sign:",
"02757": ":heavy_exclamation_mark:",
"02796": ":heavy_minus_sign:",
"02716": ":heavy_multiplication_x:",
"02795": ":heavy_plus_sign:",
"1F681": ":helicopter:",
"1F33F": ":herb:",
"1F33A": ":hibiscus:",
"1F506": ":high_brightness:",
"1F460": ":high_heel:",
"1F52A": ":hocho:",
"1F36F": ":honey_pot:",
"1F41D": ":honeybee:",
"1F434": ":horse:",
"1F3C7": ":horse_racing:",
"1F3E5": ":hospital:",
"1F3E8": ":hotel:",
"02668": ":hotsprings:",
"0231B": ":hourglass:",
"023F3": ":hourglass_flowing_sand:",
"1F3E0": ":house:",
"1F3E1": ":house_with_garden:",
"1F62F": ":hushed:",
"1F368": ":ice_cream:",
"1F366": ":icecream:",
"1F194": ":id:",
"1F250": ":ideograph_advantage:",
"1F47F": ":imp:",
"1F4E5": ":inbox_tray:",
"1F4E8": ":incoming_envelope:",
"1F481": ":information_desk_person:",
"02139": ":information_source:",
"1F607": ":innocent:",
"02049": ":interrobang:",
"1F4F1": ":iphone:",
"1F3EE": ":izakaya_lantern:",
"1F383": ":jack_o_lantern:",
"1F5FE": ":japan:",
"1F3EF": ":japanese_castle:",
"1F47A": ":japanese_goblin:",
"1F479": ":japanese_ogre:",
"1F456": ":jeans:",
"1F602": ":joy:",
"1F639": ":joy_cat:",
"1F511": ":key:",
"1F51F": ":keycap_ten:",
"1F458": ":kimono:",
"1F48B": ":kiss:",
"1F617": ":kissing:",
"1F63D": ":kissing_cat:",
"1F61A": ":kissing_closed_eyes:",
"1F618": ":kissing_heart:",
"1F619": ":kissing_smiling_eyes:",
"1F428": ":koala:",
"1F201": ":koko:",
"1F3EE": ":lantern:",
"1F535": ":large_blue_circle:",
"1F537": ":large_blue_diamond:",
"1F536": ":large_orange_diamond:",
"1F317": ":last_quarter_moon:",
"1F31C": ":last_quarter_moon_with_face:",
"1F606": ":laughing:",
"1F343": ":leaves:",
"1F4D2": ":ledger:",
"1F6C5": ":left_luggage:",
"02194": ":left_right_arrow:",
"021A9": ":leftwards_arrow_with_hook:",
"1F34B": ":lemon:",
"0264C": ":leo:",
"1F406": ":leopard:",
"0264E": ":libra:",
"1F688": ":light_rail:",
"1F517": ":link:",
"1F444": ":lips:",
"1F484": ":lipstick:",
"1F512": ":lock:",
"1F50F": ":lock_with_ink_pen:",
"1F36D": ":lollipop:",
"027BF": ":loop:",
"1F4E2": ":loudspeaker:",
"1F3E9": ":love_hotel:",
"1F48C": ":love_letter:",
"1F505": ":low_brightness:",
"024C2": ":m:",
"1F50D": ":mag:",
"1F50E": ":mag_right:",
"1F004": ":mahjong:",
"1F4EB": ":mailbox:",
"1F4EA": ":mailbox_closed:",
"1F4EC": ":mailbox_with_mail:",
"1F4ED": ":mailbox_with_no_mail:",
"1F468": ":man:",
"1F472": ":man_with_gua_pi_mao:",
"1F473": ":man_with_turban:",
"1F45E": ":mans_shoe:",
"1F341": ":maple_leaf:",
"1F637": ":mask:",
"1F486": ":massage:",
"1F356": ":meat_on_bone:",
"1F4E3": ":mega:",
"1F348": ":melon:",
"1F4DD": ":memo:",
"1F6B9": ":mens:",
"1F687": ":metro:",
"1F3A4": ":microphone:",
"1F52C": ":microscope:",
"1F30C": ":milky_way:",
"1F690": ":minibus:",
"1F4BD": ":minidisc:",
"1F4F4": ":mobile_phone_off:",
"1F4B8": ":money_with_wings:",
"1F4B0": ":moneybag:",
"1F412": ":monkey:",
"1F435": ":monkey_face:",
"1F69D": ":monorail:",
"1F314": ":moon:",
"1F393": ":mortar_board:",
"1F5FB": ":mount_fuji:",
"1F6B5": ":mountain_bicyclist:",
"1F6A0": ":mountain_cableway:",
"1F69E": ":mountain_railway:",
"1F42D": ":mouse:",
"1F401": ":mouse2:",
"1F3A5": ":movie_camera:",
"1F5FF": ":moyai:",
"1F4AA": ":muscle:",
"1F344": ":mushroom:",
"1F3B9": ":musical_keyboard:",
"1F3B5": ":musical_note:",
"1F3BC": ":musical_score:",
"1F507": ":mute:",
"1F485": ":nail_care:",
"1F4DB": ":name_badge:",
"1F454": ":necktie:",
"0274E": ":negative_squared_cross_mark:",
"1F610": ":neutral_face:",
"1F195": ":new:",
"1F311": ":new_moon:",
"1F31A": ":new_moon_with_face:",
"1F4F0": ":newspaper:",
"1F196": ":ng:",
"1F515": ":no_bell:",
"1F6B3": ":no_bicycles:",
"026D4": ":no_entry:",
"1F6AB": ":no_entry_sign:",
"1F645": ":no_good:",
"1F4F5": ":no_mobile_phones:",
"1F636": ":no_mouth:",
"1F6B7": ":no_pedestrians:",
"1F6AD": ":no_smoking:",
"1F6B1": ":non-potable_water:",
"1F443": ":nose:",
"1F4D3": ":notebook:",
"1F4D4": ":notebook_with_decorative_cover:",
"1F3B6": ":notes:",
"1F529": ":nut_and_bolt:",
"02B55": ":o:",
"1F17E": ":o2:",
"1F30A": ":ocean:",
"1F419": ":octopus:",
"1F362": ":oden:",
"1F3E2": ":office:",
"1F197": ":ok:",
"1F44C": ":ok_hand:",
"1F646": ":ok_woman:",
"1F474": ":older_man:",
"1F475": ":older_woman:",
"1F51B": ":on:",
"1F698": ":oncoming_automobile:",
"1F68D": ":oncoming_bus:",
"1F694": ":oncoming_police_car:",
"1F696": ":oncoming_taxi:",
"1F4D6": ":open_book:",
"1F4C2": ":open_file_folder:",
"1F450": ":open_hands:",
"1F62E": ":open_mouth:",
"026CE": ":ophiuchus:",
"1F4D9": ":orange_book:",
"1F4E4": ":outbox_tray:",
"1F402": ":ox:",
"1F4E6": ":package:",
"1F4C4": ":page_facing_up:",
"1F4C3": ":page_with_curl:",
"1F4DF": ":pager:",
"1F334": ":palm_tree:",
"1F43C": ":panda_face:",
"1F4CE": ":paperclip:",
"1F17F": ":parking:",
"0303D": ":part_alternation_mark:",
"026C5": ":partly_sunny:",
"1F6C2": ":passport_control:",
"1F43E": ":paw_prints:",
"1F351": ":peach:",
"1F350": ":pear:",
"1F4DD": ":pencil:",
"0270F": ":pencil2:",
"1F427": ":penguin:",
"1F614": ":pensive:",
"1F3AD": ":performing_arts:",
"1F623": ":persevere:",
"1F64D": ":person_frowning:",
"1F471": ":person_with_blond_hair:",
"1F64E": ":person_with_pouting_face:",
"0260E": ":phone:",
"1F437": ":pig:",
"1F416": ":pig2:",
"1F43D": ":pig_nose:",
"1F48A": ":pill:",
"1F34D": ":pineapple:",
"02653": ":pisces:",
"1F355": ":pizza:",
"1F447": ":point_down:",
"1F448": ":point_left:",
"1F449": ":point_right:",
"0261D": ":point_up:",
"1F446": ":point_up_2:",
"1F693": ":police_car:",
"1F429": ":poodle:",
"1F4A9": ":poop:",
"1F3E3": ":post_office:",
"1F4EF": ":postal_horn:",
"1F4EE": ":postbox:",
"1F6B0": ":potable_water:",
"1F45D": ":pouch:",
"1F357": ":poultry_leg:",
"1F4B7": ":pound:",
"1F63E": ":pouting_cat:",
"1F64F": ":pray:",
"1F478": ":princess:",
"1F44A": ":punch:",
"1F49C": ":purple_heart:",
"1F45B": ":purse:",
"1F4CC": ":pushpin:",
"1F6AE": ":put_litter_in_its_place:",
"02753": ":question:",
"1F430": ":rabbit:",
"1F407": ":rabbit2:",
"1F40E": ":racehorse:",
"1F4FB": ":radio:",
"1F518": ":radio_button:",
"1F621": ":rage:",
"1F683": ":railway_car:",
"1F308": ":rainbow:",
"0270B": ":raised_hand:",
"1F64C": ":raised_hands:",
"1F64B": ":raising_hand:",
"1F40F": ":ram:",
"1F35C": ":ramen:",
"1F400": ":rat:",
"0267B": ":recycle:",
"1F697": ":red_car:",
"1F534": ":red_circle:",
"000AE": ":registered:",
"0263A": ":relaxed:",
"1F60C": ":relieved:",
"1F501": ":repeat:",
"1F502": ":repeat_one:",
"1F6BB": ":restroom:",
"1F49E": ":revolving_hearts:",
"023EA": ":rewind:",
"1F380": ":ribbon:",
"1F35A": ":rice:",
"1F359": ":rice_ball:",
"1F358": ":rice_cracker:",
"1F391": ":rice_scene:",
"1F48D": ":ring:",
"1F680": ":rocket:",
"1F3A2": ":roller_coaster:",
"1F413": ":rooster:",
"1F339": ":rose:",
"1F6A8": ":rotating_light:",
"1F4CD": ":round_pushpin:",
"1F6A3": ":rowboat:",
"1F3C9": ":rugby_football:",
"1F3C3": ":runner:",
"1F3C3": ":running:",
"1F3BD": ":running_shirt_with_sash:",
"1F202": ":sa:",
"02650": ":sagittarius:",
"026F5": ":sailboat:",
"1F376": ":sake:",
"1F461": ":sandal:",
"1F385": ":santa:",
"1F4E1": ":satellite:",
"1F606": ":satisfied:",
"1F3B7": ":saxophone:",
"1F3EB": ":school:",
"1F392": ":school_satchel:",
"02702": ":scissors:",
"0264F": ":scorpius:",
"1F631": ":scream:",
"1F640": ":scream_cat:",
"1F4DC": ":scroll:",
"1F4BA": ":seat:",
"03299": ":secret:",
"1F648": ":see_no_evil:",
"1F331": ":seedling:",
"1F367": ":shaved_ice:",
"1F411": ":sheep:",
"1F41A": ":shell:",
"1F6A2": ":ship:",
"1F455": ":shirt:",
"1F4A9": ":shit:",
"1F45E": ":shoe:",
"1F6BF": ":shower:",
"1F4F6": ":signal_strength:",
"1F52F": ":six_pointed_star:",
"1F3BF": ":ski:",
"1F480": ":skull:",
"1F634": ":sleeping:",
"1F62A": ":sleepy:",
"1F3B0": ":slot_machine:",
"1F539": ":small_blue_diamond:",
"1F538": ":small_orange_diamond:",
"1F53A": ":small_red_triangle:",
"1F53B": ":small_red_triangle_down:",
"1F604": ":smile:",
"1F638": ":smile_cat:",
"1F603": ":smiley:",
"1F63A": ":smiley_cat:",
"1F608": ":smiling_imp:",
"1F60F": ":smirk:",
"1F63C": ":smirk_cat:",
"1F6AC": ":smoking:",
"1F40C": ":snail:",
"1F40D": ":snake:",
"1F3C2": ":snowboarder:",
"02744": ":snowflake:",
"026C4": ":snowman:",
"1F62D": ":sob:",
"026BD": ":soccer:",
"1F51C": ":soon:",
"1F198": ":sos:",
"1F509": ":sound:",
"1F47E": ":space_invader:",
"02660": ":spades:",
"1F35D": ":spaghetti:",
"02747": ":sparkle:",
"1F387": ":sparkler:",
"02728": ":sparkles:",
"1F496": ":sparkling_heart:",
"1F64A": ":speak_no_evil:",
"1F50A": ":speaker:",
"1F4AC": ":speech_balloon:",
"1F6A4": ":speedboat:",
"02B50": ":star:",
"1F31F": ":star2:",
"1F303": ":stars:",
"1F689": ":station:",
"1F5FD": ":statue_of_liberty:",
"1F682": ":steam_locomotive:",
"1F372": ":stew:",
"1F4CF": ":straight_ruler:",
"1F353": ":strawberry:",
"1F61B": ":stuck_out_tongue:",
"1F61D": ":stuck_out_tongue_closed_eyes:",
"1F61C": ":stuck_out_tongue_winking_eye:",
"1F31E": ":sun_with_face:",
"1F33B": ":sunflower:",
"1F60E": ":sunglasses:",
"02600": ":sunny:",
"1F305": ":sunrise:",
"1F304": ":sunrise_over_mountains:",
"1F3C4": ":surfer:",
"1F363": ":sushi:",
"1F69F": ":suspension_railway:",
"1F613": ":sweat:",
"1F4A6": ":sweat_drops:",
"1F605": ":sweat_smile:",
"1F360": ":sweet_potato:",
"1F3CA": ":swimmer:",
"1F523": ":symbols:",
"1F489": ":syringe:",
"1F389": ":tada:",
"1F38B": ":tanabata_tree:",
"1F34A": ":tangerine:",
"02649": ":taurus:",
"1F695": ":taxi:",
"1F375": ":tea:",
"0260E": ":telephone:",
"1F4DE": ":telephone_receiver:",
"1F52D": ":telescope:",
"1F3BE": ":tennis:",
"026FA": ":tent:",
"1F4AD": ":thought_balloon:",
"1F44E": ":thumbsdown:",
"1F44D": ":thumbsup:",
"1F3AB": ":ticket:",
"1F42F": ":tiger:",
"1F405": ":tiger2:",
"1F62B": ":tired_face:",
"02122": ":tm:",
"1F6BD": ":toilet:",
"1F5FC": ":tokyo_tower:",
"1F345": ":tomato:",
"1F445": ":tongue:",
"1F51D": ":top:",
"1F3A9": ":tophat:",
"1F69C": ":tractor:",
"1F6A5": ":traffic_light:",
"1F683": ":train:",
"1F686": ":train2:",
"1F68A": ":tram:",
"1F6A9": ":triangular_flag_on_post:",
"1F4D0": ":triangular_ruler:",
"1F531": ":trident:",
"1F624": ":triumph:",
"1F68E": ":trolleybus:",
"1F3C6": ":trophy:",
"1F379": ":tropical_drink:",
"1F420": ":tropical_fish:",
"1F69A": ":truck:",
"1F3BA": ":trumpet:",
"1F455": ":tshirt:",
"1F337": ":tulip:",
"1F422": ":turtle:",
"1F4FA": ":tv:",
"1F500": ":twisted_rightwards_arrows:",
"1F495": ":two_hearts:",
"1F46C": ":two_men_holding_hands:",
"1F46D": ":two_women_holding_hands:",
"1F239": ":u5272:",
"1F234": ":u5408:",
"1F23A": ":u55b6:",
"1F22F": ":u6307:",
"1F237": ":u6708:",
"1F236": ":u6709:",
"1F235": ":u6e80:",
"1F21A": ":u7121:",
"1F238": ":u7533:",
"1F232": ":u7981:",
"1F233": ":u7a7a:",
"02614": ":umbrella:",
"1F612": ":unamused:",
"1F51E": ":underage:",
"1F513": ":unlock:",
"1F199": ":up:",
"0270C": ":v:",
"1F6A6": ":vertical_traffic_light:",
"1F4FC": ":vhs:",
"1F4F3": ":vibration_mode:",
"1F4F9": ":video_camera:",
"1F3AE": ":video_game:",
"1F3BB": ":violin:",
"0264D": ":virgo:",
"1F30B": ":volcano:",
"1F19A": ":vs:",
"1F6B6": ":walking:",
"1F318": ":waning_crescent_moon:",
"1F316": ":waning_gibbous_moon:",
"026A0": ":warning:",
"0231A": ":watch:",
"1F403": ":water_buffalo:",
"1F349": ":watermelon:",
"1F44B": ":wave:",
"03030": ":wavy_dash:",
"1F312": ":waxing_crescent_moon:",
"1F314": ":waxing_gibbous_moon:",
"1F6BE": ":wc:",
"1F629": ":weary:",
"1F492": ":wedding:",
"1F433": ":whale:",
"1F40B": ":whale2:",
"0267F": ":wheelchair:",
"02705": ":white_check_mark:",
"026AA": ":white_circle:",
"1F4AE": ":white_flower:",
"02B1C": ":white_large_square:",
"025FD": ":white_medium_small_square:",
"025FB": ":white_medium_square:",
"025AB": ":white_small_square:",
"1F533": ":white_square_button:",
"1F390": ":wind_chime:",
"1F377": ":wine_glass:",
"1F609": ":wink:",
"1F43A": ":wolf:",
"1F469": ":woman:",
"1F45A": ":womans_clothes:",
"1F452": ":womans_hat:",
"1F6BA": ":womens:",
"1F61F": ":worried:",
"1F527": ":wrench:",
"0274C": ":x:",
"1F49B": ":yellow_heart:",
"1F4B4": ":yen:",
"1F60B": ":yum:",
"026A1": ":zap:",
"1F4A4": ":zzz:",
}
# Decode hex numbers separated by spaces into a string
def decode_points(code):
return "".join(map(lambda c: chr(int(c, 16)), code.split()))
def make_name(code):
return ":" + "".join(map(lambda c: "u" + c, code.split())) + ":"
# def fetch(url):
# return request.urlopen(url).read().decode().split("\n")
# https://unicode.org/Public/emoji/13.1/emoji-test.txt
with open(sys.argv[1]) as f:
entries = parse_lines(f)
def keep_emoji(e):
code, status, _ = e
code = code.split()
# Keep only interesting emojis (others are duplicates or won't render well)
# Remove skin tone variants, they are accessible through combinations
return status in [ "fully-qualified", "component" ] and \
not (len(code) > 1 and code[-1] in [ "1F3FB", "1F3FC", "1F3FD", "1F3FE", "1F3FF" ])
for group in entries.values():
group = list(filter(keep_emoji, group))
print("%d" % len(group))
for code, status, desc in group:
name = name_map[code] if code in name_map else make_name(code)
print("%s %s %s" % (name, decode_points(code), desc))

View File

@@ -1,18 +0,0 @@
Tato aplikace je virtuální klávesnící pro Android. Umožňuje rychlejší a plynulejší psaní písmen i symbolů (vč. diakritiky), a to ve vícero jazycích a vlastních rozloženích. To vše zdarma, bez reklam a bez plýtvání vašeho uložiště. Můžete psát libovolné znaky pomocí gest (ASCII i Unicode), používat mrtvé (univerzální) klávesy pro diakritická znaménka a mnohem více.
Klávesnice zobrazuje až 4 další znaky v rozích každé klávesy. Tyto znaky jsou vyvolány přejetím prstu do vybraného rohu.
No zkrátka...:
- Obsahuje každý znak a speciální klávesu, která je běžnou součástí počítačové klávesnice. To přijde vhod obzvláště při používání aplikací jako např. Termux
- Můžete používat modifikační klávesy, obohaceny o speciální klávesy (např. Tab, Esc, šipky, F klávesy, ale také Ctrl nebo Alt !)
- Můžete psát vícero jazyky rychleji a bez chyb. Diakritická znaménka mohou být vyvolána i za pomocí mrtvých kláves. Nejdříve zvolte diakritické znaménko a pak znak, který chcete obohatit o toto znaménko.
- Je vysoce nenáročná a rychlá. Zabere 500x méně místa než klávesnice od Googlu (Gboard) a 15x méně než výchozí klávesnice systému. Bez reklam, bez sledování.
- Má vícero rozložení: QWERTY, QWERTZ, AZERTY. Motivy: Bílá, Tmavá, OLED Černá. A mnoho dalších které si s drobnou znalostí programování můžete upravovat dle libosti.
Nezapomeňte... Jako každá virtuální klávesnice, i tato musí být aktivována v nastavení systému (zařízení). Otevřte (Systémové) Nastavení a přejděte na:
(Další nastavení NEBO Nastavení systému) > Jazyk & způsob zadávání > Spravovat klávesnice.

View File

@@ -1 +0,0 @@
Nenáročná virtuální klávesnice pro vývojáře.

View File

@@ -1 +0,0 @@
Klávesnice Unexpected

View File

@@ -1,21 +0,0 @@
Translations: Brazilian portuguese (@igorSilCar), Chinese-Simplified (@9-2-1), Korean (@notnickid)
New layouts: Swedish (@thabubble), Korean (@notnickid)
Improved computation of the swipe gesture and fix unstoppable key-repeat on
some devices.
Moved keys away from the edges of the screen and other improvements to the layouts.
Improved rendering of some symbols.
Added more characters to the keyboard:
- New combinations to Fn (@ArenaL5)
- Currency symbols
- Added arrow and box symbols (@sdrapha)
- F11 and F12.
Option for making modifiers lockable. (@sdrapha)
Fixes to the Spanish layout and other fixes. (@ArenaL5)
Many other fixes.
Huge thanks to the contributors: @igorSilCar, @sdrapha, @ArenaL5, @notnickid, @9-2-1, @thabubble

View File

@@ -1,25 +0,0 @@
Quick fix release.
Previously:
Translations: Brazilian portuguese (@igorSilCar), Chinese-Simplified (@9-2-1), Korean (@notnickid)
New layouts: Swedish (@thabubble), Korean (@notnickid)
Improved computation of the swipe gesture and fix unstoppable key-repeat on
some devices.
Moved keys away from the edges of the screen and other improvements to the layouts.
Improved rendering of some symbols.
Added more characters to the keyboard:
- New combinations to Fn (@ArenaL5)
- Currency symbols
- Added arrow and box symbols (@sdrapha)
- F11 and F12.
Option for making modifiers lockable. (@sdrapha)
Fixes to the Spanish layout and other fixes. (@ArenaL5)
Many other fixes.
Huge thanks to the contributors: @igorSilCar, @sdrapha, @ArenaL5, @notnickid, @9-2-1, @thabubble

View File

@@ -1,4 +0,0 @@
Fix compatibility with Android 6.
Translation improvements.
Huge thanks to the contributors: @marciozomb13

View File

@@ -1,7 +0,0 @@
Support languages: Lithuanian, Hungarian (@tbilles)
New layouts: Neo2 (@matthiakl)
Translation improvements (@polyctena, @marciozomb13)
Fix modifiers applied twice when typing quickly. Some other fixes.
Many thanks to the contributors: @matthiakl, @polyctena, @marciozomb13, @dircsem

View File

@@ -1,9 +0,0 @@
New languages: Turkish (@erqan), Dutch (Belgium) (@draxaris1010)
New layouts: Turkish (@erqan), Colemak (@dircsem), Hungarian QWERTY
Less typos: Select the closest key on swipe (@Rodrigodd)
Removed settings: Vibration, Show every accents
More tweaks to the layouts
Fixes to landscape mode, updated translations and more tweaks.
Thanks to the contributors: @erqan, @draxaris1010, @dircsem, @Rodrigodd, @meanindra

View File

@@ -1,5 +0,0 @@
Add back the vibration option.
Fix localized keys not in predefined positions.
Improvements to layouts.
Thanks to the contributors: @Thunder-Squirrel

View File

@@ -1,12 +0,0 @@
New supported languages: Polish, Ukrainian, Bengali, Norwegian
New layouts: Ukrainian, Bengali, Norwegian, Bone, Czech
New translations: Brazilian Portuguese, Italian, Russian, Czech
Hold modifiers to lock, double tap on shift disabled by default.
Option to add more keys to the keyboard.
Automatic capitalisation at beginning of sentences.
Added e-ink oriented theme.
New pane for greek letters and mathematical symbols.
Improvements to the layouts and various bug fixes.
Thanks to the contributors: @nanno, @Quantenzitrone, @eandersons, @iamrasel, @ChristianGynnild, @igorSilCar, @CastixGitHub, @94KONG, @ptrm, @Validbit

View File

@@ -1,7 +0,0 @@
New supported languages: Hindi, Greek
Disable fullscreen mode.
Improvements to layouts and translations.
Various fixes and improvements.
Thanks to the contributors: @sdrapha, @lpv11, @Raj9039852537, @polyctena

View File

@@ -1,11 +0,0 @@
New layouts: QWERTZ (Deutsch)
Add optional numpad for wide screens.
Add pin entry layout for numbers.
Remove option "Lockable modifiers".
Hide Alt and Meta keys by default.
Added more optional keys.
Allow typing password on boot.
Improvements to the layouts and bug fixes.
Thanks to the contributors: @geroxyz

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -1 +0,0 @@
Una Tastiera Virtuale Leggera Per La Programmazione

View File

@@ -1 +0,0 @@
Unexpected Keyboard

View File

@@ -1,18 +0,0 @@
이 앱은 안드로이드용 가상 키보드입니다. 주요 기능은 스와이프 제스처를 사용하여 모든 ASCII 문자를 쉽게 입력할 수 있다는 점과 악센트 및 수정자 키를 위한 데드 키와 특수 키(tab, esc, 방향키 등)이 있다는 것입니다.
키보드는 각 키의 모서리에 최대 4개의 추가 문자를 표시합니다. 이러한 추가 문자는 키에서 손가락을 스와이프하여 적중됩니다.
일부 하이라이트 기능:
- PC 키보드에서 사용할 수 있는 모든 문자 및 특수 키를 사요 가능합니다. 이것은 Termux와 같은 앱을 사용하는 데 효과적입니다.
- 여기에는 Tab, Esc, 방향키 및 function 키뿐만이 아닌 Ctrl 및 Alt 키도 포함되어 있습니다 !
- 악센트 키는 데드 키를 사용하여 액세스할 수 있습니다. 먼저 악센트 키를 활성화한 다음 악센트 문자를 입력합니다.
- 매우 가볍고 빠릅니다. Google 키보드보다 500배, 기본 키보드보다 15배 적은 공간을 사용합니다. 광고와 사용 기록 추적 없음.
- 다중 레이아웃: QWERTY, QWERTZ, AZERTY. 다양한 테마: White, Dark, OLED Black. 또한 다른 많은 옵션들.
다른 가상 키보드와 마찬가지로 시스템 설정에서 활성화해야 합니다. 시스템 설정을 열고 다음으로 이동합니다.
시스템 > 언어 및 입력 > 키보드 > 키보드 관리.

View File

@@ -1 +0,0 @@
개발자들을 위한 가벼운 가상 키보드.

View File

@@ -1 +0,0 @@
Unexpected Keyboard

View File

@@ -1,53 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" product="debug">Klávesnice Unexpected (pro ladění)</string>
<string name="app_name" product="default">Klávesnice Unexpected</string>
<string name="settings_activity_label">Nastavení Klávesnice Unexpected</string>
<string name="pref_category_layout">Rozvržení</string>
<string name="pref_layout_title">Změnit rozvržení klávesnice</string>
<string name="pref_layout_e_system">V nastavení systému</string>
<string name="pref_accents_title">(Univerzální) Diakritická znaménka</string>
<string name="pref_accents_e_all_installed">Zobrazovat znaménka pro všechny instalované systémové jazyky</string>
<string name="pref_accents_e_selected">Zobrazovat znaménka pouze pro současně zvolený jazyk</string>
<string name="pref_accents_e_none">Skrýt (univerzální) diakritická znaménka</string>
<string name="pref_autocapitalisation_title">Automatická kapitalizace</string>
<string name="pref_autocapitalisation_summary">Stiskne Shift na začátku věty</string>
<string name="pref_programming_layout_title">Rozložení klávesnice pro programování</string>
<string name="pref_programming_layout_none">Žádné</string>
<string name="pref_category_typing">Psaní</string>
<string name="pref_swipe_dist_title">Vzdálenost posunutí prstem</string>
<string name="pref_swipe_dist_summary">Jak daleko je třeba posunout prst pro napsaní znaku/diakritiky v rozích klávey (%s)</string>
<string name="pref_long_timeout_title">Časová prodleva opakování znaků</string>
<string name="pref_long_interval_title">Interval opakování znaků</string>
<string name="pref_vibrate_title">Vibrace</string>
<string name="pref_vibrate_summary">Zapnout/Vypnout vibrace při stisku klávesy</string>
<string name="pref_precise_repeat_title">Precizní posun kurzoru</string>
<string name="pref_precise_repeat_summary">Zda-li posun prstem ovlivňuje rychlost kurzoru</string>
<string name="pref_lock_double_tap_title">Dvojklik pro aktivaci caps lock(u)</string>
<string name="pref_lock_double_tap_summary">Dvojklik namísto držení modifikačních kláves po nějakou dobu</string>
<string name="pref_category_style">Styl</string>
<string name="pref_margin_bottom_title">Spodní odsazení</string>
<string name="pref_keyboard_height_title">Výška klávesnice</string>
<string name="pref_keyboard_height_landscape_title">Výška klávesnice v režimu na šířku</string>
<string name="pref_horizontal_margin_title">Boční odsazení</string>
<string name="pref_character_size_title">Velikost znaků</string>
<string name="pref_character_size_summary">Velikost znaků zobrazených na klávesnici (%.2fx)</string>
<string name="pref_theme">Motiv</string>
<string name="pref_theme_e_system">Dle systému</string>
<string name="pref_theme_e_dark">Tmavý</string>
<string name="pref_theme_e_light">Světlý</string>
<string name="pref_theme_e_black">Černý</string>
<string name="pref_swipe_dist_e_very_short">Velmi krátká</string>
<string name="pref_swipe_dist_e_short">Krátká</string>
<string name="pref_swipe_dist_e_default">Běžná</string>
<string name="pref_swipe_dist_e_far">Dlouhá</string>
<string name="pref_swipe_dist_e_very_far">Velmi dlouhá</string>
<string name="pref_key_horizontal_space">Horizontální mezery mezi klávesami</string>
<string name="pref_key_vertical_space">Vertikální mezery mezi klávesami</string>
<string name="key_action_next">Další</string>
<string name="key_action_done">Dokončit</string>
<string name="key_action_go">Spustit</string>
<string name="key_action_prev">Předchozí</string>
<string name="key_action_search">Hledat</string>
<string name="key_action_send">Odeslat</string>
</resources>

View File

@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name" product="debug">Unexpected Keyboard (Debug)</string>
<string name="app_name" product="default">Unexpected Keyboard</string>
<string name="settings_activity_label">Unexpected Keyboard - Einstellungen</string> <string name="settings_activity_label">Unexpected Keyboard - Einstellungen</string>
<string name="pref_category_layout">Layout</string> <string name="pref_category_layout">Layout</string>
<string name="pref_layout_title">Tastaturlayout ändern</string> <string name="pref_layout_title">Tastaturlayout ändern</string>
@@ -9,31 +7,22 @@
<string name="pref_accents_title">Akzente</string> <string name="pref_accents_title">Akzente</string>
<string name="pref_accents_e_all_installed">Akzente für alle installierten Sprachen anzeigen</string> <string name="pref_accents_e_all_installed">Akzente für alle installierten Sprachen anzeigen</string>
<string name="pref_accents_e_selected">Akzente nur für die gewählte Sprache anzeigen</string> <string name="pref_accents_e_selected">Akzente nur für die gewählte Sprache anzeigen</string>
<string name="pref_accents_e_all">Alle Akzente anzeigen</string>
<string name="pref_accents_e_none">Akzente verbergen</string> <string name="pref_accents_e_none">Akzente verbergen</string>
<string name="pref_show_numpad_title">Ziffernblock anzeigen</string>
<string name="pref_show_numpad_never">Nie</string>
<string name="pref_show_numpad_landscape">Nur im Querformat</string>
<string name="pref_show_numpad_always">Immer</string>
<string name="pref_programming_layout_title">Tastaturlayout zum Programmieren</string>
<string name="pref_extra_keys_title">Zusätzliche Zeichen zur Tastatur hinzufügen</string>
<string name="pref_programming_layout_none">Keines</string>
<string name="pref_category_typing">Tippen</string> <string name="pref_category_typing">Tippen</string>
<string name="pref_autocapitalisation_title">Automatische Großschreibung</string>
<string name="pref_autocapitalisation_summary">Shift-Taste am Satzanfang aktivieren</string>
<string name="pref_swipe_dist_title">Länge der Wischgeste</string> <string name="pref_swipe_dist_title">Länge der Wischgeste</string>
<string name="pref_swipe_dist_summary">Abstand der Zeichen in den Ecken der Tasten (%s)</string> <string name="pref_swipe_dist_summary">Abstand der Zeichen in den Ecken der Tasten (%s)</string>
<string name="pref_long_timeout_title">Zeitüberschreitung bei Tastenwiederholung</string> <string name="pref_long_timeout_title">Zeitüberschreitung bei Tastenwiederholung</string>
<string name="pref_long_interval_title">Intervall der Tastenwiederholung</string> <string name="pref_long_interval_title">Intervall der Tastenwiederholung</string>
<string name="pref_category_vibrate">Vibration</string>
<string name="pref_vibrate_title">Vibration</string> <string name="pref_vibrate_title">Vibration</string>
<string name="pref_vibrate_summary">Vibration bei Tastendruck ein-/ausschalten</string> <string name="pref_vibrate_summary">Vibration bei Tastendruck ein-/ausschalten</string>
<string name="pref_vibrate_duration_title">Dauer</string>
<string name="pref_precise_repeat_title">Präzise Cursorsteuerung</string> <string name="pref_precise_repeat_title">Präzise Cursorsteuerung</string>
<string name="pref_precise_repeat_summary">Geschwindigkeit der Tastenwiederholung durch weniger oder mehr Wischen anpassen</string> <string name="pref_precise_repeat_summary">Geschwindigkeit der Tastenwiederholung durch weniger oder mehr Wischen anpassen</string>
<string name="pref_lock_double_tap_title">Umschalttaste mit Doppeltippen einrasten</string>
<string name="pref_lock_double_tap_summary">Anstatt Taste längere Zeit gedrückt zu halten</string>
<string name="pref_category_style">Design</string> <string name="pref_category_style">Design</string>
<string name="pref_margin_bottom_title">Unterer Abstand</string> <string name="pref_margin_bottom_title">Unterer Abstand</string>
<string name="pref_keyboard_height_title">Höhe der Tastatur</string> <string name="pref_keyboard_height_title">Höhe der Tastatur</string>
<string name="pref_keyboard_height_landscape_title">Höhe der Tastatur im Querformat</string>
<string name="pref_horizontal_margin_title">Horizontaler Abstand</string> <string name="pref_horizontal_margin_title">Horizontaler Abstand</string>
<string name="pref_character_size_title">Größe der Beschriftung</string> <string name="pref_character_size_title">Größe der Beschriftung</string>
<string name="pref_character_size_summary">Größe der Buchstaben auf den Tasten (%.2fx)</string> <string name="pref_character_size_summary">Größe der Buchstaben auf den Tasten (%.2fx)</string>
@@ -42,7 +31,6 @@
<string name="pref_theme_e_dark">Dunkel</string> <string name="pref_theme_e_dark">Dunkel</string>
<string name="pref_theme_e_light">Hell</string> <string name="pref_theme_e_light">Hell</string>
<string name="pref_theme_e_black">Schwarz</string> <string name="pref_theme_e_black">Schwarz</string>
<string name="pref_theme_e_white">Weiß</string>
<string name="pref_swipe_dist_e_very_short">Sehr kurz</string> <string name="pref_swipe_dist_e_very_short">Sehr kurz</string>
<string name="pref_swipe_dist_e_short">Kurz</string> <string name="pref_swipe_dist_e_short">Kurz</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_default">Normal</string>

View File

@@ -7,14 +7,17 @@
<string name="pref_accents_title">Acentos</string> <string name="pref_accents_title">Acentos</string>
<string name="pref_accents_e_all_installed">Mostrar acentos para todos los lenguajes instalados</string> <string name="pref_accents_e_all_installed">Mostrar acentos para todos los lenguajes instalados</string>
<string name="pref_accents_e_selected">Solo mostrar acentos para el lenguaje seleccionado</string> <string name="pref_accents_e_selected">Solo mostrar acentos para el lenguaje seleccionado</string>
<string name="pref_accents_e_all">Mostrar todos los acentos</string>
<string name="pref_accents_e_none">Ocultar acentos</string> <string name="pref_accents_e_none">Ocultar acentos</string>
<string name="pref_category_typing">Escribiendo</string> <string name="pref_category_typing">Escribiendo</string>
<string name="pref_swipe_dist_title">Distancia para deslizar</string> <string name="pref_swipe_dist_title">Distancia para deslizar</string>
<string name="pref_swipe_dist_summary">Distancia de caracteres en las esquinas de las letras (%s)</string> <string name="pref_swipe_dist_summary">Distancia de caractéres en las esquinas de las letras (%s)</string>
<string name="pref_long_timeout_title">Tiempo de espera de repetición de tecla</string> <string name="pref_long_timeout_title">Tiempo de espera de repetición de tecla</string>
<string name="pref_long_interval_title">Intervalo de repetición de tecla</string> <string name="pref_long_interval_title">Intervalo de repetición de tecla</string>
<string name="pref_category_vibrate">Vibración</string>
<string name="pref_vibrate_title">Vibración</string> <string name="pref_vibrate_title">Vibración</string>
<string name="pref_vibrate_summary">Habilitar/deshabilitar vibración al presionar una tecla</string> <string name="pref_vibrate_summary">Habilitar/deshabilitar vibración al presionar una tecla</string>
<string name="pref_vibrate_duration_title">Duración</string>
<string name="pref_precise_repeat_title">Movimientos de cursor preciso</string> <string name="pref_precise_repeat_title">Movimientos de cursor preciso</string>
<string name="pref_precise_repeat_summary">Modular la velocidad de repetición de teclas según si se desliza más o menos</string> <string name="pref_precise_repeat_summary">Modular la velocidad de repetición de teclas según si se desliza más o menos</string>
<string name="pref_category_style">Estilo</string> <string name="pref_category_style">Estilo</string>
@@ -22,7 +25,7 @@
<string name="pref_keyboard_height_title">Altura del teclado</string> <string name="pref_keyboard_height_title">Altura del teclado</string>
<string name="pref_horizontal_margin_title">Margen horizontal</string> <string name="pref_horizontal_margin_title">Margen horizontal</string>
<string name="pref_character_size_title">Tamaño de etiqueta</string> <string name="pref_character_size_title">Tamaño de etiqueta</string>
<string name="pref_character_size_summary">Tamaño de caracteres mostrados en el teclado (%.2fx)</string> <string name="pref_character_size_summary">Tamaño de caractéres mostrados en el teclado (%.2fx)</string>
<string name="pref_theme">Tema</string> <string name="pref_theme">Tema</string>
<string name="pref_theme_e_system">Ajustes de sistema</string> <string name="pref_theme_e_system">Ajustes de sistema</string>
<string name="pref_theme_e_dark">Oscuro</string> <string name="pref_theme_e_dark">Oscuro</string>

View File

@@ -7,26 +7,22 @@
<string name="pref_accents_title">Accents</string> <string name="pref_accents_title">Accents</string>
<string name="pref_accents_e_all_installed">Afficher les accents pour les langues installées</string> <string name="pref_accents_e_all_installed">Afficher les accents pour les langues installées</string>
<string name="pref_accents_e_selected">Afficher les accents pour la langue sélectionnée</string> <string name="pref_accents_e_selected">Afficher les accents pour la langue sélectionnée</string>
<string name="pref_accents_e_all">Afficher tous les accents</string>
<string name="pref_accents_e_none">Cacher les accents</string> <string name="pref_accents_e_none">Cacher les accents</string>
<string name="pref_show_numpad_title">Afficher le pavé numérique</string>
<string name="pref_show_numpad_never">Jamais</string>
<string name="pref_show_numpad_landscape">Seulement en mode paysage</string>
<string name="pref_show_numpad_always">Toujour</string>
<string name="pref_autocapitalisation_title">Majuscule automatique</string>
<string name="pref_autocapitalisation_summary">Active Shift au début des phrases</string>
<string name="pref_category_typing">Saisie</string> <string name="pref_category_typing">Saisie</string>
<string name="pref_swipe_dist_title">Distance de swipe</string> <string name="pref_swipe_dist_title">Distance de swipe</string>
<string name="pref_swipe_dist_summary">La distance des caractères dans les coins (%s)</string> <string name="pref_swipe_dist_summary">La distance des caractères dans les coins (%s)</string>
<string name="pref_long_timeout_title">Délai avant répétition</string> <string name="pref_long_timeout_title">Délai avant répétition</string>
<string name="pref_long_interval_title">Écart entre répétitions</string> <string name="pref_long_interval_title">Écart entre répétitions</string>
<string name="pref_category_vibrate">Vibration</string>
<string name="pref_vibrate_title">Vibreur</string> <string name="pref_vibrate_title">Vibreur</string>
<string name="pref_vibrate_summary">Vibration a chaque touche</string> <string name="pref_vibrate_summary">Vibration a chaque touche</string>
<string name="pref_vibrate_duration_title">Durée</string>
<string name="pref_precise_repeat_title">Mouvement précis du curseur</string> <string name="pref_precise_repeat_title">Mouvement précis du curseur</string>
<string name="pref_precise_repeat_summary">Modifier la vitesse de répétition en bougeant le doigt</string> <string name="pref_precise_repeat_summary">Modifier la vitesse de répétition en bougeant le doigt</string>
<string name="pref_category_style">Style</string> <string name="pref_category_style">Style</string>
<string name="pref_margin_bottom_title">Marge du bas</string> <string name="pref_margin_bottom_title">Marge du bas</string>
<string name="pref_keyboard_height_title">Hauteur du clavier</string> <string name="pref_keyboard_height_title">Hauteur du clavier</string>
<string name="pref_keyboard_height_landscape_title">Hauteur du clavier en mode paysage</string>
<string name="pref_horizontal_margin_title">Marge des côtés</string> <string name="pref_horizontal_margin_title">Marge des côtés</string>
<string name="pref_character_size_title">Taille des labels</string> <string name="pref_character_size_title">Taille des labels</string>
<string name="pref_character_size_summary">Taille des caractères affichés sur les touches (%.2fx)</string> <string name="pref_character_size_summary">Taille des caractères affichés sur les touches (%.2fx)</string>
@@ -35,7 +31,6 @@
<string name="pref_theme_e_dark">Sombre</string> <string name="pref_theme_e_dark">Sombre</string>
<string name="pref_theme_e_light">Clair</string> <string name="pref_theme_e_light">Clair</string>
<string name="pref_theme_e_black">Noir</string> <string name="pref_theme_e_black">Noir</string>
<string name="pref_theme_e_white">Blanc</string>
<string name="pref_swipe_dist_e_very_short">Très courte</string> <string name="pref_swipe_dist_e_very_short">Très courte</string>
<string name="pref_swipe_dist_e_short">Courte</string> <string name="pref_swipe_dist_e_short">Courte</string>
<string name="pref_swipe_dist_e_default">Normale</string> <string name="pref_swipe_dist_e_default">Normale</string>

View File

@@ -1,53 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" product="debug">Unexpected Keyboard (debug)</string>
<string name="app_name" product="default">Unexpected Keyboard</string>
<string name="settings_activity_label">Impostazioni di Unexpected Keyboard</string>
<string name="pref_category_layout">Layout</string>
<string name="pref_layout_title">Cambia layout tastiera</string>
<string name="pref_layout_e_system">Impostazioni di sistema</string>
<string name="pref_accents_title">Accenti</string>
<string name="pref_accents_e_all_installed">Mostra accenti per tutte le lingue installate</string>
<string name="pref_accents_e_selected">Mostra accenti solo per le lingue selezionate</string>
<string name="pref_accents_e_none">Nascondi accenti</string>
<string name="pref_autocapitalisation_title">Maiuscole Automatiche</string>
<string name="pref_autocapitalisation_summary">Premi Shift all\'inizio di una frase</string>
<string name="pref_programming_layout_title">Layout tastiera per programmare</string>
<string name="pref_programming_layout_none">Nessuno</string>
<string name="pref_category_typing">Digitando</string>
<string name="pref_swipe_dist_title">Distanza swipe</string>
<string name="pref_swipe_dist_summary">Distanza dei caratteri negli angoli dei tasti (%s)</string>
<string name="pref_long_timeout_title">Timeout ripetizione tasto</string>
<string name="pref_long_interval_title">Intervallo ripetizione tasto</string>
<string name="pref_vibrate_title">Vibrazione</string>
<string name="pref_vibrate_summary">Abilita/Disabilita Vibrazione alla pressione dei tasti</string>
<string name="pref_precise_repeat_title">Movimento puntatore preciso</string>
<string name="pref_precise_repeat_summary">Modula la veocità della ripetizione con lo swipe</string>
<string name="pref_lock_double_tap_title">Doppio tocco su Shift per attivare CapsLock</string>
<string name="pref_lock_double_tap_summary">Invece di premere i modificatori a lungo</string>
<string name="pref_category_style">Stile</string>
<string name="pref_margin_bottom_title">Margine inferiore</string>
<string name="pref_keyboard_height_title">Altezza tastiera</string>
<string name="pref_keyboard_height_landscape_title">Altezza tastiera in modalità orizzontale</string>
<string name="pref_horizontal_margin_title">Margine orizzontale</string>
<string name="pref_character_size_title">Dimensione Caratteri</string>
<string name="pref_character_size_summary">Dimensione dei caratteri mostrati sulla tastiera (%.2fx)</string>
<string name="pref_theme">Tema</string>
<string name="pref_theme_e_system">Impostazioni di sistema</string>
<string name="pref_theme_e_dark">Scuro</string>
<string name="pref_theme_e_light">Chiaro</string>
<string name="pref_theme_e_black">Nero</string>
<string name="pref_swipe_dist_e_very_short">Veramente breve</string>
<string name="pref_swipe_dist_e_short">Breve</string>
<string name="pref_swipe_dist_e_default">Normale</string>
<string name="pref_swipe_dist_e_far">Distante</string>
<string name="pref_swipe_dist_e_very_far">Molto distante</string>
<string name="pref_key_horizontal_space">Spazio orizzontale tra i tasti</string>
<string name="pref_key_vertical_space">Spazio verticale tra i tasti</string>
<string name="key_action_next">Prossimo</string>
<string name="key_action_done">Fatto</string>
<string name="key_action_go">Vai</string>
<string name="key_action_prev">Precedente</string>
<string name="key_action_search">Cerca</string>
<string name="key_action_send">Invia</string>
</resources>

View File

@@ -1,44 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="settings_activity_label">Unexpected Keyboard 설정</string>
<string name="pref_category_layout">레이아웃</string>
<string name="pref_layout_title">키보드 레이아웃 변경</string>
<string name="pref_layout_e_system">시스템 세팅</string>
<string name="pref_accents_title">악센트</string>
<string name="pref_accents_e_all_installed">설치된 모든 언어의 악센트 표시</string>
<string name="pref_accents_e_selected">선택한 언어의 악센트만 표시</string>
<string name="pref_accents_e_none">모든 언어의 악센트 숨기기</string>
<string name="pref_category_typing">타자</string>
<string name="pref_swipe_dist_title">스와이프 범위</string>
<string name="pref_swipe_dist_summary">키 모서리 문자의 입력 범위 (%s)</string>
<string name="pref_long_timeout_title">키 길게 누르기 지연</string>
<string name="pref_long_interval_title">키 반복 간격</string>
<string name="pref_vibrate_title">진동</string>
<string name="pref_vibrate_summary">키 누를 때 진동 키거/끄기</string>
<string name="pref_precise_repeat_title">정확한 커서 움직임</string>
<string name="pref_precise_repeat_summary">더 많거나 적은 스와이프로 키 반복 조절</string>
<string name="pref_category_style">스타일</string>
<string name="pref_margin_bottom_title">아래 넓이</string>
<string name="pref_keyboard_height_title">키보드 높이</string>
<string name="pref_horizontal_margin_title">양 옆 넓이</string>
<string name="pref_character_size_title">폰트 크기</string>
<string name="pref_character_size_summary">키보드의 표시되는 폰트 크기 (%.2fx)</string>
<string name="pref_theme">테마</string>
<string name="pref_theme_e_system">시스템 테마</string>
<string name="pref_theme_e_dark">Dark</string>
<string name="pref_theme_e_light">Light</string>
<string name="pref_theme_e_black">Black</string>
<string name="pref_swipe_dist_e_very_short">매우 짧음</string>
<string name="pref_swipe_dist_e_short">짧음</string>
<string name="pref_swipe_dist_e_default">보통</string>
<string name="pref_swipe_dist_e_far">넓음</string>
<string name="pref_swipe_dist_e_very_far">매우 넓음</string>
<string name="pref_key_horizontal_space">키보드 양 옆 간격</string>
<string name="pref_key_vertical_space">키보드 세로 간격</string>
<string name="key_action_next">다음</string>
<string name="key_action_done">확인</string>
<string name="key_action_go">Go</string>
<string name="key_action_prev">이전</string>
<string name="key_action_search">검색</string>
<string name="key_action_send">보내기</string>
</resources>

View File

@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<dimen name="horizontal_margin">12dp</dimen>
<dimen name="margin_bottom">3dp</dimen>
<dimen name="key_padding">3dp</dimen>
<dimen name="key_height">36dp</dimen>
<item name="label_text_size" type="integer" format="float">0.4</item>
<item name="sublabel_text_size" type="integer" format="float">0.3</item>
<dimen name="emoji_type_button_height">48dp</dimen> <dimen name="emoji_type_button_height">48dp</dimen>
<dimen name="extra_horizontal_margin">25dp</dimen> <dimen name="extra_horizontal_margin">20dp</dimen>
</resources> </resources>

View File

@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name" product="debug">Unexpected Keyboard (atkļūdošana)</string>
<string name="app_name" product="default">Unexpected Keyboard</string>
<string name="settings_activity_label">Unexpected Keyboard iestatījumi</string> <string name="settings_activity_label">Unexpected Keyboard iestatījumi</string>
<string name="pref_category_layout">Izkārtojums</string> <string name="pref_category_layout">Izkārtojums</string>
<string name="pref_layout_title">Mainīt tastatūras izkārtojumu</string> <string name="pref_layout_title">Mainīt tastatūras izkārtojumu</string>
@@ -9,27 +7,22 @@
<string name="pref_accents_title">Uzsvara zīmes</string> <string name="pref_accents_title">Uzsvara zīmes</string>
<string name="pref_accents_e_all_installed">Rādīt uzsvara zīmes visām uzstādītajām valodām</string> <string name="pref_accents_e_all_installed">Rādīt uzsvara zīmes visām uzstādītajām valodām</string>
<string name="pref_accents_e_selected">Rādīt uzsvara zīmes tikai atlasītajām valodām</string> <string name="pref_accents_e_selected">Rādīt uzsvara zīmes tikai atlasītajām valodām</string>
<string name="pref_accents_e_all">Rādīt visas uzsvara zīmes</string>
<string name="pref_accents_e_none">Paslēpt uzsvara zīmes</string> <string name="pref_accents_e_none">Paslēpt uzsvara zīmes</string>
<string name="pref_autocapitalisation_title">Automātiski lielie burti</string>
<string name="pref_autocapitalisation_summary">Piespiest Shift teikuma sākumā</string>
<string name="pref_extra_keys_title">Pievienot tastatūrai taustiņus</string>
<string name="pref_programming_layout_title">Tastatūras izkārtojums programmēšanai</string>
<string name="pref_programming_layout_none">Neviens</string>
<string name="pref_category_typing">Rakstīšana</string> <string name="pref_category_typing">Rakstīšana</string>
<string name="pref_swipe_dist_title">Pavilkšanas attālums</string> <string name="pref_swipe_dist_title">Pavilkšanas attālums</string>
<string name="pref_swipe_dist_summary">Taustiņu stūros esošo rakstzīmju attālums (%s)</string> <string name="pref_swipe_dist_summary">Taustiņu stūros esošo rakstzīmju attālums (%s)</string>
<string name="pref_long_timeout_title">Taustiņa atkārtošanās ātrums</string> <string name="pref_long_timeout_title">Taustiņa atkārtošanās ātrums</string>
<string name="pref_long_interval_title">Taustiņa atkārtošanās aizture</string> <string name="pref_long_interval_title">Taustiņa atkārtošanās aizture</string>
<string name="pref_category_vibrate">Trīcēšana</string>
<string name="pref_vibrate_title">Trīcēšana</string> <string name="pref_vibrate_title">Trīcēšana</string>
<string name="pref_vibrate_summary">Iespējot/atspējot taustiņa piespiešanas trīcēšanu</string> <string name="pref_vibrate_summary">Iespējot/atspējot taustiņa piespiešanas trīcēšanu</string>
<string name="pref_vibrate_duration_title">Ilgums</string>
<string name="pref_precise_repeat_title">Pielāgojama kursora kustība</string> <string name="pref_precise_repeat_title">Pielāgojama kursora kustība</string>
<string name="pref_precise_repeat_summary">Mainīt taustiņa atkārtošanās ātrumu ar pavilkšanas attālumu</string> <string name="pref_precise_repeat_summary">Mainīt taustiņa atkārtošanās ātrumu ar pavilkšanas attālumu</string>
<string name="pref_lock_double_tap_title">Divkāršs piesitiens burtslēgam</string>
<string name="pref_lock_double_tap_summary">Tā vietā, lai ilstoši piespiestu pārveidotāju</string>
<string name="pref_category_style">Izskata pielāgojumi</string> <string name="pref_category_style">Izskata pielāgojumi</string>
<string name="pref_margin_bottom_title">Apakšējā apmale</string> <string name="pref_margin_bottom_title">Apakšējā apmale</string>
<string name="pref_keyboard_height_title">Tastatūras augstums</string> <string name="pref_keyboard_height_title">Tastatūras augstums</string>
<string name="pref_keyboard_height_landscape_title">Tastatūras augstums guleniski</string>
<string name="pref_horizontal_margin_title">Līmeniskā apmale</string> <string name="pref_horizontal_margin_title">Līmeniskā apmale</string>
<string name="pref_character_size_title">Iezīmes izmērs</string> <string name="pref_character_size_title">Iezīmes izmērs</string>
<string name="pref_character_size_summary">Tastatūrā attēloto rakstzīmju izmērs (%.2fx)</string> <string name="pref_character_size_summary">Tastatūrā attēloto rakstzīmju izmērs (%.2fx)</string>
@@ -43,8 +36,6 @@
<string name="pref_swipe_dist_e_default">Vidējs</string> <string name="pref_swipe_dist_e_default">Vidējs</string>
<string name="pref_swipe_dist_e_far">Tāls</string> <string name="pref_swipe_dist_e_far">Tāls</string>
<string name="pref_swipe_dist_e_very_far">Ļoti tāls</string> <string name="pref_swipe_dist_e_very_far">Ļoti tāls</string>
<string name="pref_key_horizontal_space">Līmeniskais attālums starp taustiņiem</string>
<string name="pref_key_vertical_space">Stateniskais attālums starp taustiņiem</string>
<string name="key_action_next">Nākamais</string> <string name="key_action_next">Nākamais</string>
<string name="key_action_done">Darīts</string> <string name="key_action_done">Darīts</string>
<string name="key_action_go">Aiziet</string> <string name="key_action_go">Aiziet</string>

View File

@@ -1,34 +1,30 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name" product="debug">Teclado Unexpected</string> <string name="settings_activity_label">Configurações Unexpected Keyboard</string>
<string name="app_name" product="default">Teclado Unexpected</string>
<string name="settings_activity_label">Configurar Teclado Unexpected</string>
<string name="pref_category_layout">Layout</string> <string name="pref_category_layout">Layout</string>
<string name="pref_layout_title">Mudar layout do teclado</string> <string name="pref_layout_title">Mudar layout do teclado</string>
<string name="pref_layout_e_system">Mesmo do sistema</string> <string name="pref_layout_e_system">Mesmo do sistema</string>
<string name="pref_accents_title">Acentos</string> <string name="pref_accents_title">Acentos</string>
<string name="pref_accents_e_all_installed">Mostrar acentos para todos os idiomas instalados</string> <string name="pref_accents_e_all_installed">Mostrar acentos para todos idiomas instalados</string>
<string name="pref_accents_e_selected">Mostrar acentos só para o idioma selecionado</string> <string name="pref_accents_e_selected">Mostrar acentos só para o idioma selecionado</string>
<string name="pref_accents_e_none">Ocultar acentos</string> <string name="pref_accents_e_all">Mostrar todos acentos</string>
<string name="pref_autocapitalisation_title">Maiusculização automática</string> <string name="pref_accents_e_none">Esconder acentos</string>
<string name="pref_autocapitalisation_summary">Aciona o shift no início de cada frase</string>
<string name="pref_programming_layout_title">Layout do teclado para programação</string>
<string name="pref_programming_layout_none">Nenhum</string>
<string name="pref_category_typing">Digitação</string> <string name="pref_category_typing">Digitação</string>
<string name="pref_swipe_dist_title">Distância a deslizar</string> <string name="pref_swipe_dist_title">Distância a deslizar</string>
<string name="pref_swipe_dist_summary">Distância até acionar os cantos das teclas (%s)</string> <string name="pref_swipe_dist_summary">Distância até acionar os cantos das teclas (%s)</string>
<string name="pref_long_timeout_title">Tempo até repetir tecla</string> <string name="pref_long_timeout_title">Tempo até repetir tecla</string>
<string name="pref_long_interval_title">Intervalo de repetição de tecla</string> <string name="pref_long_interval_title">Intervalo para repetir tecla</string>
<string name="pref_category_vibrate">Vibração</string>
<string name="pref_vibrate_title">Vibração</string> <string name="pref_vibrate_title">Vibração</string>
<string name="pref_vibrate_summary">Ativar/desativar vibração ao digitar</string> <string name="pref_vibrate_summary">Ativar/desativar vibração ao digitar</string>
<string name="pref_vibrate_duration_title">Duração</string>
<string name="pref_precise_repeat_title">Precisão nos movimentos do cursor</string> <string name="pref_precise_repeat_title">Precisão nos movimentos do cursor</string>
<string name="pref_precise_repeat_summary">Varia a velocidade de repetição a depender do quanto deslizar</string> <string name="pref_precise_repeat_summary">Varia a velocidade de repetição ao depender de quanto deslizar</string>
<string name="pref_lock_double_tap_title">Tecle duas vezes no shift para caixa alta</string> <string name="pref_lockable_keys_title">Segurar teclas</string>
<string name="pref_lock_double_tap_summary">Ao invés de apertar e segurar por um tempo</string> <string name="pref_lockable_keys_summary">Teclas que podem ficar seguradas ao teclar duas vezes</string>
<string name="pref_category_style">Estilo</string> <string name="pref_category_style">Estilo</string>
<string name="pref_margin_bottom_title">Margem inferior</string> <string name="pref_margin_bottom_title">Margem de baixo</string>
<string name="pref_keyboard_height_title">Altura do teclado</string> <string name="pref_keyboard_height_title">Altura do teclado</string>
<string name="pref_keyboard_height_landscape_title">Altura do teclado em modo paisagem</string>
<string name="pref_horizontal_margin_title">Margem horizontal</string> <string name="pref_horizontal_margin_title">Margem horizontal</string>
<string name="pref_character_size_title">Tamanho dos indicadores</string> <string name="pref_character_size_title">Tamanho dos indicadores</string>
<string name="pref_character_size_summary">Tamanho dos caracteres visíveis no teclado (%.2fx)</string> <string name="pref_character_size_summary">Tamanho dos caracteres visíveis no teclado (%.2fx)</string>

View File

@@ -1,48 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Unexpected Keyboard</string>
<string name="settings_activity_label">Unexpected Keyboard Настройки</string>
<string name="pref_category_layout">Расположение</string>
<string name="pref_layout_title">Изменить раскладку клавиатуры</string>
<string name="pref_layout_e_system">Системные настройки</string>
<string name="pref_accents_title">Акцент</string>
<string name="pref_accents_e_all_installed">Показывать акценты для всех установленных языков</string>
<string name="pref_accents_e_selected">Показывать акценты только для выбранного языка</string>
<string name="pref_accents_e_none">Скрыть акценты</string>
<string name="pref_programming_layout_title">Раскладка клавиатуры для программирования</string>
<string name="pref_programming_layout_none">Нету</string>
<string name="pref_category_typing">Печатание</string>
<string name="pref_swipe_dist_title">Расстояние пролистывания</string>
<string name="pref_swipe_dist_summary">Расстояние между символами в углах клавиш (%s)</string>
<string name="pref_long_timeout_title">Тайм-аут повтора ключа</string>
<string name="pref_long_interval_title">Интервал повторения клавиш</string>
<string name="pref_vibrate_title">Вибрация</string>
<string name="pref_vibrate_summary">Включение/выключение вибрации при нажатии клавиши</string>
<string name="pref_precise_repeat_title">Точные перемещения курсора</string>
<string name="pref_precise_repeat_summary">Модулируйте скорость повторения клавиш, проводя пальцем больше или меньше</string>
<string name="pref_category_style">Стиль</string>
<string name="pref_margin_bottom_title">Нижняя граница поля</string>
<string name="pref_keyboard_height_title">Высота клавиатуры</string>
<string name="pref_keyboard_height_landscape_title">Высота клавиатуры в ландшафтном режиме</string>
<string name="pref_horizontal_margin_title">Горизонтальное поле</string>
<string name="pref_character_size_title">Размер этикетки</string>
<string name="pref_character_size_summary">Размер символов, отображаемых на клавиатуре (%.2fx)</string>
<string name="pref_theme">Тема</string>
<string name="pref_theme_e_system">Системные настройки</string>
<string name="pref_theme_e_dark">Темный</string>
<string name="pref_theme_e_light">Светлый</string>
<string name="pref_theme_e_black">Черный</string>
<string name="pref_swipe_dist_e_very_short">Очень короткий</string>
<string name="pref_swipe_dist_e_short">Короткий</string>
<string name="pref_swipe_dist_e_default">Обычный</string>
<string name="pref_swipe_dist_e_far">Far</string>
<string name="pref_swipe_dist_e_very_far">Очень далеко</string>
<string name="pref_key_horizontal_space">Горизонтальное расстояние между клавишами</string>
<string name="pref_key_vertical_space">Расстояние по вертикали между клавишами</string>
<string name="key_action_next">Next</string>
<string name="key_action_done">Ввод</string>
<string name="key_action_go">Go</string>
<string name="key_action_prev">Предыдущий</string>
<string name="key_action_search">Поиск</string>
<string name="key_action_send">Отправить</string>
</resources>

View File

@@ -1,48 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" product="debug">Unexpected Keyboard (debug)</string>
<string name="app_name" product="default">Unexpected Keyboard</string>
<string name="settings_activity_label">Unexpected Keyboard Ayarları</string>
<string name="pref_category_layout">Düzen</string>
<string name="pref_layout_title">Klavye Düzenini Değiştir</string>
<string name="pref_layout_e_system">Sistem Ayarları</string>
<string name="pref_accents_title">Aksanlar</string>
<string name="pref_accents_e_all_installed">Yüklü tüm dillerin aksanlarını göster</string>
<string name="pref_accents_e_selected">Sadece seçili dilin aksanlarını göster</string>
<string name="pref_accents_e_none">Aksanları gizle</string>
<string name="pref_programming_layout_title">Programlama için klavye düzeni</string>
<string name="pref_programming_layout_none">Hiçbiri</string>
<string name="pref_category_typing">Yazma</string>
<string name="pref_swipe_dist_title">Kaydırma mesafesi</string>
<string name="pref_swipe_dist_summary">Tuşların köşelerindeki karakterlerin uzaklıkları (%s)</string>
<string name="pref_long_timeout_title">Tuş tekrarlama beklemesi</string>
<string name="pref_long_interval_title">Tuş tekrarlama aralığı</string>
<string name="pref_vibrate_title">Titreşim</string>
<string name="pref_vibrate_summary">Tuşa basıldığında titreşimi etkinleştir</string>
<string name="pref_precise_repeat_title">İmleç hareketini ayarla</string>
<string name="pref_precise_repeat_summary">Tuş tekrar hızını az ya da çok kaydırarak ayarla</string>
<string name="pref_category_style">Stil</string>
<string name="pref_margin_bottom_title">Alt boşluk</string>
<string name="pref_keyboard_height_title">Klavye yüksekliği</string>
<string name="pref_horizontal_margin_title">Yatay boşluk</string>
<string name="pref_character_size_title">Etiket boyutu</string>
<string name="pref_character_size_summary">Klavye üzerinde gösterilecek karakter boyutu (%.2fx)</string>
<string name="pref_theme">Tema</string>
<string name="pref_theme_e_system">Sistem Ayarları</string>
<string name="pref_theme_e_dark">Koyu</string>
<string name="pref_theme_e_light">ık</string>
<string name="pref_theme_e_black">Siyah</string>
<string name="pref_swipe_dist_e_very_short">Çok kısa</string>
<string name="pref_swipe_dist_e_short">Kısa</string>
<string name="pref_swipe_dist_e_default">Normal</string>
<string name="pref_swipe_dist_e_far">Uzun</string>
<string name="pref_swipe_dist_e_very_far">Çok uzun</string>
<string name="pref_key_horizontal_space">Tuşlar arasındaki yatay boşluk</string>
<string name="pref_key_vertical_space">Tuşlar arasındaki dikey boşluk</string>
<string name="key_action_next">İleri</string>
<string name="key_action_done">Bitti</string>
<string name="key_action_go">İlerle</string>
<string name="key_action_prev">Geri</string>
<string name="key_action_search">Ara</string>
<string name="key_action_send">Gönder</string>
</resources>

View File

@@ -1,46 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" product="debug">Unexpected Keyboard (debug)</string>
<string name="app_name" product="default">Unexpected Keyboard</string>
<string name="settings_activity_label">Unexpected Keyboard 设置</string>
<string name="pref_category_layout">布局</string>
<string name="pref_layout_title">改变键盘布局</string>
<string name="pref_layout_e_system">系统设置</string>
<string name="pref_accents_title">声调</string>
<string name="pref_accents_e_all_installed">显示所有安装的语言的声调符号</string>
<string name="pref_accents_e_selected">只显示选择的语言的声调符号</string>
<string name="pref_accents_e_none">隐藏声调符号</string>
<string name="pref_category_typing">输入</string>
<string name="pref_swipe_dist_title">滑动触发距离</string>
<string name="pref_swipe_dist_summary">输入按键四角的符号需要滑动的距离 (%s)</string>
<string name="pref_long_timeout_title">长按到开始重复输入的时间</string>
<string name="pref_long_interval_title">长按后每次重复输入的时间间隔</string>
<string name="pref_vibrate_title">振动</string>
<string name="pref_vibrate_summary">启用或者禁用按下按键时振动</string>
<string name="pref_precise_repeat_title">精确控制光标移速</string>
<string name="pref_precise_repeat_summary">按键重复按下速度由手指滑动的距离决定</string>
<string name="pref_category_style">样式</string>
<string name="pref_margin_bottom_title">键盘下边距</string>
<string name="pref_keyboard_height_title">键盘高度</string>
<string name="pref_horizontal_margin_title">键盘左右边距</string>
<string name="pref_character_size_title">字符大小</string>
<string name="pref_character_size_summary">按键上显示的字符的大小 (%.2fx)</string>
<string name="pref_theme">主题</string>
<string name="pref_theme_e_system">跟随系统设置</string>
<string name="pref_theme_e_dark">暗色</string>
<string name="pref_theme_e_light">亮色</string>
<string name="pref_theme_e_black">黑色</string>
<string name="pref_swipe_dist_e_very_short">非常短</string>
<string name="pref_swipe_dist_e_short"></string>
<string name="pref_swipe_dist_e_default">中(默认)</string>
<string name="pref_swipe_dist_e_far"></string>
<string name="pref_swipe_dist_e_very_far">非常长</string>
<string name="pref_key_horizontal_space">按键的左右边距</string>
<string name="pref_key_vertical_space">按键的上下边距</string>
<string name="key_action_next">下一项</string>
<string name="key_action_done">完成</string>
<string name="key_action_go">前往</string>
<string name="key_action_prev">前一项</string>
<string name="key_action_search">搜索</string>
<string name="key_action_send">发送</string>
</resources>

View File

@@ -6,26 +6,12 @@
<item>qwerty</item> <item>qwerty</item>
<item>qwerty_pt</item> <item>qwerty_pt</item>
<item>qwerty_es</item> <item>qwerty_es</item>
<item>qwerty_el</item>
<item>qwerty_ko</item>
<item>qwerty_lv</item> <item>qwerty_lv</item>
<item>qwerty_no</item>
<item>qwerty_sv_se</item> <item>qwerty_sv_se</item>
<item>qwerty_hu</item>
<item>qwerty_tr</item>
<item>ru_jcuken</item> <item>ru_jcuken</item>
<item>qwertz</item> <item>qwertz</item>
<item>qwertz_cs</item>
<item>qwertz_de</item>
<item>qwertz_hu</item>
<item>bgph1</item> <item>bgph1</item>
<item>dvorak</item> <item>dvorak</item>
<item>colemak</item>
<item>neo2</item>
<item>bone</item>
<item>jcuken_ua</item>
<item>bangla</item>
<item>hindi</item>
</string-array> </string-array>
<string-array name="pref_layout_entries"> <string-array name="pref_layout_entries">
<item>@string/pref_layout_e_system</item> <item>@string/pref_layout_e_system</item>
@@ -33,57 +19,23 @@
<item>QWERTY</item> <item>QWERTY</item>
<item>QWERTY (Brasileiro)</item> <item>QWERTY (Brasileiro)</item>
<item>QWERTY (Español)</item> <item>QWERTY (Español)</item>
<item>QWERTY (Greek)</item>
<item>QWERTY (Korean)</item>
<item>QWERTY (Latvian)</item> <item>QWERTY (Latvian)</item>
<item>QWERTY (Norwegian)</item>
<item>QWERTY (Swedish)</item> <item>QWERTY (Swedish)</item>
<item>QWERTY (Hungarian)</item>
<item>QWERTY (Türkçe)</item>
<item>ЙЦУКЕН (Русский)</item> <item>ЙЦУКЕН (Русский)</item>
<item>QWERTZ</item> <item>QWERTZ</item>
<item>QWERTZ (Czech)</item>
<item>QWERTZ (Deutsch)</item>
<item>QWERTZ (Hungarian)</item>
<item>Bulgarian (Phonetic Traditional)</item> <item>Bulgarian (Phonetic Traditional)</item>
<item>Dvorak</item> <item>Dvorak</item>
<item>Colemak</item>
<item>Neo 2</item>
<item>Bone</item>
<item>ЙЦУКЕН (Українська)</item>
<item>বাংলা</item>
<item>हिन्दी</item>
</string-array>
<string-array name="pref_programming_layout_values">
<item>none</item>
<item>qwerty</item>
<item>dvorak</item>
<item>colemak</item>
</string-array>
<string-array name="pref_programming_layout_entries">
<item>@string/pref_programming_layout_none</item>
<item>QWERTY</item>
<item>Dvorak</item>
<item>Colemak</item>
</string-array> </string-array>
<string-array name="pref_accents_entries"> <string-array name="pref_accents_entries">
<item>@string/pref_accents_e_all_installed</item> <item>@string/pref_accents_e_all_installed</item>
<item>@string/pref_accents_e_selected</item> <item>@string/pref_accents_e_selected</item>
<item>@string/pref_accents_e_all</item>
<item>@string/pref_accents_e_none</item> <item>@string/pref_accents_e_none</item>
</string-array> </string-array>
<string-array name="pref_show_numpad_values">
<item>never</item>
<item>landscape</item>
<item>always</item>
</string-array>
<string-array name="pref_show_numpad_entries">
<item>@string/pref_show_numpad_never</item>
<item>@string/pref_show_numpad_landscape</item>
<item>@string/pref_show_numpad_always</item>
</string-array>
<string-array name="pref_accents_values"> <string-array name="pref_accents_values">
<item>1</item> <item>1</item>
<item>2</item> <item>2</item>
<item>3</item>
<item>4</item> <item>4</item>
</string-array> </string-array>
<string-array name="pref_theme_entries"> <string-array name="pref_theme_entries">
@@ -91,14 +43,12 @@
<item>@string/pref_theme_e_dark</item> <item>@string/pref_theme_e_dark</item>
<item>@string/pref_theme_e_light</item> <item>@string/pref_theme_e_light</item>
<item>@string/pref_theme_e_black</item> <item>@string/pref_theme_e_black</item>
<item>@string/pref_theme_e_white</item>
</string-array> </string-array>
<string-array name="pref_theme_values"> <string-array name="pref_theme_values">
<item>system</item> <item>system</item>
<item>dark</item> <item>dark</item>
<item>light</item> <item>light</item>
<item>black</item> <item>black</item>
<item>white</item>
</string-array> </string-array>
<string-array name="pref_swipe_dist_entries"> <string-array name="pref_swipe_dist_entries">
<item>@string/pref_swipe_dist_e_very_short</item> <item>@string/pref_swipe_dist_e_very_short</item>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ExtraKeyCheckBoxPreference">
<attr name="index" format="integer"/>
</declare-styleable>
</resources>

View File

@@ -9,31 +9,24 @@
<string name="pref_accents_title">Accents</string> <string name="pref_accents_title">Accents</string>
<string name="pref_accents_e_all_installed">Show accents for all installed languages</string> <string name="pref_accents_e_all_installed">Show accents for all installed languages</string>
<string name="pref_accents_e_selected">Only show accents for the selected language</string> <string name="pref_accents_e_selected">Only show accents for the selected language</string>
<string name="pref_accents_e_all">Show all accents</string>
<string name="pref_accents_e_none">Hide accents</string> <string name="pref_accents_e_none">Hide accents</string>
<string name="pref_show_numpad_title">Show NumPad</string>
<string name="pref_show_numpad_never">Never</string>
<string name="pref_show_numpad_landscape">Only in landscape mode</string>
<string name="pref_show_numpad_always">Always</string>
<string name="pref_autocapitalisation_title">Automatic capitalisation</string>
<string name="pref_autocapitalisation_summary">Press Shift at the beginning of a sentence</string>
<string name="pref_extra_keys_title">Add keys to the keyboard</string>
<string name="pref_programming_layout_title">Keyboard layout for programming</string>
<string name="pref_programming_layout_none">None</string>
<string name="pref_category_typing">Typing</string> <string name="pref_category_typing">Typing</string>
<string name="pref_swipe_dist_title">Swiping distance</string> <string name="pref_swipe_dist_title">Swiping distance</string>
<string name="pref_swipe_dist_summary">Distance of characters in the corners of the keys (%s)</string> <string name="pref_swipe_dist_summary">Distance of characters in the corners of the keys (%s)</string>
<string name="pref_long_timeout_title">Key repeat timeout</string> <string name="pref_long_timeout_title">Key repeat timeout</string>
<string name="pref_long_interval_title">Key repeat interval</string> <string name="pref_long_interval_title">Key repeat interval</string>
<string name="pref_category_vibrate">Vibration</string>
<string name="pref_vibrate_title">Vibration</string> <string name="pref_vibrate_title">Vibration</string>
<string name="pref_vibrate_summary">Enable/disable vibration on keypress</string> <string name="pref_vibrate_summary">Enable/disable vibration on keypress</string>
<string name="pref_vibrate_duration_title">Duration</string>
<string name="pref_precise_repeat_title">Precise cursor movements</string> <string name="pref_precise_repeat_title">Precise cursor movements</string>
<string name="pref_precise_repeat_summary">Modulate key repeat speed by swiping more or less</string> <string name="pref_precise_repeat_summary">Modulate key repeat speed by swiping more or less</string>
<string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string> <string name="pref_lockable_keys_title">Lockable modifiers</string>
<string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</string> <string name="pref_lockable_keys_summary">Modifier that can be locked by typing them twice</string>
<string name="pref_category_style">Style</string> <string name="pref_category_style">Style</string>
<string name="pref_margin_bottom_title">Margin bottom</string> <string name="pref_margin_bottom_title">Margin bottom</string>
<string name="pref_keyboard_height_title">Keyboard height</string> <string name="pref_keyboard_height_title">Keyboard height</string>
<string name="pref_keyboard_height_landscape_title">Keyboard height in landscape mode</string>
<string name="pref_horizontal_margin_title">Horizontal margin</string> <string name="pref_horizontal_margin_title">Horizontal margin</string>
<string name="pref_character_size_title">Label size</string> <string name="pref_character_size_title">Label size</string>
<string name="pref_character_size_summary">Size of characters displayed on the keyboard (%.2fx)</string> <string name="pref_character_size_summary">Size of characters displayed on the keyboard (%.2fx)</string>
@@ -42,7 +35,6 @@
<string name="pref_theme_e_dark">Dark</string> <string name="pref_theme_e_dark">Dark</string>
<string name="pref_theme_e_light">Light</string> <string name="pref_theme_e_light">Light</string>
<string name="pref_theme_e_black">Black</string> <string name="pref_theme_e_black">Black</string>
<string name="pref_theme_e_white">White</string>
<string name="pref_swipe_dist_e_very_short">Very short</string> <string name="pref_swipe_dist_e_very_short">Very short</string>
<string name="pref_swipe_dist_e_short">Short</string> <string name="pref_swipe_dist_e_short">Short</string>
<string name="pref_swipe_dist_e_default">Normal</string> <string name="pref_swipe_dist_e_default">Normal</string>

View File

@@ -20,20 +20,10 @@
<attr name="emoji_color" type="color" format="color"/> <attr name="emoji_color" type="color" format="color"/>
<attr name="emoji_key_bg" type="color" format="color"/> <attr name="emoji_key_bg" type="color" format="color"/>
<attr name="emoji_key_text" type="color" format="color"/> <attr name="emoji_key_text" type="color" format="color"/>
<!-- System integration -->
<attr name="navigationBarColor" format="color"/>
<attr name="windowLightNavigationBar" format="boolean"/>
</declare-styleable> </declare-styleable>
<style name="BaseTheme"> <style name="Dark">
<item name="android:forceDarkAllowed">false</item>
<item name="navigationBarColor">?attr/colorKeyboard</item>
<item name="windowLightNavigationBar">?attr/android:isLightTheme</item>
<item name="keyBorderRadius">5dp</item>
<item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item>
<item name="emoji_key_text" type="color">?attr/colorLabel</item>
</style>
<style name="Dark" parent="BaseTheme">
<item name="android:isLightTheme">false</item> <item name="android:isLightTheme">false</item>
<item name="android:forceDarkAllowed">false</item>
<item name="colorKeyboard">#1b1b1b</item> <item name="colorKeyboard">#1b1b1b</item>
<item name="colorKey">#333333</item> <item name="colorKey">#333333</item>
<item name="colorKeyActivated">#1b1b1b</item> <item name="colorKeyActivated">#1b1b1b</item>
@@ -41,11 +31,15 @@
<item name="colorLabelActivated">#3399ff</item> <item name="colorLabelActivated">#3399ff</item>
<item name="colorLabelLocked">#33cc33</item> <item name="colorLabelLocked">#33cc33</item>
<item name="colorSubLabel">#cccccc</item> <item name="colorSubLabel">#cccccc</item>
<item name="keyBorderRadius">5dp</item>
<item name="emoji_button_bg" type="color">#202020</item> <item name="emoji_button_bg" type="color">#202020</item>
<item name="emoji_color" type="color">#ffffff</item> <item name="emoji_color" type="color">#ffffff</item>
<item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item>
<item name="emoji_key_text" type="color">?attr/colorLabel</item>
</style> </style>
<style name="Light" parent="BaseTheme"> <style name="Light">
<item name="android:isLightTheme">true</item> <item name="android:isLightTheme">true</item>
<item name="android:forceDarkAllowed">false</item>
<item name="colorKeyboard">#e3e3e3</item> <item name="colorKeyboard">#e3e3e3</item>
<item name="colorKey">#cccccc</item> <item name="colorKey">#cccccc</item>
<item name="colorKeyActivated">#e3e3e3</item> <item name="colorKeyActivated">#e3e3e3</item>
@@ -53,11 +47,15 @@
<item name="colorLabelActivated">#0066cc</item> <item name="colorLabelActivated">#0066cc</item>
<item name="colorLabelLocked">#33cc33</item> <item name="colorLabelLocked">#33cc33</item>
<item name="colorSubLabel">#333333</item> <item name="colorSubLabel">#333333</item>
<item name="emoji_button_bg">#dedede</item> <item name="keyBorderRadius">5dp</item>
<item name="emoji_color">#000000</item> <item name="emoji_button_bg" type="color">#dedede</item>
<item name="emoji_color" type="color">#000000</item>
<item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item>
<item name="emoji_key_text" type="color">?attr/colorLabel</item>
</style> </style>
<style name="Black" parent="BaseTheme"> <style name="Black">
<item name="android:isLightTheme">false</item> <item name="android:isLightTheme">false</item>
<item name="android:forceDarkAllowed">false</item>
<item name="colorKeyboard">#000000</item> <item name="colorKeyboard">#000000</item>
<item name="colorKey">#000000</item> <item name="colorKey">#000000</item>
<item name="colorKeyActivated">#333333</item> <item name="colorKeyActivated">#333333</item>
@@ -66,19 +64,9 @@
<item name="colorLabelLocked">#00ff26</item> <item name="colorLabelLocked">#00ff26</item>
<item name="colorSubLabel">#bbbbbb</item> <item name="colorSubLabel">#bbbbbb</item>
<item name="keyBorderRadius">1dp</item> <item name="keyBorderRadius">1dp</item>
<item name="emoji_button_bg">#000000</item> <item name="emoji_button_bg" type="color">#000000</item>
<item name="emoji_color">#ffffff</item> <item name="emoji_color" type="color">#ffffff</item>
</style> <item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item>
<style name="White" parent="BaseTheme"> <item name="emoji_key_text" type="color">?attr/colorLabel</item>
<item name="android:isLightTheme">true</item>
<item name="colorKeyboard">#ffffff</item>
<item name="colorKey">#ffffff</item>
<item name="colorKeyActivated">#cccccc</item>
<item name="colorLabel">#000000</item>
<item name="colorLabelActivated">#0066cc</item>
<item name="colorLabelLocked">#33cc33</item>
<item name="colorSubLabel">#333333</item>
<item name="emoji_button_bg">#ffffff</item>
<item name="emoji_color">#000000</item>
</style> </style>
</resources> </resources>

View File

@@ -7,10 +7,13 @@
<dimen name="key_vertical_interval">2dp</dimen> <dimen name="key_vertical_interval">2dp</dimen>
<dimen name="key_horizontal_interval">2dp</dimen> <dimen name="key_horizontal_interval">2dp</dimen>
<dimen name="key_height">51dp</dimen> <dimen name="key_height">51dp</dimen>
<item name="label_text_size" type="integer" format="float">0.33</item>
<item name="sublabel_text_size" type="integer" format="float">0.22</item>
<dimen name="emoji_type_button_height">56dp</dimen> <dimen name="emoji_type_button_height">56dp</dimen>
<dimen name="emoji_grid_height">250dp</dimen> <dimen name="emoji_grid_height">250dp</dimen>
<dimen name="emoji_text_size">28dp</dimen> <dimen name="emoji_text_size">28dp</dimen>
<dimen name="extra_horizontal_margin">0dp</dimen> <dimen name="extra_horizontal_margin">0dp</dimen>
<bool name="debug_logs" product="debug">true</bool> <bool name="debug_logs" product="debug">true</bool>
<bool name="debug_logs" product="default">false</bool> <bool name="debug_logs" product="default">false</bool>
<dimen name="pointer_too_close">10dp</dimen>
</resources> </resources>

View File

@@ -1,37 +1,37 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard> <keyboard>
<row> <row>
<key key0="a" key2="1" key4="esc"/> <key key0="a" key1="esc" key2="1" key3="&amp;"/>
<key key0="z" key2="2" key3="&amp;" key4="~"/> <key key0="z" key2="2" key4="~"/>
<key key0="e" key2="3" key3="&quot;" key4="\#"/> <key key0="e" key2="3" key3="&quot;" key4="\#"/>
<key key0="r" key2="4" key3="'"/> <key key0="r" key2="4" key3="'"/>
<key key0="t" key2="5" key3="(" key4=")"/> <key key0="t" key2="5" key3="(" key4=")"/>
<key key0="y" key2="6" key3="-" key4="|"/> <key key0="y" key2="6" key3="-" key4="|"/>
<key key0="u" key2="7" key4="`"/> <key key0="u" key2="7" key4="`"/>
<key key0="i" key2="8" key3="_" key4="\\"/> <key key0="i" key2="8" key3="_" key4="\\"/>
<key key0="o" key2="9" key3="\@" key4="f11_placeholder"/> <key key0="o" key2="9"/>
<key key0="p" key2="0" key3="f12_placeholder"/> <key key0="p" key2="0" key4="\@"/>
</row> </row>
<row> <row>
<key key0="q" key2="tab"/> <key key0="q" key1="tab"/>
<key key0="s" key3="loc ß"/> <key key0="s" key1="accent_ring" key3="ß"/>
<key key0="d" key1="accent_grave" key3="accent_aigu"/> <key key0="d" key1="accent_grave" key3="accent_aigu"/>
<key key0="f" key3="{" key4="}"/> <key key0="f" key3="{" key4="}"/>
<key key0="g" key3="[" key4="]"/> <key key0="g" key3="[" key4="]"/>
<key key0="h" key3="=" key4="+"/> <key key0="h" key3="=" key4="+"/>
<key key0="j" key1="accent_trema" key2="accent_circonflexe" key3="^"/> <key key0="j" key1="accent_trema" key2="accent_circonflexe" key3="^"/>
<key key0="k" key2="€" key3="$"/> <key key0="k" key2="€" key3="$" key4="£"/>
<key key0="l" key2="%"/> <key key0="l" key2="%"/>
<key key0="m" key3="*"/> <key key0="m" key4="*"/>
</row> </row>
<row> <row>
<key width="2.0" key0="shift" key2="loc capslock"/> <key width="2.0" key0="shift"/>
<key key0="w" key3="&lt;" key4="&gt;"/> <key key0="w" key3="&lt;" key4="&gt;"/>
<key key0="x"/> <key key0="x"/>
<key key0="c" key1="accent_cedille" key3="," key4="\?"/> <key key0="c" key1="accent_cedille" key3="," key4="\?"/>
<key key0="v" key3=";" key4="."/> <key key0="v" key3=";" key4="."/>
<key key0="b" key3=":" key4="/"/> <key key0="b" key3=":" key4="/"/>
<key key0="n" key1="loc accent_tilde" key2="§" key4="!"/> <key key0="n" key1="accent_tilde" key2="§" key4="!"/>
<key width="2.0" key0="backspace" key2="delete"/> <key width="2.0" key0="backspace" key2="delete"/>
</row> </row>
</keyboard> </keyboard>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key key0="ঙ" key2="ং" key3="esc" key4="১"/>
<key key0="য" key2="য়" key3="¶" key4="২"/>
<key key0="ড" key2="ঢ" key3="π" key4="৩"/>
<key key0="প" key2="ফ" key3="√" key4=""/>
<key key0="ট" key2="ঠ" key3="^" key4="৫"/>
<key key0="চ" key2="ছ" key3="÷" key4="৬"/>
<key key0="জ" key2="ঝ" key3="×" key4=""/>
<key key0="হ" key2="ঞ" key3="=" key4="৮"/>
<key key0="গ" key2="ঘ" key3="+" key4="৯"/>
<key key0="ড়" key2="ঢ়" key3="-" key4=""/>
</row>
<row>
<key shift="0.5" key0="ৃ" key1="ৠ" key2="ঋ" key3="tab" key4="র্"/>
<key key0="ু" key1="ঊ" key2="উ" key3="~" key4="ূ"/>
<key key0="ি" key1="ঈ" key2="ই" key3="•" key4="ী"/>
<key key0="া" key1="ৄ" key2="আ" key3="°" key4="অ"/>
<key key0="্" key1="ৗ" key2="ঁ" key3="\\" key4="/"/>
<key key0="ব" key1="`" key2="ভ" key3="&lt;" key4="&gt;"/>
<key key0="ক" key1="|" key2="খ" key3="[" key4="]"/>
<key key0="ত" key1="ৎ" key2="থ" key3="{" key4="}"/>
<key key0="দ" key1="_" key2="ধ" key3="(" key4=")"/>
</row>
<row>
<key width="1.4" key0="shift" key2="loc capslock"/>
<key shift="0.1" key0="্র" key2="্য" key3="\#" key4="*"/>
<key key0="ো" key1="ৌ" key2="ও" key3="ঔ" key4="\@"/>
<key key0="ে" key1="ৈ" key2="এ" key3="ঐ" key4="%"/>
<key key0="র" key1="ঃ" key2="ল" key3=":" key4="&amp;"/>
<key key0="ন" key1="৳" key2="ণ" key3=";" key4="."/>
<key key0="স" key1="&quot;" key2="ষ" key3="!" key4=","/>
<key key0="ম" key1="'" key2="শ" key3="\?" key4="।"/>
<key shift="0.1" width="1.4" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard bottom_row="false">
<row>
<key key0="j" key2="esc" key4="…"/>
<key key0="d" key2="°" key4="_"/>
<key key0="u" key2="§" key4="["/>
<key key0="a" key4="]"/>
<key key0="x" key4="^"/>
<key key0="p" key3="!" key4="7"/>
<key key0="h" key3="&lt;" key4="8"/>
<key key0="l" key1="" key3="&gt;" key4="9"/>
<key key0="m" key1="≠" key3="=" key4="f11_placeholder"/>
<key key0="w" key3="&amp;" key4="f12_placeholder"/>
</row>
<row>
<key key0="c" key2="tab" key4="\\"/>
<key key0="t" key1="accent_circonflexe" key2="accent_caron" key4="/"/>
<key key0="i" key1="accent_aigu" key2="accent_grave" key4="{"/>
<key key0="e" key1="accent_cedille" key2="accent_ogonek" key4="}"/>
<key key0="o" key1="accent_ring" key2="accent_dot_above" key4="*"/>
<key key0="b" key2="accent_macron" key3="\?" key4="4"/>
<key key0="n" key2="accent_tilde" key3="(" key4="5"/>
<key key0="r" key2="accent_trema" key3=")" key4="6"/>
<key key0="s" key2="accent_slash" key3="-"/>
<key key0="g" key1="\@" key3=":"/>
</row>
<row>
<key width="1.5" key0="shift" key4="\#" key2="loc capslock"/>
<key key0="f" key4="|"/>
<key key0="v" key4="~"/>
<key key0="ß" key4="`"/>
<key key0="y" key3="%" key4="1"/>
<key key0="z" key1="&quot;" key3="+" key4="2"/>
<key key0="q" key1="&apos;" key3="," key4="3"/>
<key key0="k" key3="."/>
<key width="1.5" key0="backspace" key1="delete" key3=";"/>
</row>
<row height="0.95">
<key width="1.8" key0="ctrl" key2="loc meta" key4="switch_numeric"/>
<key width="1.2" key0="fn" key1="loc alt" key2="change_method" key3="switch_emoji" key4="config"/>
<key width="4.0" key0="space" key1="switch_programming" key2="0" edgekeys="true"/>
<key width="1.2" key1="up" key2="right" key3="left" key4="down" edgekeys="true"/>
<key width="1.8" key0="enter" key3="action"/>
</row>
</keyboard>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<row height="0.95"> <row height="0.95">
<key width="1.8" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/> <key width="1.8" key0="ctrl" key2="meta" key3="switch_numeric"/>
<key width="1.2" key0="fn" key1="loc alt" key2="change_method" key3="switch_emoji" key4="config"/> <key width="1.2" key0="alt" key1="fn" key2="change_method" key3="switch_emoji" key4="config"/>
<key width="4.0" key0="space" key1="switch_programming" edgekeys="true"/> <key width="4.0" key0="space"/>
<key width="1.2" key1="up" key2="right" key3="left" key4="down" edgekeys="true"/> <key width="1.2" key1="up" key2="right" key3="left" key4="down" edgekeys="true"/>
<key width="1.8" key0="enter" key2="action"/> <key width="1.8" key0="enter" key2="action"/>
</row> </row>

View File

@@ -1,40 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key key0="q" key1="esc" key2="loc accent_aigu" key3="loc accent_tilde" shift="0.5"/>
<key key0="w" key1="loc accent_grave" key2=" ́" key3="~" />
<key key0="f" key1="`" key2="-" key3="+" />
<key key0="p" key2="=" key3="%"/>
<key key0="g" key1="!" key2="/" key3="\\"/>
<key key0="j" key1="loc accent_caron" key2="loc accent_trema" />
<key key0="l" key1="f11_placeholder" key2="f12_placeholder"/>
<key key0="u" key1="loc accent_double_aigu" key2="loc accent_ring" />
<key key0="y" key1="&quot;" key2="'"/>
</row>
<row>
<key key0="a" key2="1" key4="tab"/>
<key key0="r" key1="\@" key2="2" />
<key key0="s" key1="\#" key2="3" key4="loc ß"/>
<key key0="t" key1="$" key2="4" key4="loc accent_ogonek" />
<key key0="d" key1="€" key2="5" key4="loc accent_dot_above"/>
<key key0="h" key1="&amp;" key2="6" />
<key key0="n" key1="*" key2="7" />
<key key0="e" key1="loc accent_circonflexe" key2="8" key4="^"/>
<key key0="i" key1="_" key2="9" />
<key key0="o" key1="0" key3="loc accent_macron"/>
</row>
<row>
<key key0="shift" key2="loc capslock" width="1.5" />
<key key0="z" key1="," key2="."/>
<key key0="x" key1="&gt;" key2="&lt;"/>
<key key0="c" key1="{" key2="}" key3="loc accent_cedille"/>
<key key0="v" key1="[" key2="]"/>
<key key0="b" key1="(" key2=")"/>
<key key0="k" key1=";" key2=":"/>
<key key0="m" key1="|" key2="\?" />
<key key0="backspace" key1="delete" shift="0.25" width="1.25"/>
</row>
</keyboard>

View File

@@ -1,33 +1,33 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard> <keyboard>
<row> <row>
<key key0="shift" width="1.5" key2="esc" key4="tab"/> <key key0="shift" width="1.5" key1="esc" key2="tab"/>
<key key0="p" key1="loc accent_ring" key2="." key3="&lt;" key4="f11_placeholder"/> <key key0="p" key1="accent_ring" key2="." key3="&lt;"/>
<key key0="y" key1="loc accent_grave" key2="," key3="&gt;" key4="f12_placeholder"/> <key key0="y" key1="accent_grave" key2="," key3="&gt;"/>
<key key0="f" key4="loc €"/> <key key0="f" key4="€"/>
<key key0="g" key2="\\" key3="|"/> <key key0="g" key2="\\" key3="|"/>
<key key0="c" key1="loc accent_trema" key2="loc accent_circonflexe" key3="{" key4="}"/> <key key0="c" key1="accent_trema" key2="accent_circonflexe" key3="{" key4="}"/>
<key key0="r" key3="[" key4="]"/> <key key0="r" key3="[" key4="]"/>
<key key0="l" key2="=" key3="+" key4="loc £"/> <key key0="l" key2="=" key3="+" key4="£"/>
<key key0="backspace" key2="delete" width="1.5"/> <key key0="backspace" key2="delete" width="1.5"/>
</row> </row>
<row> <row>
<key key0="a" key2="1" key4="!"/> <key key0="a" key2="1" key3="!"/>
<key key0="o" key1="loc accent_macron" key2="2" key3="\@" key4="loc accent_ogonek"/> <key key0="o" key1="accent_macron" key2="2" key3="\@"/>
<key key0="e" key1="loc accent_caron" key2="3" key3="\#" key4="loc accent_dot_above"/> <key key0="e" key1="accent_caron" key2="3" key3="\#"/>
<key key0="u" key2="4" key3="$" key4="loc accent_double_aigu"/> <key key0="u" key2="4" key3="$"/>
<key key0="i" key2="5" key3="%"/> <key key0="i" key2="5" key3="%"/>
<key key0="d" key2="6" key3="^"/> <key key0="d" key2="6" key3="^"/>
<key key0="h" key2="7" key3="&amp;"/> <key key0="h" key2="7" key3="&amp;"/>
<key key0="t" key2="8" key3="*"/> <key key0="t" key2="8" key3="*"/>
<key key0="n" key2="9" key3="(" key4=")"/> <key key0="n" key2="9" key3="(" key4=")"/>
<key key0="s" key2="0" key3="loc ß"/> <key key0="s" key2="0" key3="ß"/>
</row> </row>
<row> <row>
<key key0="q" shift="0.5" key1="loc accent_tilde" key2="`" key3="~"/> <key key0="q" shift="0.5" key1="accent_tilde" key2="`" key3="~"/>
<key key0="j" key1="loc accent_aigu" key2="'" key3="&quot;"/> <key key0="j" key1="accent_aigu" key2="'" key3="&quot;"/>
<key key0="k" key2=";" key3=":"/> <key key0="k" key2=";" key3=":"/>
<key key0="x" key1="loc accent_cedille"/> <key key0="x" key1="accent_cedille"/>
<key key0="b"/> <key key0="b"/>
<key key0="m" key2="/" key3="\?"/> <key key0="m" key2="/" key3="\?"/>
<key key0="w"/> <key key0="w"/>

View File

@@ -1,47 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard bottom_row="false" extra_keys="false">
<row>
<key key0="θ" key2="^"/>
<key key0="δ" key1="⌊" key2="" key3="↔" key4="⊂"/>
<key key0="ϛ" key1="⌋" key2="∧" key3="↑" key4="⊃"/>
<key key0="α" key1="⌈" key2="⊥" key3="↕" key4="∀"/>
<key key0="ξ" key1="⌉" key2="∡" key4="⊷"/>
<key key0="π" key1="∥" key3="≪" key4="7"/>
<key key0="ψ" key1="⌀" key2="⟨" key3="≡" key4="8"/>
<key key0="λ" key1="∞" key2="⟩" key3="≫" key4="9"/>
<key key0="μ" key1="∝" key3="□" key4="f11_placeholder"/>
<key key0="ω" key1="∅" key3="∘" key4="f12_placeholder"/>
</row>
<row>
<key key0="χ" key4=""/>
<key key0="τ" key3="←" key4="∂"/>
<key key0="ι" key3="↓" key4="∫"/>
<key key0="ε" key3="→" key4="∃"/>
<key key0="ο" key4="∈"/>
<key key0="β" key1="⊕" key4="4"/>
<key key0="ν" key1="⊖" key3="" key4="5"/>
<key key0="ρ" key1="⊙" key3="" key4="6"/>
<key key0="σ" key1="⊗"/>
<key key0="γ" key1="⌀"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key key0="φ" key3="⇌" key4="√"/>
<key key0="η" key3="accent_arrow_right" key4=""/>
<key key0="ϡ" key4="∩"/>
<key key0="υ" key3="∇" key4="ℵ"/>
<key key0="ζ" key1="≤" key3="" key4="1"/>
<key key0="Ϟ" key1="≠" key3="" key4="2"/>
<key key0="κ" key1="≥" key3="×" key4="3"/>
<key width="1.5" key0="backspace" key3="delete"/>
</row>
<row height="0.95">
<key width="1.2" key0="switch_text" key2="esc"/>
<key width="1.2" key0="switch_numeric" key2="tab"/>
<key width="1.2" key0="fn"/>
<key width="2.8" key0="space" key1="superscript" key3="subscript"/>
<key width="1.2" key0="0" key2="."/>
<key width="1.2" key1="up" key2="right" key3="left" key4="down" edgekeys="true"/>
<key width="1.2" key0="enter" key1="=" key2="action"/>
</row>
</keyboard>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key key0="ौ" key1="औ" key2="₹" key3="esc" key4="१"/>
<key key0="ै" key1="ऐ" key2="ऍ" key3="¶" key4="२"/>
<key key0="ा" key1="आ" key2="ॅ" key3="ग़" key4="३"/>
<key key0="ी" key1="ई" key2="ज्ञ" key3="ज़" key4="४"/>
<key key0="ू" key1="ऊ" key2="त्र" key3="ऩ" key4="५"/>
<key key0="ब" key1="भ" key2="क्ष" key3="÷" key4="६"/>
<key key0="ह" key1="ङ" key2="श्र" key3="×" key4="७"/>
<key key0="ग" key1="घ" key2="" key3="=" key4="८"/>
<key key0="द" key1="ध" key2="ऋ" key3="+" key4="९"/>
<key key0="ज" key1="झ" key2="ृ" key3="-" key4=""/>
</row>
<row>
<key shift="0.5" key0="ो" key1="ओ" key2="ॉ" key3="tab" key4="ऑ"/>
<key key0="े" key1="ए" key2="ञ" key3="~" key4="॰"/>
<key key0="्" key1="अ" key2="़" key3="ऽ" key4="ऺ"/>
<key key0="ि" key1="इ" key2="ढ" key3="॥" key4="ॄ"/>
<key key0="ु" key1="उ" key2="ड" key3="\\" key4="/"/>
<key key0="प" key1="फ" key2="छ" key3="&lt;" key4="&gt;"/>
<key key0="र" key1="ऱ" key2="च" key3="[" key4="]"/>
<key key0="क" key1="ख" key2="क़" key3="{" key4="}"/>
<key key0="त" key1="थ" key2="ख़" key3="(" key4=")"/>
</row>
<row>
<key width="1.4" key0="shift" key2="loc capslock"/>
<key shift="0.1" key0="ट" key1="ठ" key2="ड़" key3="\#" key4="*"/>
<key key0="ं" key1="ँ" key2="।" key3="ॐ" key4="\@"/>
<key key0="म" key1="ण" key2="य" key3="य़" key4="%"/>
<key key0="न" key1="" key2="।" key3=":" key4="&amp;"/>
<key key0="व" key1="" key2="ढ़" key3=";" key4="."/>
<key key0="ल" key1="ळ" key2="फ़" key3="!" key4=","/>
<key key0="स" key1="श" key2="ष" key3="\?" key4="।"/>
<key shift="0.1" width="1.4" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -1,42 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key shift="0.1 " key0="й" key2="1" key4="esc"/>
<key key0="ц" key1="~" key2="2" key3="\@"/>
<key key0="у" key1="!" key2="3" key3="\#" key4="loc €"/>
<key key0="к" key2="4" key3="$"/>
<key key0="е" key2="5" key3="%"/>
<key key0="н" key2="6" key3="^"/>
<key key0="г" key1="ґ" key2="7" key3="&amp;"/>
<key key0="ш" key2="8" key3="*"/>
<key key0="щ" key2="9" key3="(" key4=")"/>
<key key0="з" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
<key key0="х"/>
</row>
<row>
<key shift="0.1" key0="ф" key1="tab" key2="`"/>
<key key0="і" key2="ї"/>
<key key0="в" />
<key key0="а" />
<key key0="п" />
<key key0="р" />
<key key0="о" key2="-" key3="_"/>
<key key0="л" key2="=" key3="+"/>
<key key0="д" key4="}" key3="{"/>
<key key0="ж" key3="[" key4="]"/>
<key key0="є" key2="|" key3="\\"/>
</row>
<row>
<key width="1.1" key0="shift" key2="loc capslock"/>
<key key0="я"/>
<key key0="ч" />
<key key0="с" />
<key key0="м" key2="&lt;" key3="."/>
<key key0="и" key2="&gt;" key3=","/>
<key key0="т" key2="\?" key3="/"/>
<key key0="ь" key2=":" key3=";"/>
<key key0="б" key2="&quot;" key3="'"/>
<key key0="ю" key1="«" key2="»"/>
<key width="1.1" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -1,36 +1,36 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard> <keyboard>
<row> <row>
<key key0="я" key2="1" key4="esc"/> <key key0="я" key1="esc" key2="1" key3="ч" key4="!"/>
<key key0="в" key1="!" key2="2" key3="\@" key4="ч"/> <key key0="в" key2="2" key3="\@"/>
<key key0="е" key2="3" key3="\#" key4="№"/> <key key0="е" key2="3" key3="\#" key4="№"/>
<key key0="р" key2="4" key3="$"/> <key key0="р" key2="4" key3="$"/>
<key key0="т" key2="5" key3="%"/> <key key0="т" key2="5" key3="%"/>
<key key0="ъ" key2="6" key3="^" key4="€"/> <key key0="ъ" key2="6" key3="^" key4="€"/>
<key key0="у" key2="7" key3="&amp;" key4="§"/> <key key0="у" key2="7" key3="&amp;" key4="§"/>
<key key0="и" key2="8" key3="*"/> <key key0="и" key2="8" key3="*"/>
<key key0="о" key2="9" key3="(" key4=")"/> <key key0="о" key1="accent_macron" key2="9" key3="(" key4=")"/>
<key key0="п" key2="0" key3="f11_placeholder" key4="f12_placeholder"/> <key key0="п" key2="0" key3="ш" key4="/>
</row> </row>
<row> <row>
<key shift="0.5" key0="а" key1="tab" key2="`"/> <key shift="0.5" key0="а" key1="tab" key2="`"/>
<key key0="с"/> <key key0="с" key2="£"/>
<key key0="д"/> <key key0="д" key1="accent_grave" key3="accent_aigu"/>
<key key0="ф"/> <key key0="ф"/>
<key key0="г" key2="-" key3="_"/> <key key0="г" key1="accent_caron" key2="-" key3="_"/>
<key key0="х" key2="=" key3="+"/> <key key0="х" key2="=" key3="+"/>
<key key0="й" key4="}" key3="{"/> <key key0="й" key1="accent_trema" key2="accent_circonflexe" key4="}" key3="{"/>
<key key0="к" key2="ш" key3="[" key4="]"/> <key key0="к" key3="[" key4="]"/>
<key key0="л" key1="щ" key2="|" key3="\\" key4="ю"/> <key key0="л" key2="|" key3="\\" key4="ю"/>
</row> </row>
<row> <row>
<key width="1.5" key0="shift" key2="loc capslock"/> <key width="1.5" key0="shift"/>
<key key0="з"/> <key key0="з"/>
<key key0="ь" key3="ѝ"/> <key key0="ь" key1="accent_ring" key3="ѝ"/>
<key key0="ц" key2="&lt;" key3="."/> <key key0="ц" key1="accent_cedille" key2="&lt;" key3="."/>
<key key0="ж" key2="&gt;" key3=","/> <key key0="ж" key2="&gt;" key3=","/>
<key key0="б" key2="\?" key3="/"/> <key key0="б" key2="\?" key3="/"/>
<key key0="н" key2=":" key3=";"/> <key key0="н" key1="accent_tilde" key2=":" key3=";"/>
<key key0="м" key2="&quot;" key3="'"/> <key key0="м" key2="&quot;" key3="'"/>
<key width="1.5" key0="backspace" key2="delete"/> <key width="1.5" key0="backspace" key2="delete"/>
</row> </row>

View File

@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard> <keyboard>
<row> <row>
<key key0="й" key2="1" key4="esc"/> <key key0="й" key1="esc" key2="1" key3="~" key4="!"/>
<key key0="ц" key2="2" key3="\@" key4="~"/> <key key0="ц" key2="2" key3="\@"/>
<key key0="у" key2="3" key3="\#" key4="!"/> <key key0="у" key2="3" key3="\#"/>
<key key0="к" key2="4" key3="$"/> <key key0="к" key2="4" key3="$"/>
<key key0="е" key1="ё" key2="5" key3="%"/> <key key0="е" key1="ё" key2="5" key3="%"/>
<key key0="н" key2="6" key3="^"/> <key key0="н" key2="6" key3="^"/>
<key key0="г" key2="7" key3="&amp;"/> <key key0="г" key2="7" key3="&amp;"/>
<key key0="ш" key2="8" key3="*"/> <key key0="ш" key2="8" key3="*"/>
<key key0="щ" key2="9" key3="(" key4=")"/> <key key0="щ" key2="9" key3="(" key4=")"/>
<key key0="з" key2="0" key3="{" key4="}" /> <key key0="з" key2="0"/>
<key key0="х" key3="[" key4="]" key1="f11_placeholder" key2="f12_placeholder"/> <key key0="х" key1="{" key2="}"/>
<key key0="ъ" key1="[" key2="]" />
</row> </row>
<row> <row>
<key key0="ф" key1="tab" key2="`"/> <key shift="0.5" key0="ф" key1="tab" key2="`"/>
<key key0="ы"/> <key key0="ы"/>
<key key0="в"/> <key key0="в"/>
<key key0="а"/> <key key0="а"/>
@@ -28,16 +28,16 @@
<key key0="э" key2="|" key3="\\"/> <key key0="э" key2="|" key3="\\"/>
</row> </row>
<row> <row>
<key width="1.18" key0="shift" key2="loc capslock"/> <key width="1.5" key0="shift"/>
<key width="0.96" key0="я"/> <key key0="я"/>
<key width="0.96" key0="ч"/> <key key0="ч"/>
<key width="0.96" key0="с"/> <key key0="с"/>
<key width="0.96" key0="м"/> <key key0="м"/>
<key width="0.96" key0="и" key2="&lt;" key3="."/> <key key0="и" key2="&lt;" key3="."/>
<key width="0.96" key0="т" key2="&gt;" key3=","/> <key key0="т" key2="&gt;" key3=","/>
<key width="0.96" key0="ь" key1=" key2="\?" key3="/"/> <key key0=" key2="\?" key3="/"/>
<key width="0.96" key0="б" key2=":" key3=";"/> <key key0="б" key2=":" key3=";"/>
<key width="0.96" key0="ю" key2="&quot;" key3="'"/> <key key0="ю" key2="&quot;" key3="'"/>
<key width="1.18" key0="backspace" key2="delete"/> <key width="1.5" key0="backspace" key2="delete"/>
</row> </row>
</keyboard> </keyboard>

View File

@@ -1,26 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="juloo.keyboard2.SettingsActivity" android:supportsSwitchingToNextInputMethod="true"> <input-method xmlns:android="http://schemas.android.com/apk/res/android" android:settingsActivity="juloo.keyboard2.SettingsActivity" android:supportsSwitchingToNextInputMethod="true">
<subtype android:label="%s" android:languageTag="bg" android:imeSubtypeLocale="bg_BG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=bgph1,extra_keys=€"/> <subtype android:label="%s" android:languageTag="bg" android:imeSubtypeLocale="bg_BG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=bgph1,extra_keys=€"/>
<subtype android:label="%s" android:languageTag="bn" android:imeSubtypeLocale="bn_BD" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty,extra_keys="/> <subtype android:label="%s" android:languageTag="de" android:imeSubtypeLocale="de_DE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwertz,extra_keys=accent_trema|ß|€"/>
<subtype android:label="%s" android:languageTag="hi" android:imeSubtypeLocale="hi_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=hindi,extra_keys=₹"/>
<subtype android:label="%s" android:languageTag="de" android:imeSubtypeLocale="de_DE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwertz_de,extra_keys=accent_trema|ß|€"/>
<subtype android:label="%s" android:languageTag="en-GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty,extra_keys=£|€"/> <subtype android:label="%s" android:languageTag="en-GB" android:imeSubtypeLocale="en_GB" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty,extra_keys=£|€"/>
<subtype android:label="%s" android:languageTag="en-US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty"/> <subtype android:label="%s" android:languageTag="en-US" android:imeSubtypeLocale="en_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty"/>
<subtype android:label="%s" android:languageTag="es" android:imeSubtypeLocale="es_ES" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_es,extra_keys=accent_grave|accent_aigu|accent_tilde|accent_trema|€"/> <subtype android:label="%s" android:languageTag="es" android:imeSubtypeLocale="es_ES" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_es,extra_keys=accent_grave|accent_aigu|accent_tilde|accent_trema|€"/>
<subtype android:label="%s" android:languageTag="fr" android:imeSubtypeLocale="fr_FR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=azerty,extra_keys=accent_grave|accent_aigu|accent_circonflexe|accent_cedille|accent_trema|€"/> <subtype android:label="%s" android:languageTag="fr" android:imeSubtypeLocale="fr_FR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=azerty,extra_keys=accent_grave|accent_aigu|accent_circonflexe|accent_cedille|accent_trema|€"/>
<subtype android:label="%s" android:languageTag="hu" android:imeSubtypeLocale="hu_HU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwertz_hu,extra_keys=accent_aigu|accent_trema|accent_ogonek|€"/>
<subtype android:label="%s" android:languageTag="it" android:imeSubtypeLocale="it_IT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty,extra_keys=accent_grave|accent_aigu|€"/> <subtype android:label="%s" android:languageTag="it" android:imeSubtypeLocale="it_IT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty,extra_keys=accent_grave|accent_aigu|€"/>
<subtype android:label="%s" android:languageTag="ko" android:imeSubtypeLocale="ko_KR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_ko"/>
<subtype android:label="%s" android:languageTag="lt" android:imeSubtypeLocale="lt_LT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty,extra_keys=accent_ogonek|accent_caron|accent_dot_above|accent_macron|€"/>
<subtype android:label="%s" android:languageTag="lv" android:imeSubtypeLocale="lv_LV" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_lv,extra_keys=accent_caron|accent_cedille|accent_macron|€"/> <subtype android:label="%s" android:languageTag="lv" android:imeSubtypeLocale="lv_LV" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_lv,extra_keys=accent_caron|accent_cedille|accent_macron|€"/>
<subtype android:label="%s" android:languageTag="nl-BE" android:imeSubtypeLocale="nl_BE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=azerty,extra_keys=accent_grave|accent_aigu|accent_circonflexe|accent_cedille|accent_trema|€"/>
<subtype android:label="%s" android:languageTag="no" android:imeSubtypeLocale="no_NO" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_no,extra_keys=accent_aigu|€"/>
<subtype android:label="%s" android:languageTag="pl" android:imeSubtypeLocale="pl_PL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty,extra_keys=accent_aigu|accent_ogonek|accent_dot_above|ł"/>
<subtype android:label="%s" android:languageTag="pt" android:imeSubtypeLocale="pt_BR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_pt,extra_keys=accent_aigu|accent_cedille|accent_circonflexe|accent_grave|accent_tilde|€"/> <subtype android:label="%s" android:languageTag="pt" android:imeSubtypeLocale="pt_BR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_pt,extra_keys=accent_aigu|accent_cedille|accent_circonflexe|accent_grave|accent_tilde|€"/>
<subtype android:label="%s" android:languageTag="ru" android:imeSubtypeLocale="ru_RU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=ru_jcuken"/> <subtype android:label="%s" android:languageTag="ru" android:imeSubtypeLocale="ru_RU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=ru_jcuken"/>
<subtype android:label="%s" android:languageTag="sv" android:imeSubtypeLocale="sv_SE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_sv_se,extra_keys=accent_aigu|accent_trema|accent_ring|€"/> <subtype android:label="%s" android:languageTag="sv" android:imeSubtypeLocale="sv_SE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_sv_se,extra_keys=accent_aigu|accent_trema|accent_ring|€"/>
<subtype android:label="%s" android:languageTag="tr" android:imeSubtypeLocale="tr_TR" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_tr,extra_keys=accent_cedille|accent_trema|₺|ı|ğ"/>
<subtype android:label="%s" android:languageTag="uk" android:imeSubtypeLocale="uk_UA" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=jcuken_ua"/>
<subtype android:label="%s" android:languageTag="cs" android:imeSubtypeLocale="cs_CZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwertz_cs,extra_keys=a|accent_cedille|accent_circonflexe"/>
<subtype android:label="%s" android:languageTag="el" android:imeSubtypeLocale="el" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty_el,extra_keys=£|€"/>
</input-method> </input-method>

View File

@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard bottom_row="false">
<row>
<key key0="x" key1="°" key2="1" key4="…"/>
<key key0="v" key1="§" key2="2" key4="_"/>
<key key0="l" key2="3" key4="["/>
<key key0="c" key2="4" key4="]"/>
<key key0="w" key2="5" key4="^"/>
<key key0="k" key2="6" key4="!"/>
<key key0="h" key2="7" key4="&lt;"/>
<key key0="g" key2="8" key4="&gt;"/>
<key key0="f" key2="9" key3="f11_placeholder" key4="="/>
<key key0="q" key2="0" key3="f12_placeholder" key4="&amp;"/>
<key key0="ß" key1="-"/>
</row>
<row>
<key key0="u" key1="tab" key4="\\"/>
<key key0="i" key4="/"/>
<key key0="a" key4="{"/>
<key key0="e" key4="}"/>
<key key0="o" key4="*"/>
<key key0="s" key4="\?"/>
<key key0="n" key4="("/>
<key key0="r" key4=")"/>
<key key0="t" key4="-"/>
<key key0="d" key4=":"/>
<key key0="y" key3="\@"/>
</row>
<row>
<key width="1.5" key0="shift" key1="esc" key2="loc capslock"/>
<key key0="ü" key4="\#"/>
<key key0="ö" key4="$"/>
<key key0="ä" key4="|"/>
<key key0="p" key4="~"/>
<key key0="z" key4="`"/>
<key key0="b" key4="+"/>
<key key0="m" key4="%"/>
<key key0="." key1="," key3="&quot;" key4="'"/>
<key width="1.5" key0="backspace" key2="delete"/>
</row>
<row height="0.95">
<key width="1.8" key0="ctrl" key2="loc meta" key4="switch_numeric"/>
<key width="1.2" key0="fn" key1="loc alt" key2="change_method" key3="switch_emoji" key4="config"/>
<key width="4.0" key0="space" key1="switch_programming" edgekeys="true"/>
<key width="1.2" key1="up" key2="right" key3="left" key4="down" edgekeys="true"/>
<key key0="j" key4=";"/>
<key width="1.8" key0="enter" key2="action"/>
</row>
</keyboard>

View File

@@ -1,35 +1,34 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard bottom_row="false" extra_keys="false" num_pad="false"> <keyboard bottom_row="false">
<row> <row>
<key width="0.75" key0="esc" key2="~" key4="!"/> <key width="0.75" key0="esc" key2="~" key4="!"/>
<key width="0.75" key0="(" key2="[" key4="{"/> <key width="0.75" key0="(" key2="[" key4="{"/>
<key key0="7" key1="&lt;" key2="&gt;"/> <key key0="7" key3="&lt;" key4="&gt;"/>
<key key0="8" key2="∞"/> <key key0="8" key2="∞"/>
<key key0="9" key2="π"/> <key key0="9" key2="π"/>
<key width="0.75" key0="*" key1="√" key2="×" key3="\#"/> <key width="0.75" key0="*" key1="√" key2="×"/>
<key width="0.75" key0="/" key1="%" key3="÷"/> <key width="0.75" key0="/" key1="%" key3="÷"/>
</row> </row>
<row> <row>
<key width="0.75" key0="tab" key2="|" key4="\\"/> <key width="0.75" key0="tab" key1=";" key2="|" key4="\\"/>
<key width="0.75" key0=")" key2="]" key4="}"/> <key width="0.75" key0=")" key2="]" key4="}"/>
<key key0="4" key1="box" key3="arrows"/> <key key0="4"/>
<key key0="5" key1="up" key2="right" key3="left" key4="down" edgekeys="true"/> <key key0="5" key1="up" key2="right" key3="left" key4="down" edgekeys="true"/>
<key key0="6"/> <key key0="6"/>
<key width="0.75" key0="+" key1="Σ" key2="$"/> <key width="0.75" key0="+" key1="Σ" key2="$"/>
<key width="0.75" key0="-" key1="^"/> <key width="0.75" key0="-" key2="^"/>
</row> </row>
<row> <row>
<key width="0.75" key0="switch_greekmath"/> <key shift="0.35" width="1.15" key0="shift" key2="fn" key4="alt"/>
<key width="0.75" key0="shift" key2="fn" key4="loc alt"/>
<key key0="1" key1="superscript" key2="ordinal" key3="subscript"/> <key key0="1" key1="superscript" key2="ordinal" key3="subscript"/>
<key key0="2"/> <key key0="2"/>
<key key0="3"/> <key key0="3"/>
<key width="1.5" key0="backspace" key2="delete"/> <key width="1.15" key0="backspace" key2="delete"/>
</row> </row>
<row height="0.95"> <row height="0.95">
<key width="1.5" key0="switch_text" key2="ctrl"/> <key width="1.5" key0="ctrl" key3="switch_text"/>
<key width="1.5" key0="0" key3="f11_placeholder" key4="f12_placeholder"/> <key width="1.5" key0="0"/>
<key width="0.75" key0="." key1=":" key2="," key3=";"/> <key width="0.75" key0="." key1=":" key2=","/>
<key width="0.75" key0="space" key1="&quot;" key2="'" key4="_"/> <key width="0.75" key0="space" key1="&quot;" key2="'" key4="_"/>
<key width="1.5" key0="enter" key1="±" key2="action" key3="="/> <key width="1.5" key0="enter" key1="±" key2="action" key3="="/>
</row> </row>

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard bottom_row="false">
<row>
<key key0="7"/>
<key key0="8"/>
<key key0="9"/>
<key key0="/"/>
</row>
<row>
<key key0="4"/>
<key key0="5"/>
<key key0="6"/>
<key key0="*"/>
</row>
<row>
<key key0="1"/>
<key key0="2"/>
<key key0="3"/>
<key key0="-"/>
</row>
<row height="0.95">
<key key0="0"/>
<key key0="."/>
<key key0="="/>
<key key0="+"/>
</row>
</keyboard>

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard width="6.0" bottom_row="false" extra_keys="false" num_pad="false">
<row>
<key shift="1.0" key0="1"/>
<key key0="2" indication="ABC"/>
<key key0="3" indication="DEF"/>
<key key0="backspace" key2="delete"/>
</row>
<row>
<key shift="1.0" key0="4" indication="GHI"/>
<key key0="5" indication="JKL"/>
<key key0="6" indication="MNO"/>
<key key0="(" key3=":" key4="-"/>
</row>
<row>
<key shift="1.0" key0="7" indication="PQRS"/>
<key key0="8" indication="TUV"/>
<key key0="9" indication="WXYZ"/>
<key key0=")" key2="," key3="/" key4="."/>
</row>
<row>
<key shift="1.0" key0="*" key1="switch_text" key3="switch_numeric"/>
<key key0="0" key3="+" key4="space"/>
<key key0="\#" key1="up" key2="right" key3="left" key4="down" edgekeys="true"/>
<key key0="enter" key2="action"/>
</row>
</keyboard>

View File

@@ -1,36 +1,36 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard> <keyboard>
<row> <row>
<key key0="q" key2="1" key4="esc"/> <key key0="q" key1="esc" key2="1" key3="~" key4="!"/>
<key key0="w" key1="~" key2="2" key3="\@"/> <key key0="w" key2="2" key3="\@"/>
<key key0="e" key1="!" key2="3" key3="\#" key4="loc €"/> <key key0="e" key2="3" key3="\#" key4="€"/>
<key key0="r" key2="4" key3="$"/> <key key0="r" key2="4" key3="$"/>
<key key0="t" key2="5" key3="%"/> <key key0="t" key2="5" key3="%"/>
<key key0="y" key2="6" key3="^"/> <key key0="y" key2="6" key3="^"/>
<key key0="u" key2="7" key3="&amp;"/> <key key0="u" key2="7" key3="&amp;"/>
<key key0="i" key2="8" key3="*"/> <key key0="i" key2="8" key3="*"/>
<key key0="o" key1="loc accent_macron" key2="9" key3="(" key4=")"/> <key key0="o" key1="accent_macron" key2="9" key3="(" key4=")"/>
<key key0="p" key2="0" key3="f11_placeholder" key4="f12_placeholder"/> <key key0="p" key2="0"/>
</row> </row>
<row> <row>
<key shift="0.5" key0="a" key1="tab" key2="`"/> <key shift="0.5" key0="a" key1="tab" key2="`"/>
<key key0="s" key1="loc accent_ring" key3="loc ß" key4="loc accent_ogonek"/> <key key0="s" key1="accent_ring" key3="ß"/>
<key key0="d" key1="loc accent_grave" key2="loc £" key3="loc accent_aigu"/> <key key0="d" key1="accent_grave" key2="£" key3="accent_aigu"/>
<key key0="f" key1="loc accent_dot_above"/> <key key0="f"/>
<key key0="g" key1="loc accent_caron" key2="-" key3="_"/> <key key0="g" key1="accent_caron" key2="-" key3="_"/>
<key key0="h" key2="=" key3="+"/> <key key0="h" key2="=" key3="+"/>
<key key0="j" key1="loc accent_trema" key2="loc accent_circonflexe" key4="}" key3="{"/> <key key0="j" key1="accent_trema" key2="accent_circonflexe" key4="}" key3="{"/>
<key key0="k" key1="loc accent_double_aigu" key3="[" key4="]"/> <key key0="k" key3="[" key4="]"/>
<key key0="l" key2="|" key3="\\"/> <key key0="l" key2="|" key3="\\"/>
</row> </row>
<row> <row>
<key width="1.5" key0="shift" key2="loc capslock"/> <key width="1.5" key0="shift"/>
<key key0="z"/> <key key0="z"/>
<key key0="x"/> <key key0="x"/>
<key key0="c" key1="loc accent_cedille" key2="&lt;" key3="."/> <key key0="c" key1="accent_cedille" key2="&lt;" key3="."/>
<key key0="v" key2="&gt;" key3=","/> <key key0="v" key2="&gt;" key3=","/>
<key key0="b" key2="\?" key3="/"/> <key key0="b" key2="\?" key3="/"/>
<key key0="n" key1="loc accent_tilde" key2=":" key3=";"/> <key key0="n" key1="accent_tilde" key2=":" key3=";"/>
<key key0="m" key2="&quot;" key3="'"/> <key key0="m" key2="&quot;" key3="'"/>
<key width="1.5" key0="backspace" key2="delete"/> <key width="1.5" key0="backspace" key2="delete"/>
</row> </row>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key key0=";" key2="1" key4="esc"/>
<key key0="ς" key1="~" key2="2" key3="\@"/>
<key key0="ε" key1="!" key2="3" key3="\#" key4="loc €"/>
<key key0="ρ" key2="4" key3="$"/>
<key key0="τ" key2="5" key3="%"/>
<key key0="υ" key2="6" key3="^"/>
<key key0="θ" key2="7" key3="&amp;"/>
<key key0="ι" key1="accent_trema" key2="8" key3="*"/>
<key key0="ο" key2="9" key3="(" key4=")"/>
<key key0="π" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
</row>
<row>
<key shift="0.5" key0="α" key1="tab" key2="`"/>
<key key0="σ"/>
<key key0="δ" key2="loc £"/>
<key key0="φ"/>
<key key0="γ" key2="-" key3="_"/>
<key key0="η" key2="=" key3="+"/>
<key key0="ξ" key2="accent_aigu" key3="{" key4="}"/>
<key key0="κ" key2="accent_grave" key3="[" key4="]"/>
<key key0="λ" key2="|" key3="\\"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key key0="ζ"/>
<key key0="χ"/>
<key key0="ψ" key2="&lt;" key3="."/>
<key key0="ω" key2="&gt;" key3=","/>
<key key0="β" key2="\?" key3="/"/>
<key key0="ν" key2=":" key3=";"/>
<key key0="μ" key2="&quot;" key3="'"/>
<key width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -1,34 +1,34 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard> <keyboard>
<row> <row>
<key key0="q" key2="1" key4="esc"/> <key key0="q" key1="esc" key2="1" key3="~" key4="!"/>
<key key0="w" key1="~" key2="2" key3="\@"/> <key key0="w" key2="2" key3="\@"/>
<key key0="e" key1="!" key2="3" key3="\#" key4="€"/> <key key0="e" key2="3" key3="\#" key4="€"/>
<key key0="r" key2="4" key3="$"/> <key key0="r" key2="4" key3="$"/>
<key key0="t" key2="5" key3="%"/> <key key0="t" key2="5" key3="%"/>
<key key0="y" key2="6" key3="^"/> <key key0="y" key2="6" key3="^"/>
<key key0="u" key2="7" key3="&amp;"/> <key key0="u" key2="7" key3="&amp;"/>
<key key0="i" key2="8" key3="*"/> <key key0="i" key2="8" key3="*"/>
<key key0="o" key2="9" key3="(" key4=")"/> <key key0="o" key2="9" key3="(" key4=")"/>
<key key0="p" key2="0" key3="f11_placeholder" key4="f12_placeholder"/> <key key0="p" key2="0"/>
</row> </row>
<row> <row>
<key key0="a" key2="tab" key4="`"/> <key key0="a" key2="`" key3="tab" key4="¡"/>
<key key0="s" key2="¡" key3="loc ß"/> <key key0="s" key1="accent_ring" key3="ß"/>
<key key0="d" key1="accent_grave" key3="accent_aigu"/> <key key0="d" key1="accent_grave" key2="£" key3="accent_aigu"/>
<key key0="f"/> <key key0="f"/>
<key key0="g" key2="-" key3="_"/> <key key0="g" key1="accent_caron" key2="-" key3="_"/>
<key key0="h" key2="=" key3="+"/> <key key0="h" key2="=" key3="+"/>
<key key0="j" key1="accent_trema" key4="}" key3="{"/> <key key0="j" key1="accent_trema" key2="accent_circonflexe" key4="}" key3="{"/>
<key key0="k" key3="[" key4="]"/> <key key0="k" key3="[" key4="]"/>
<key key0="l" key2="|" key3="\\"/> <key key0="l" key2="|" key3="\\"/>
<key key0="ñ" key1="·" key3="ç" /> <key key0="ñ"/>
</row> </row>
<row> <row>
<key width="1.5" key0="shift" key2="loc capslock"/> <key width="1.5" key0="shift"/>
<key key0="z"/> <key key0="z"/>
<key key0="x"/> <key key0="x"/>
<key key0="c" key1="loc accent_cedille" key2="&lt;" key3="."/> <key key0="c" key1="accent_cedille" key2="&lt;" key3="."/>
<key key0="v" key2="&gt;" key3=","/> <key key0="v" key2="&gt;" key3=","/>
<key key0="b" key2="\?" key3="/" key4="¿"/> <key key0="b" key2="\?" key3="/" key4="¿"/>
<key key0="n" key1="accent_tilde" key2=":" key3=";"/> <key key0="n" key1="accent_tilde" key2=":" key3=";"/>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key key0="q" key2="0" key4="esc"/>
<key key0="w" key1="'" key2="1" key3="~" key4="|"/>
<key key0="e" key1="&quot;" key2="2" key4="é"/>
<key key0="r" key2="3" key4="^"/>
<key key0="t" key1="!" key2="4" key4="f11_placeholder"/>
<key key0="y" key1="%" key2="5" key3="°" key4="f12_placeholder"/>
<key key0="u" key1="ű" key2="6" key3="ü" key4="ú"/>
<key key0="i" key1="=" key2="7" key3="`" key4="í"/>
<key key0="o" key1="ő" key2="8" key3="ö" key4="ó"/>
<key key0="p" key2="9"/>
</row>
<row>
<key shift="0.5" key0="a" key1="tab" key4="á"/>
<key key0="s" key1="§" key2="\\" key3="[" key4="]"/>
<key key0="d" key3="{" key4="}"/>
<key key0="f" key3="+"/>
<key key0="g" key3="*"/>
<key key0="h"/>
<key key0="j"/>
<key key0="k" key3="(" key4=")"/>
<key key0="l" key1="$" key3="/"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key key0="z" key3="&lt;" key4="&gt;"/>
<key key0="x" key4="\#"/>
<key key0="c" key4="&amp;"/>
<key key0="v" key4="\@"/>
<key key0="b" key1="\?" key3="," key4=";"/>
<key key0="n" key1=":" key3="."/>
<key key0="m" key1="_" key3="-"/>
<key width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key key0="ㅂ" key2="1" key4="esc"/>
<key key0="ㅈ" key1="~" key2="2" key3="\@"/>
<key key0="ㄷ" key1="!" key2="3" key3="\#"/>
<key key0="ㄱ" key2="4" key3="$"/>
<key key0="ㅅ" key2="5" key3="%"/>
<key key0="ㅛ" key2="6" key3="^"/>
<key key0="ㅕ" key2="7" key3="&amp;"/>
<key key0="ㅑ" key2="8" key3="*"/>
<key key0="ㅐ" key2="9" key3="(" key4=")"/>
<key key0="ㅔ" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
</row>
<row>
<key shift="0.5" key0="ㅁ" key1="tab" key2="`"/>
<key key0="ㄴ"/>
<key key0="ㅇ"/>
<key key0="ㄹ"/>
<key key0="ㅎ" key2="-" key3="_"/>
<key key0="ㅗ" key2="=" key3="+"/>
<key key0="ㅓ" key4="}" key3="{"/>
<key key0="ㅏ" key3="[" key4="]"/>
<key key0="ㅣ" key2="|" key3="\\"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key key0="ㅋ"/>
<key key0="ㅌ"/>
<key key0="ㅊ" key2="&lt;" key3="."/>
<key key0="ㅍ" key2="&gt;" key3=","/>
<key key0="ㅠ" key2="\?" key3="/"/>
<key key0="ㅜ" key2=":" key3=";"/>
<key key0="ㅡ" key2="&quot;" key3="'"/>
<key width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard> <keyboard>
<row> <row>
<key key0="q" key2="1" key4="esc"/> <key key0="q" key1="esc" key2="1" key3="~" key4="!"/>
<key key0="w" key1="~" key2="2" key3="\@" key4="!"/> <key key0="w" key2="2" key3="\@"/>
<key key0="e" key1="ē" key2="3" key3="\#" key4="€"/> <key key0="e" key1="ē" key2="3" key3="\#" key4="€"/>
<key key0="r" key1="ŗ" key2="4" key3="$" key4="f11_placeholder"/> <key key0="r" key1="ŗ" key2="4" key3="$"/>
<key key0="t" key2="5" key3="%" key4="f12_placeholder"/> <key key0="t" key2="5" key3="%"/>
<key key0="y" key2="6" key3="^"/> <key key0="y" key2="6" key3="^"/>
<key key0="u" key1="ū" key2="7" key3="&amp;" key4="*"/> <key key0="u" key1="ū" key2="7" key3="&amp;"/>
<key key0="i" key1="ī" key2="8" key3="(" key4=")"/> <key key0="i" key1="ī" key2="8" key3="*"/>
<key key0="o" key1="ō" key2="9" key3="{" key4="}"/> <key key0="o" key1="ō" key2="9" key3="(" key4=")"/>
<key key0="p" key2="0"/> <key key0="p" key2="0" key3="{" key4="}"/>
</row> </row>
<row> <row>
<key shift="0.5" key0="a" key1="ā" key2="tab"/> <key shift="0.5" key0="a" key1="ā"/>
<key key0="s" key1="š" key3="loc ß" key4="loc accent_ogonek"/> <key key0="s" key1="š" key3="ß"/>
<key key0="d"/> <key key0="d" key2="£"/>
<key key0="f" key1="loc accent_dot_above"/> <key key0="f"/>
<key key0="g" key1="ģ"/> <key key0="g" key1="ģ"/>
<key key0="h" key2="accent_macron" key3="accent_caron" key4="accent_cedille"/> <key key0="h" key2="accent_macron" key3="accent_caron" key4="accent_cedille"/>
<key key0="j" key1="+" key2="=" key3="-" key4="_"/> <key key0="j" key1="+" key2="=" key3="-" key4="_"/>
@@ -24,7 +24,7 @@
<key key0="l" key1="ļ" key2="|" key3="/" key4="\\"/> <key key0="l" key1="ļ" key2="|" key3="/" key4="\\"/>
</row> </row>
<row> <row>
<key width="1.5" key0="shift" key2="loc capslock"/> <key width="1.5" key0="shift" key1="tab"/>
<key key0="z" key1="ž"/> <key key0="z" key1="ž"/>
<key key0="x"/> <key key0="x"/>
<key key0="c" key1="č"/> <key key0="c" key1="č"/>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key key0="q" key2="1" key4="esc"/>
<key key0="w" key1="~" key2="2" key3="\@"/>
<key key0="e" key1="!" key2="3" key3="\#" key4="loc €"/>
<key key0="r" key2="4" key3="$"/>
<key key0="t" key2="5" key3="%"/>
<key key0="y" key2="6" key3="^"/>
<key key0="u" key2="7" key3="&amp;"/>
<key key0="i" key2="8" key3="*"/>
<key key0="o" key1="ø" key2="9" key3="(" key4=")"/>
<key key0="p" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
</row>
<row>
<key shift="0.5" key0="a" key1="tab" key2="`" key3="æ" key4="å"/>
<key key0="s" key1="loc accent_ring" key3="loc ß" key4="loc accent_ogonek"/>
<key key0="d" key1="loc accent_grave" key2="loc £" key3="loc accent_aigu"/>
<key key0="f" key1="loc accent_dot_above"/>
<key key0="g" key1="loc accent_caron" key2="-" key3="_"/>
<key key0="h" key2="=" key3="+"/>
<key key0="j" key1="loc accent_trema" key2="loc accent_circonflexe" key4="}" key3="{"/>
<key key0="k" key1="loc accent_double_aigu" key3="[" key4="]"/>
<key key0="l" key2="|" key3="\\"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key key0="z"/>
<key key0="x"/>
<key key0="c" key1="loc accent_cedille" key2="&lt;" key3="."/>
<key key0="v" key2="&gt;" key3=","/>
<key key0="b" key2="\?" key3="/"/>
<key key0="n" key1="loc accent_tilde" key2=":" key3=";"/>
<key key0="m" key2="&quot;" key3="'"/>
<key width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard> <keyboard>
<row> <row>
<key key0="q" key2="1" key4="esc"/> <key key0="q" key1="esc" key2="1" key3="~" key4="!"/>
<key key0="w" key1="~" key2="2" key3="\@" key4="!"/> <key key0="w" key2="2" key3="\@"/>
<key key0="e" key2="3" key3="\#" key4="€"/> <key key0="e" key1="£" key2="3" key3="\#" key4="€"/>
<key key0="r" key2="4" key3="$" key4="f11_placeholder"/> <key key0="r" key2="4" key3="$"/>
<key key0="t" key2="5" key3="%" key4="f12_placeholder"/> <key key0="t" key2="5" key3="%"/>
<key key0="y" key2="6" key3="^" key4="loc accent_trema"/> <key key0="y" key1="accent_caron" key2="6" key3="^" key4="accent_trema"/>
<key key0="u" key2="7" key3="&amp;"/> <key key0="u" key2="7" key3="&amp;"/>
<key key0="i" key2="8" key3="*"/> <key key0="i" key2="8" key3="*"/>
<key key0="o" key2="9" key3="(" key4=")"/> <key key0="o" key2="9" key3="(" key4=")"/>
<key key0="p" key2="0" key3="\\"/> <key key0="p" key2="0" key3="\\" key4="|"/>
</row> </row>
<row> <row>
<key key0="a" key2="tab" key4="`"/> <key key0="a" key1="tab" key2="'" key3="`" key4="&quot;"/>
<key key0="s" key1="'" key3="loc ß" key4="accent_cedille"/> <key key0="s" key1="accent_ring" key2="accent_caron" key3="ß" key4="accent_cedille"/>
<key key0="d" key1="&quot;"/> <key key0="d"/>
<key key0="f"/> <key key0="f"/>
<key key0="g"/> <key key0="g"/>
<key key0="h"/> <key key0="h"/>
<key key0="j" key1="-" key2="=" key4="+" key3="_"/> <key key0="j" key1="-" key2="=" key4="+" key3="_"/>
<key key0="k" key1="accent_grave" key2="accent_aigu" key3="accent_tilde" key4="accent_circonflexe"/> <key key0="k" key1="accent_grave" key2="accent_aigu" key3="accent_tilde" key4="accent_circonflexe"/>
<key key0="l" key1="[" key2="]" key3="{" key4="}"/> <key key0="l" key1="[" key2="]" key3="{" key4="}"/>
<key key0="ç" key1="|"/> <key key0="ç"/>
</row> </row>
<row> <row>
<key width="1.5" key0="shift" key2="loc capslock"/> <key width="1.5" key0="shift"/>
<key key0="z"/> <key key0="z"/>
<key key0="x"/> <key key0="x"/>
<key key0="c"/> <key key0="c"/>

View File

@@ -1,41 +1,42 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard> <keyboard>
<row> <row>
<key key0="q" key4="esc" key2="1"/> <key key0="q" key1="esc" key2="1"/>
<key key0="w" key2="2" key3="`" key4="\@"/> <key key0="w" key2="2" key4="\@"/>
<key key0="e" key2="3" key4="\#" key3="€"/> <key key0="e" key2="3" key4="\#" key3="€"/>
<key key0="r" key2="4" key4="$"/> <key key0="r" key2="4" key4="$"/>
<key key0="t" key2="5" key3="&amp;" key4="|"/> <key key0="t" key2="5" key3="&amp;" key4="|" />
<key key0="y" key2="6" key3="^" key4="%"/> <key key0="y" key2="6" key3="^" key4="%"/>
<key key0="u" key2="7" key3="~" key4="\\"/> <key key0="u" key2="7" key3="~" key4="\\" />
<key key0="i" key2="8" key3="*" key4="/"/> <key key0="i" key2="8" key3="*" key4="/" />
<key key0="o" key2="9" key3="+" key4="-"/> <key key0="o" key2="9" key3="+" key4="-"/>
<key key0="p" key2="0" key3="=" key4="f11_placeholder"/> <key key0="p" key2="0" key3="=" />
<key key0="å" key1="\?" key3="!" key4="f12_placeholder"/> <key key0="å" key1="\?" key3="!" key2="`" />
</row> </row>
<row> <row>
<key key0="a" key2="tab"/> <key key0="a" key1="tab" />
<key key0="s" key1="accent_ring" key3="loc ß"/> <key key0="s" key1="accent_ring" key2="accent_cedille" key3="ß" key4="accent_tilde"/>
<key key0="d" key3="accent_aigu"/> <key key0="d" key1="accent_grave" key2="accent_caron" key3="accent_aigu"/>
<key key0="f" key1="accent_trema"/> <key key0="f" key1="accent_trema" key2="accent_circonflexe"/>
<key key0="g"/> <key key0="g" />
<key key0="h"/> <key key0="h" />
<key key0="j" key1="{" key4="}"/> <key key0="j" key1="{" key4="}" />
<key key0="k" key1="[" key4="]"/> <key key0="k" key1="[" key4="]" />
<key key0="l" key1="(" key4=")"/> <key key0="l" key1="(" key4=")" />
<key key0="ö" key1="&lt;" key4="&gt;"/> <key key0="ö" key1="&lt;" key4="&gt;" />
<key key0="ä" key1="'" key3="&quot;"/> <key key0="ä" key1="'" key3="&quot;"/>
</row> </row>
<row> <row>
<key width="1.5" key0="shift" key2="loc capslock"/> <key width="1.5" key0="shift"/>
<key key0="z"/> <key key0="z" />
<key key0="x"/> <key key0="x" />
<key key0="c"/> <key key0="c" />
<key key0="v"/> <key key0="v" />
<key key0="b" key2=";" key4=","/> <key key0="b" key2=";" key4=","/>
<key key0="n" key2=":" key4="."/> <key key0="n" key2=":" key4="."/>
<key key0="m" key2="-" key4="_"/> <key key0="m" key2="-" key4="_"/>
<key width="1.0" key0="." key1="!" key2="\?" key3="'" key4=","/> <key width="1.0" key0="." key1="!" key2="\?" key3="'" key4="," />
<key width="1.5" key0="backspace" key2="delete"/> <key width="1.5" key0="backspace" key2="delete"/>
</row> </row>
</keyboard> </keyboard>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key key0="q" key2="1" key4="esc"/>
<key key0="w" key1="~" key2="2" key3="\@"/>
<key key0="e" key1="!" key2="3" key3="\#" key4="€"/>
<key key0="r" key2="4" key3="$"/>
<key key0="t" key2="5" key3="%" key4="₺"/>
<key key0="y" key2="6" key3="^"/>
<key key0="u" key1="ü" key2="7" key3="&amp;"/>
<key key0="i" key1="ı" key2="8" key3="*"/>
<key key0="o" key1="ö" key2="9" key3="(" key4=")"/>
<key key0="p" key1="0" />
</row>
<row>
<key shift="0.5" key0="a" key1="tab" key2="`"/>
<key key0="s" key1="ş"/>
<key key0="d"/>
<key key0="f"/>
<key key0="g" key1="ğ" key2="-" key3="_"/>
<key key0="h" key2="=" key3="+"/>
<key key0="j" key3="{" key4="}"/>
<key key0="k" key3="[" key4="]"/>
<key key0="l" key2="|" key3="\\"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key key0="z"/>
<key key0="x"/>
<key key0="c" key1="ç" key2="&lt;" key3="."/>
<key key0="v" key2="&gt;" key3=","/>
<key key0="b" key2="\?" key3="/"/>
<key key0="n" key2=":" key3=";"/>
<key key0="m" key2="&quot;" key3="'"/>
<key width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<keyboard> <keyboard>
<row> <row>
<key key0="q" key2="1" key4="esc"/> <key key0="q" key1="esc" key2="1" key3="\@" key4="!"/>
<key key0="w" key1="^" key2="2" key3="&quot;" key4="\@"/> <key key0="w" key1="^" key2="2" key3="&quot;"/>
<key key0="e" key1="§" key2="3" key3="!" key4="€"/> <key key0="e" key1="§" key2="3" key4="€"/>
<key key0="r" key2="4" key3="$" key4="f11_placeholder"/> <key key0="r" key2="4" key3="$"/>
<key key0="t" key2="5" key3="%" key4="f12_placeholder"/> <key key0="t" key2="5" key3="%"/>
<key key0="z" key2="6" key3="&amp;" key4="{"/> <key key0="z" key2="6" key3="&amp;" key4="{"/>
<key key0="u" key2="7" key3="ü" key4="}"/> <key key0="u" key2="7" key3="ü" key4="}"/>
<key key0="i" key1="(" key2="8" key3="[" key4="]"/> <key key0="i" key1="(" key2="8" key4="["/>
<key key0="o" key1=")" key2="9" key3="ö" key4="="/> <key key0="o" key1=")" key2="9" key3="ö" key4="]"/>
<key key0="p" key2="0" key3="\?"/> <key key0="p" key1="=" key2="0" key3="\?"/>
</row> </row>
<row> <row>
<key shift="0.5" key0="a" key1="tab" key2="`" key3="ä"/> <key shift="0.5" key0="a" key1="tab" key2="`" key3="ä"/>
<key key0="s" key3="ß"/> <key key0="s" key3="ß"/>
<key key0="d"/> <key key0="d" key2="£"/>
<key key0="f" key1="~"/> <key key0="f" key1="~"/>
<key key0="g" key3="-"/> <key key0="g" key3="-"/>
<key key0="h" key3="+"/> <key key0="h" key3="+"/>
@@ -24,7 +24,7 @@
<key key0="l" key1="'" key3="\#"/> <key key0="l" key1="'" key3="\#"/>
</row> </row>
<row> <row>
<key width="1.5" key0="shift" key2="loc capslock"/> <key width="1.5" key0="shift"/>
<key key0="y" key1="&gt;" key2="|" key3="&lt;"/> <key key0="y" key1="&gt;" key2="|" key3="&lt;"/>
<key key0="x"/> <key key0="x"/>
<key key0="c"/> <key key0="c"/>

View File

@@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key key0="q" key1="1" key4="esc"/>
<key key0="w" key1="2" key3="~"/>
<key key0="e" key1="3" key2="é" key3="ë" key4="ě"/>
<key key0="r" key1="4" key2="ŕ" key3="°" key4="ř"/>
<key key0="t" key1="5" key3="%" key4="ť"/>
<key key0="z" key1="6" key3="^" key4="ž"/>
<key key0="u" key1="7" key2="ú" key3="ü" key4="ů"/>
<key key0="i" key1="8" key2="í" key3="ï" key4="*"/>
<key key0="o" key1="9" key2="ó" key3="ö" key4="ô"/>
<key key0="p" key1="0" key2="=" key3="/" key4="π"/>
</row>
<row>
<key shift="0.5" key0="a" key1="tab" key2="á" key3="ä" key4="α"/>
<key key0="s" key1="{" key2="&lt;" key3="§" key4="š"/>
<key key0="d" key1="$" key2="δ" key3="Δ" key4="ď"/>
<key key0="f" key1="&gt;" key2="}" key3="ѳ" key4="φ"/>
<key key0="g" key1="»" key2="«" key3="" key4="_"/>
<key key0="h" key1="[" key2="("/>
<key key0="j" key1="+" key2="\?" key3="!" key4="-"/>
<key key0="k" key1=")" key2="]"/>
<key key0="l" key2="ľ" key3="\\" key4="ĺ"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key key0="y" key1="÷" key2="ý"/>
<key key0="x" key1="∙" key3="×"/>
<key key0="c" key1="\#" key2="γ" key3="&amp;" key4="č"/>
<key key0="v" key1="|" key3="\@"/>
<key key0="b" key1=";" key2="♭" key3=":" key4="β"/>
<key key0="n" key1="," key3="." key4="ň"/>
<key key0="m" key1="&quot;" key3="\'"/>
<key width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -1,40 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key key0="q" key2="1" key4="esc"/>
<key key0="w" key1="^" key2="2" key3="&quot;" key4="\@"/>
<key key0="e" key1="§" key2="3" key3="!" key4="€"/>
<key key0="r" key2="4" key3="$" key4="f11_placeholder"/>
<key key0="t" key2="5" key3="%" key4="f12_placeholder"/>
<key key0="z" key2="6" key3="&amp;"/>
<key key0="u" key2="7" key3="{" key4="}"/>
<key key0="i" key2="8" key3="[" key4="]"/>
<key key0="o" key2="9" key3="(" key4=")"/>
<key key0="p" key2="0" key3="="/>
<key key0="ü" key3="\?"/>
</row>
<row>
<key key0="a" key2="tab"/>
<key key0="s" key1="`" key3="ß"/>
<key key0="d"/>
<key key0="f" key1="~"/>
<key key0="g" key3="-"/>
<key key0="h" key3="+"/>
<key key0="j" key3="*"/>
<key key0="k" key3="/"/>
<key key0="l" key1="'" key3="\\"/>
<key key0="ö" key3="\#"/>
<key key0="ä"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key shift="0.5" key0="y" key1="&gt;" key2="|" key3="&lt;"/>
<key key0="x"/>
<key key0="c"/>
<key key0="v"/>
<key key0="b" key1=";" key3=","/>
<key key0="n" key1=":" key3="."/>
<key key0="m" key1="_"/>
<key shift="0.5" width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -1,38 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard>
<row>
<key key0="q" key2="0" key4="esc"/>
<key key0="w" key1="'" key2="1" key3="~" key4="|"/>
<key key0="e" key1="&quot;" key2="2" key4="é"/>
<key key0="r" key2="3" key4="^"/>
<key key0="t" key1="!" key2="4" key4="f11_placeholder"/>
<key key0="z" key1="%" key2="5" key3="°" key4="f12_placeholder"/>
<key key0="u" key1="ű" key2="6" key3="ü" key4="ú"/>
<key key0="i" key1="=" key2="7" key3="`" key4="í"/>
<key key0="o" key1="ő" key2="8" key3="ö" key4="ó"/>
<key key0="p" key2="9"/>
</row>
<row>
<key shift="0.5" key0="a" key1="tab" key4="á"/>
<key key0="s" key1="§" key2="\\" key3="[" key4="]"/>
<key key0="d" key3="{" key4="}"/>
<key key0="f" key3="+"/>
<key key0="g" key3="*"/>
<key key0="h"/>
<key key0="j"/>
<key key0="k" key3="(" key4=")"/>
<key key0="l" key1="$" key3="/"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key key0="y" key3="&lt;" key4="&gt;"/>
<key key0="x" key4="\#"/>
<key key0="c" key4="&amp;"/>
<key key0="v" key4="\@"/>
<key key0="b" key1="\?" key3="," key4=";"/>
<key key0="n" key1=":" key3="."/>
<key key0="m" key1="_" key3="-"/>
<key width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@@ -1,49 +1,32 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/pref_category_layout"> <PreferenceCategory android:title="@string/pref_category_layout">
<ListPreference android:key="layout" android:title="@string/pref_layout_title" android:summary="%s" android:defaultValue="system" android:entries="@array/pref_layout_entries" android:entryValues="@array/pref_layout_values"/> <ListPreference android:key="layout" android:title="@string/pref_layout_title" android:summary="%s" android:defaultValue="system" android:entries="@array/pref_layout_entries" android:entryValues="@array/pref_layout_values"/>
<ListPreference android:key="accents" android:title="@string/pref_accents_title" android:summary="%s" android:defaultValue="1" android:entries="@array/pref_accents_entries" android:entryValues="@array/pref_accents_values"/> <ListPreference android:key="accents" android:title="@string/pref_accents_title" android:summary="%s" android:defaultValue="1" android:entries="@array/pref_accents_entries" android:entryValues="@array/pref_accents_values"/>
<ListPreference android:key="show_numpad" android:title="@string/pref_show_numpad_title" android:summary="%s" android:defaultValue="1" android:entries="@array/pref_show_numpad_entries" android:entryValues="@array/pref_show_numpad_values"/>
<ListPreference android:key="programming_layout" android:title="@string/pref_programming_layout_title" android:summary="%s" android:defaultValue="none" android:entries="@array/pref_programming_layout_entries" android:entryValues="@array/pref_programming_layout_values"/>
<PreferenceScreen android:title="@string/pref_extra_keys_title">
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="0"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="1"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="2"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="3"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="4"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="5"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="6"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="7"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="8"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="9"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="10"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="11"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="12"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="13"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="14"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="15"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="16"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="17"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="18"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="19"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="20"/>
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="21"/>
</PreferenceScreen>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/pref_category_typing"> <PreferenceCategory android:title="@string/pref_category_typing">
<CheckBoxPreference android:key="autocapitalisation" android:title="@string/pref_autocapitalisation_title" android:summary="@string/pref_autocapitalisation_summary" android:defaultValue="true"/>
<ListPreference android:key="swipe_dist" android:title="@string/pref_swipe_dist_title" android:summary="@string/pref_swipe_dist_summary" android:defaultValue="15" android:entries="@array/pref_swipe_dist_entries" android:entryValues="@array/pref_swipe_dist_values"/> <ListPreference android:key="swipe_dist" android:title="@string/pref_swipe_dist_title" android:summary="@string/pref_swipe_dist_summary" android:defaultValue="15" android:entries="@array/pref_swipe_dist_entries" android:entryValues="@array/pref_swipe_dist_values"/>
<juloo.common.IntSlideBarPreference android:key="longpress_timeout" android:title="@string/pref_long_timeout_title" android:summary="%sms" android:defaultValue="600" min="50" max="2000"/> <juloo.common.IntSlideBarPreference android:key="longpress_timeout" android:title="@string/pref_long_timeout_title" android:summary="%sms" android:defaultValue="600" min="50" max="2000"/>
<juloo.common.IntSlideBarPreference android:key="longpress_interval" android:title="@string/pref_long_interval_title" android:summary="%sms" android:defaultValue="25" min="5" max="100"/> <juloo.common.IntSlideBarPreference android:key="longpress_interval" android:title="@string/pref_long_interval_title" android:summary="%sms" android:defaultValue="25" min="5" max="100"/>
<CheckBoxPreference android:key="precise_repeat" android:title="@string/pref_precise_repeat_title" android:summary="@string/pref_precise_repeat_summary" android:defaultValue="true"/> <CheckBoxPreference android:key="precise_repeat" android:title="@string/pref_precise_repeat_title" android:summary="@string/pref_precise_repeat_summary" android:defaultValue="true"/>
<CheckBoxPreference android:key="lock_double_tap" android:title="@string/pref_lock_double_tap_title" android:summary="@string/pref_lock_double_tap_summary" android:defaultValue="false"/> <PreferenceScreen android:title="@string/pref_lockable_keys_title" android:summary="@string/pref_lockable_keys_summary">
<CheckBoxPreference android:key="lockable_shift" android:title="Shift" android:defaultValue="true"/>
<CheckBoxPreference android:key="lockable_ctrl" android:title="Ctrl" android:defaultValue="false"/>
<CheckBoxPreference android:key="lockable_alt" android:title="Alt" android:defaultValue="false"/>
<CheckBoxPreference android:key="lockable_fn" android:title="Fn" android:defaultValue="false"/>
<CheckBoxPreference android:key="lockable_meta" android:title="Meta" android:defaultValue="false"/>
<CheckBoxPreference android:key="lockable_sup" android:title="Sup" android:defaultValue="false"/>
<CheckBoxPreference android:key="lockable_sub" android:title="Sub" android:defaultValue="false"/>
</PreferenceScreen>
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_category_vibrate">
<CheckBoxPreference android:key="vibrate_enabled" android:title="@string/pref_vibrate_title" android:summary="@string/pref_vibrate_summary" android:defaultValue="true"/> <CheckBoxPreference android:key="vibrate_enabled" android:title="@string/pref_vibrate_title" android:summary="@string/pref_vibrate_summary" android:defaultValue="true"/>
<juloo.common.IntSlideBarPreference android:key="vibrate_duration" android:title="@string/pref_vibrate_duration_title" android:summary="%sms" android:defaultValue="20" min="5" max="50"/>
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/pref_category_style"> <PreferenceCategory android:title="@string/pref_category_style">
<ListPreference android:key="theme" android:title="@string/pref_theme" android:summary="%s" android:defaultValue="system" android:entries="@array/pref_theme_entries" android:entryValues="@array/pref_theme_values"/> <ListPreference android:key="theme" android:title="@string/pref_theme" android:summary="%s" android:defaultValue="system" android:entries="@array/pref_theme_entries" android:entryValues="@array/pref_theme_values"/>
<juloo.common.IntSlideBarPreference android:key="margin_bottom" android:title="@string/pref_margin_bottom_title" android:summary="%sdp" android:defaultValue="5" min="0" max="100"/> <juloo.common.IntSlideBarPreference android:key="margin_bottom" android:title="@string/pref_margin_bottom_title" android:summary="%sdp" android:defaultValue="5" min="0" max="100"/>
<juloo.common.IntSlideBarPreference android:key="keyboard_height" android:title="@string/pref_keyboard_height_title" android:summary="%s%%" android:defaultValue="35" min="25" max="50"/> <juloo.common.IntSlideBarPreference android:key="keyboard_height" android:title="@string/pref_keyboard_height_title" android:summary="%s%%" android:defaultValue="35" min="25" max="50"/>
<juloo.common.IntSlideBarPreference android:key="keyboard_height_landscape" android:title="@string/pref_keyboard_height_landscape_title" android:summary="%s%%" android:defaultValue="50" min="35" max="65"/>
<juloo.common.IntSlideBarPreference android:key="horizontal_margin" android:title="@string/pref_horizontal_margin_title" android:summary="%sdp" android:defaultValue="3" min="0" max="20"/> <juloo.common.IntSlideBarPreference android:key="horizontal_margin" android:title="@string/pref_horizontal_margin_title" android:summary="%sdp" android:defaultValue="3" min="0" max="20"/>
<juloo.common.SlideBarPreference android:key="character_size" android:title="@string/pref_character_size_title" android:summary="@string/pref_character_size_summary" android:defaultValue="1.0" min="0.8" max="1.2"/> <juloo.common.SlideBarPreference android:key="character_size" android:title="@string/pref_character_size_title" android:summary="@string/pref_character_size_summary" android:defaultValue="1.0" min="0.8" max="1.2"/>
<juloo.common.IntSlideBarPreference android:key="key_vertical_space" android:title="@string/pref_key_vertical_space" android:summary="%sdp" android:defaultValue="2" min="0" max="8"/> <juloo.common.IntSlideBarPreference android:key="key_vertical_space" android:title="@string/pref_key_vertical_space" android:summary="%sdp" android:defaultValue="2" min="0" max="8"/>

View File

@@ -14,6 +14,6 @@ let
in in
pkgs.mkShell { pkgs.mkShell {
buildInputs = [ pkgs.findutils jdk android.androidsdk pkgs.fontforge ]; buildInputs = [ pkgs.findutils jdk android.androidsdk ];
ANDROID_HOME = "${android.androidsdk}/libexec/android-sdk"; ANDROID_HOME = "${android.androidsdk}/libexec/android-sdk";
} }

View File

@@ -95,10 +95,6 @@ public class IntSlideBarPreference extends DialogPreference
{ {
if (positiveResult) if (positiveResult)
persistInt(_seekBar.getProgress() + _min); persistInt(_seekBar.getProgress() + _min);
else
_seekBar.setProgress(getPersistedInt(_min) - _min);
updateText();
} }
protected View onCreateDialogView() protected View onCreateDialogView()

View File

@@ -99,10 +99,6 @@ public class SlideBarPreference extends DialogPreference
{ {
if (positiveResult) if (positiveResult)
persistFloat(_value); persistFloat(_value);
else
_seekBar.setProgress((int)((getPersistedFloat(_min) - _min) * STEPS / (_max - _min)));
updateText();
} }
protected View onCreateDialogView() protected View onCreateDialogView()

View File

@@ -1,148 +0,0 @@
package juloo.keyboard2;
import android.os.Handler;
import android.os.Looper;
import android.text.InputType;
import android.text.TextUtils;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.KeyEvent;
final class Autocapitalisation
{
boolean _enabled = false;
boolean _should_enable_shift = false;
boolean _should_disable_shift = false;
boolean _should_update_caps_mode = false;
Handler _handler;
InputConnection _ic;
Callback _callback;
int _caps_mode;
/** Keep track of the cursor to recognize cursor movements from typing. */
int _cursor;
static int SUPPORTED_CAPS_MODES =
InputType.TYPE_TEXT_FLAG_CAP_SENTENCES |
InputType.TYPE_TEXT_FLAG_CAP_WORDS;
public Autocapitalisation(Looper looper, Callback cb)
{
_handler = new Handler(looper);
_callback = cb;
}
/**
* The events are: started, typed, event sent, selection updated
* [started] does initialisation work and must be called before any other
* event.
*/
public void started(EditorInfo info, InputConnection ic)
{
_ic = ic;
_caps_mode = info.inputType & TextUtils.CAP_MODE_SENTENCES;
if (!Config.globalConfig().autocapitalisation || _caps_mode == 0)
{
_enabled = false;
return;
}
_enabled = true;
_should_enable_shift = (info.initialCapsMode != 0);
_callback.update_shift_state(_should_enable_shift, true);
}
public void typed(CharSequence c)
{
for (int i = 0; i < c.length(); i++)
type_one_char(c.charAt(i));
callback(false);
}
public void typed(char c)
{
type_one_char(c);
callback(false);
}
public void event_sent(int code, int meta)
{
if (meta != 0)
{
_should_enable_shift = false;
_should_update_caps_mode = false;
return;
}
switch (code)
{
case KeyEvent.KEYCODE_DEL:
if (_cursor > 0) _cursor--;
_should_update_caps_mode = true;
break;
}
callback(true);
}
public static interface Callback
{
public void update_shift_state(boolean should_enable, boolean should_disable);
}
/** Returns [true] if shift might be disabled. */
public void selection_updated(int old_cursor, int new_cursor)
{
if (new_cursor == _cursor) // Just typing
return;
if (new_cursor == 0 && _ic != null)
{
// Detect whether the input box has been cleared
CharSequence t = _ic.getTextAfterCursor(1, 0);
if (t != null && t.equals(""))
_should_update_caps_mode = true;
}
_cursor = new_cursor;
_should_enable_shift = false;
callback(true);
}
Runnable delayed_callback = new Runnable()
{
public void run()
{
if (_should_update_caps_mode && _ic != null)
{
_should_enable_shift = _enabled && (_ic.getCursorCapsMode(_caps_mode) != 0);
_should_update_caps_mode = false;
}
_callback.update_shift_state(_should_enable_shift, _should_disable_shift);
}
};
void callback(final boolean might_disable)
{
_should_disable_shift = might_disable;
// The callback must be delayed because [getCursorCapsMode] would sometimes
// be called before the editor finished handling the previous event.
_handler.postDelayed(delayed_callback, 1);
}
void type_one_char(char c)
{
_cursor++;
if (is_trigger_character(c))
_should_update_caps_mode = true;
else
_should_enable_shift = false;
}
boolean is_trigger_character(char c)
{
switch (c)
{
case ' ':
return true;
default:
return false;
}
}
}

View File

@@ -9,7 +9,6 @@ import android.preference.PreferenceManager;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.KeyEvent; import android.view.KeyEvent;
import java.util.Iterator;
import java.util.Set; import java.util.Set;
import java.util.HashSet; import java.util.HashSet;
@@ -18,16 +17,17 @@ final class Config
// From resources // From resources
public final float marginTop; public final float marginTop;
public final float keyPadding; public final float keyPadding;
public final float labelTextSize; public final float labelTextSize;
public final float sublabelTextSize; public final float sublabelTextSize;
/** Presses within this radius of an other pointer are ignored */
public final float pointerTooClose;
// From preferences // From preferences
public int layout; // Or '-1' for the system defaults public int layout; // Or '-1' for the system defaults
public int programming_layout; // Or '-1' for none private float swipe_dist_dp;
public boolean show_numpad = false;
public float swipe_dist_px; public float swipe_dist_px;
public boolean vibrateEnabled; public boolean vibrateEnabled;
public long vibrateDuration;
public long longPressTimeout; public long longPressTimeout;
public long longPressInterval; public long longPressInterval;
public float marginBottom; public float marginBottom;
@@ -36,20 +36,17 @@ final class Config
public float keyVerticalInterval; public float keyVerticalInterval;
public float keyHorizontalInterval; public float keyHorizontalInterval;
public boolean preciseRepeat; public boolean preciseRepeat;
public boolean double_tap_lock_shift; public int lockable_modifiers;
public float characterSize; // Ratio public float characterSize; // Ratio
public int accents; // Values are R.values.pref_accents_v_* public int accents; // Values are R.values.pref_accents_v_*
public int theme; // Values are R.style.* public int theme; // Values are R.style.*
public boolean autocapitalisation;
// Dynamically set // Dynamically set
public boolean shouldOfferSwitchingToNextInputMethod; public boolean shouldOfferSwitchingToNextInputMethod;
public boolean shouldOfferSwitchingToProgramming;
public String actionLabel; // Might be 'null' public String actionLabel; // Might be 'null'
public int actionId; // Meaningful only when 'actionLabel' isn't 'null' public int actionId; // Meaningful only when 'actionLabel' isn't 'null'
public boolean swapEnterActionKey; // Swap the "enter" and "action" keys public boolean swapEnterActionKey; // Swap the "enter" and "action" keys
public Set<KeyValue> extra_keys_subtype; public Set<String> extra_keys; // 'null' means all the keys
public Set<KeyValue> extra_keys_param;
public final IKeyEventHandler handler; public final IKeyEventHandler handler;
@@ -59,12 +56,13 @@ final class Config
// static values // static values
marginTop = res.getDimension(R.dimen.margin_top); marginTop = res.getDimension(R.dimen.margin_top);
keyPadding = res.getDimension(R.dimen.key_padding); keyPadding = res.getDimension(R.dimen.key_padding);
labelTextSize = 0.33f; labelTextSize = res.getFloat(R.integer.label_text_size);
sublabelTextSize = 0.22f; sublabelTextSize = res.getFloat(R.integer.sublabel_text_size);
pointerTooClose = res.getDimension(R.dimen.pointer_too_close);
// default values // default values
layout = -1; layout = -1;
programming_layout = -1;
vibrateEnabled = true; vibrateEnabled = true;
vibrateDuration = 20;
longPressTimeout = 600; longPressTimeout = 600;
longPressInterval = 65; longPressInterval = 65;
marginBottom = res.getDimension(R.dimen.margin_bottom); marginBottom = res.getDimension(R.dimen.margin_bottom);
@@ -79,11 +77,10 @@ final class Config
refresh(context); refresh(context);
// initialized later // initialized later
shouldOfferSwitchingToNextInputMethod = false; shouldOfferSwitchingToNextInputMethod = false;
shouldOfferSwitchingToProgramming = false;
actionLabel = null; actionLabel = null;
actionId = 0; actionId = 0;
swapEnterActionKey = false; swapEnterActionKey = false;
extra_keys_subtype = null; extra_keys = null;
handler = h; handler = h;
} }
@@ -95,122 +92,81 @@ final class Config
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
Resources res = context.getResources(); Resources res = context.getResources();
DisplayMetrics dm = res.getDisplayMetrics(); DisplayMetrics dm = res.getDisplayMetrics();
// The height of the keyboard is relative to the height of the screen. // The height of the keyboard is relative to the height of the screen. This
// This is the height of the keyboard if it have 4 rows. // is not the actual size of the keyboard, which will be bigger if the
// layout has a fifth row.
int keyboardHeightPercent; int keyboardHeightPercent;
// Scale some dimensions depending on orientation
float horizontalIntervalScale = 1.f;
float characterSizeScale = 1.f;
String show_numpad_s = prefs.getString("show_numpad", "never");
show_numpad = "always".equals(show_numpad_s);
if (res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) // Landscape mode if (res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) // Landscape mode
{ {
if ("landscape".equals(show_numpad_s)) keyboardHeightPercent = 55;
show_numpad = true;
keyboardHeightPercent = prefs.getInt("keyboard_height_landscape", 50);
horizontalIntervalScale = 2.f;
characterSizeScale = 1.25f;
} }
else else
{ {
keyboardHeightPercent = prefs.getInt("keyboard_height", 35); keyboardHeightPercent = prefs.getInt("keyboard_height", 35);
} }
String layout_s = prefs.getString("layout", "system"); layout = layoutId_of_string(prefs.getString("layout", "system"));
layout = layout_s.equals("system") ? -1 : layoutId_of_string(layout_s); swipe_dist_dp = Float.valueOf(prefs.getString("swipe_dist", "15"));
String prog_layout_s = prefs.getString("programming_layout", "none"); swipe_dist_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, swipe_dist_dp, dm);
programming_layout = prog_layout_s.equals("none") ? -1 : layoutId_of_string(prog_layout_s);
// The swipe distance is defined relatively to the "exact physical pixels
// per inch of the screen", which isn't affected by the scaling settings.
// Take the mean of both dimensions as an approximation of the diagonal.
float physical_scaling = (dm.widthPixels + dm.heightPixels) / (dm.xdpi + dm.ydpi);
swipe_dist_px = Float.valueOf(prefs.getString("swipe_dist", "15")) * physical_scaling;;
vibrateEnabled = prefs.getBoolean("vibrate_enabled", vibrateEnabled); vibrateEnabled = prefs.getBoolean("vibrate_enabled", vibrateEnabled);
vibrateDuration = prefs.getInt("vibrate_duration", (int)vibrateDuration);
longPressTimeout = prefs.getInt("longpress_timeout", (int)longPressTimeout); longPressTimeout = prefs.getInt("longpress_timeout", (int)longPressTimeout);
longPressInterval = prefs.getInt("longpress_interval", (int)longPressInterval); longPressInterval = prefs.getInt("longpress_interval", (int)longPressInterval);
marginBottom = getDipPref(dm, prefs, "margin_bottom", marginBottom); marginBottom = getDipPref(dm, prefs, "margin_bottom", marginBottom);
keyVerticalInterval = getDipPref(dm, prefs, "key_vertical_space", keyVerticalInterval); keyVerticalInterval = getDipPref(dm, prefs, "key_vertical_space", keyVerticalInterval);
keyHorizontalInterval = keyHorizontalInterval = getDipPref(dm, prefs, "key_horizontal_space", keyHorizontalInterval);
getDipPref(dm, prefs, "key_horizontal_space", keyHorizontalInterval)
* horizontalIntervalScale;
// Do not substract keyVerticalInterval from keyHeight because this is done // Do not substract keyVerticalInterval from keyHeight because this is done
// during rendered. // during rendered.
keyHeight = dm.heightPixels * keyboardHeightPercent / 100 / 4; keyHeight = dm.heightPixels * keyboardHeightPercent / 100 / 4;
horizontalMargin = horizontalMargin = getDipPref(dm, prefs, "horizontal_margin", horizontalMargin) + res.getDimension(R.dimen.extra_horizontal_margin);
getDipPref(dm, prefs, "horizontal_margin", horizontalMargin)
+ res.getDimension(R.dimen.extra_horizontal_margin);
preciseRepeat = prefs.getBoolean("precise_repeat", preciseRepeat); preciseRepeat = prefs.getBoolean("precise_repeat", preciseRepeat);
double_tap_lock_shift = prefs.getBoolean("lock_double_tap", false); lockable_modifiers =
characterSize = (prefs.getBoolean("lockable_shift", true) ? KeyValue.FLAG_SHIFT : 0)
prefs.getFloat("character_size", characterSize) | (prefs.getBoolean("lockable_ctrl", false) ? KeyValue.FLAG_CTRL : 0)
* characterSizeScale; | (prefs.getBoolean("lockable_alt", false) ? KeyValue.FLAG_ALT : 0)
| (prefs.getBoolean("lockable_fn", false) ? KeyValue.FLAG_FN : 0)
| (prefs.getBoolean("lockable_meta", false) ? KeyValue.FLAG_META : 0)
| (prefs.getBoolean("lockable_sup", false) ? KeyValue.FLAG_ACCENT_SUPERSCRIPT : 0)
| (prefs.getBoolean("lockable_sub", false) ? KeyValue.FLAG_ACCENT_SUBSCRIPT : 0);
characterSize = prefs.getFloat("character_size", characterSize);
accents = Integer.valueOf(prefs.getString("accents", "1")); accents = Integer.valueOf(prefs.getString("accents", "1"));
theme = getThemeId(res, prefs.getString("theme", "")); theme = getThemeId(res, prefs.getString("theme", ""));
autocapitalisation = prefs.getBoolean("autocapitalisation", true);
extra_keys_param = ExtraKeyCheckBoxPreference.get_extra_keys(prefs);
} }
/** Update the layout according to the configuration. /** Update the layout according to the configuration.
* - Remove the switching key if it isn't needed * - Remove the switching key if it isn't needed
* - Remove "localized" keys from other locales (not in 'extra_keys') * - Remove keys from other locales (not in 'extra_keys')
* - Replace the action key to show the right label * - Replace the action key to show the right label
* - Swap the enter and action keys * - Swap the enter and action keys
*/ */
public KeyboardData modify_layout(KeyboardData original_kw) public KeyboardData modify_layout(KeyboardData kw)
{ {
// Update the name to avoid caching in KeyModifier // Update the name to avoid caching in KeyModifier
final KeyValue action_key = (actionLabel == null) ? null : KeyValue action_key = (actionLabel == null) ? null :
KeyValue.getKeyByName("action").withSymbol(actionLabel); KeyValue.getKeyByName("action").withNameAndSymbol(actionLabel, actionLabel);
// Extra keys are removed from the set as they are encountered during the return kw.replaceKeys(key -> {
// first iteration then automatically added. if (key == null)
final Set<KeyValue> extra_keys = new HashSet<KeyValue>(); return null;
extra_keys.addAll(extra_keys_subtype); switch (key.eventCode)
extra_keys.addAll(extra_keys_param);
KeyboardData kw = original_kw.mapKeys(new KeyboardData.MapKeyValues() {
public KeyValue apply(KeyValue key, boolean localized)
{ {
boolean is_extra_key = extra_keys.contains(key); case KeyValue.EVENT_CHANGE_METHOD:
if (is_extra_key) return shouldOfferSwitchingToNextInputMethod ? key : null;
extra_keys.remove(key); case KeyEvent.KEYCODE_ENTER:
if (localized && !is_extra_key) return (swapEnterActionKey && action_key != null) ? action_key : key;
return null; case KeyValue.EVENT_ACTION:
switch (key.getKind()) return (swapEnterActionKey && action_key != null) ?
{ KeyValue.getKeyByName("enter") : action_key;
case Event: default:
switch (key.getEvent()) if (key.flags != 0)
{ {
case CHANGE_METHOD: if ((key.flags & KeyValue.FLAG_LOCALIZED) != 0 &&
return shouldOfferSwitchingToNextInputMethod ? key : null; extra_keys != null &&
case ACTION: !extra_keys.contains(key.name))
return (swapEnterActionKey && action_key != null) ? return null;
KeyValue.getKeyByName("enter") : action_key; if ((key.flags & lockable_modifiers) != 0)
case SWITCH_PROGRAMMING: return key.withFlags(key.flags | KeyValue.FLAG_LOCK);
return shouldOfferSwitchingToProgramming ? key : null; }
} return key;
break; }});
case Keyevent:
switch (key.getKeyevent())
{
case KeyEvent.KEYCODE_ENTER:
return (swapEnterActionKey && action_key != null) ? action_key : key;
}
break;
case Modifier:
switch (key.getModifier())
{
case SHIFT:
if (double_tap_lock_shift)
return key.withFlags(key.getFlags() | KeyValue.FLAG_LOCK);
}
break;
}
return key;
}
});
if (extra_keys.size() > 0)
kw = kw.addExtraKeys(extra_keys.iterator());
if (original_kw.num_pad && show_numpad)
kw = kw.addNumPad();
return kw;
} }
private float getDipPref(DisplayMetrics dm, SharedPreferences prefs, String pref_name, float def) private float getDipPref(DisplayMetrics dm, SharedPreferences prefs, String pref_name, float def)
@@ -230,7 +186,6 @@ final class Config
case "light": return R.style.Light; case "light": return R.style.Light;
case "black": return R.style.Black; case "black": return R.style.Black;
case "dark": return R.style.Dark; case "dark": return R.style.Dark;
case "white": return R.style.White;
default: default:
case "system": case "system":
if (Build.VERSION.SDK_INT >= 8) if (Build.VERSION.SDK_INT >= 8)
@@ -248,30 +203,26 @@ final class Config
switch (name) switch (name)
{ {
case "azerty": return R.xml.azerty; case "azerty": return R.xml.azerty;
case "bangla": return R.xml.bangla;
case "bgph1": return R.xml.local_bgph1; case "bgph1": return R.xml.local_bgph1;
case "bone": return R.xml.bone;
case "colemak": return R.xml.colemak;
case "dvorak": return R.xml.dvorak; case "dvorak": return R.xml.dvorak;
case "hindi": return R.xml.hindi;
case "jcuken_ua": return R.xml.jcuken_ua;
case "neo2": return R.xml.neo2;
case "qwerty": return R.xml.qwerty;
case "qwerty_el": return R.xml.qwerty_el;
case "qwerty_es": return R.xml.qwerty_es; case "qwerty_es": return R.xml.qwerty_es;
case "qwerty_hu": return R.xml.qwerty_hu;
case "qwerty_ko": return R.xml.qwerty_ko;
case "qwerty_lv": return R.xml.qwerty_lv; case "qwerty_lv": return R.xml.qwerty_lv;
case "qwerty_no": return R.xml.qwerty_no;
case "qwerty_pt": return R.xml.qwerty_pt; case "qwerty_pt": return R.xml.qwerty_pt;
case "qwerty": return R.xml.qwerty;
case "qwerty_sv_se": return R.xml.qwerty_sv_se; case "qwerty_sv_se": return R.xml.qwerty_sv_se;
case "qwerty_tr": return R.xml.qwerty_tr;
case "qwertz": return R.xml.qwertz; case "qwertz": return R.xml.qwertz;
case "qwertz_cs": return R.xml.qwertz_cs;
case "qwertz_de": return R.xml.qwertz_de;
case "qwertz_hu": return R.xml.qwertz_hu;
case "ru_jcuken": return R.xml.local_ru_jcuken; case "ru_jcuken": return R.xml.local_ru_jcuken;
default: return R.xml.qwerty; // The config might store an invalid layout, don't crash case "system": default: return -1;
}
}
public static int themeId_of_string(String name)
{
switch (name)
{
case "light": return R.style.Light;
case "black": return R.style.Black;
default: case "dark": return R.style.Dark;
} }
} }
@@ -289,6 +240,6 @@ final class Config
public static interface IKeyEventHandler public static interface IKeyEventHandler
{ {
public void handleKeyUp(KeyValue value, Pointers.Modifiers flags); public void handleKeyUp(KeyValue value, int flags);
} }
} }

View File

@@ -8,32 +8,19 @@ import java.io.BufferedReader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
public class Emoji public class Emoji extends KeyValue
{ {
private final String _name;
private final KeyValue _kv;
private final String _desc; private final String _desc;
private static HashMap<String, Emoji> emojis_by_name = new HashMap<String, Emoji>(); private static HashMap<String, Emoji> emojis_by_name = new HashMap<String, Emoji>();
protected Emoji(String name, String bytecode, String desc) protected Emoji(String name, String bytecode, String desc)
{ {
_name = name; super(name, bytecode, CHAR_NONE, EVENT_NONE, 0);
_kv = new KeyValue(bytecode, KeyValue.KIND_STRING, 0, 0);
_desc = desc; _desc = desc;
emojis_by_name.put(name, this); emojis_by_name.put(name, this);
} }
public String name()
{
return _name;
}
public KeyValue kv()
{
return _kv;
}
public String getDescription() public String getDescription()
{ {
return (_desc); return (_desc);

View File

@@ -55,7 +55,7 @@ public class EmojiGridView extends GridView
Config config = Config.globalConfig(); Config config = Config.globalConfig();
Integer used = _lastUsed.get(_emojiArray[pos]); Integer used = _lastUsed.get(_emojiArray[pos]);
_lastUsed.put(_emojiArray[pos], (used == null) ? 1 : used.intValue() + 1); _lastUsed.put(_emojiArray[pos], (used == null) ? 1 : used.intValue() + 1);
config.handler.handleKeyUp(_emojiArray[pos].kv(), Pointers.Modifiers.EMPTY); config.handler.handleKeyUp(_emojiArray[pos], 0);
saveLastUsed(); // TODO: opti saveLastUsed(); // TODO: opti
} }
@@ -88,7 +88,7 @@ public class EmojiGridView extends GridView
HashSet<String> set = new HashSet<String>(); HashSet<String> set = new HashSet<String>();
for (Emoji emoji : _lastUsed.keySet()) for (Emoji emoji : _lastUsed.keySet())
set.add(String.valueOf(_lastUsed.get(emoji)) + "-" + emoji.name()); set.add(String.valueOf(_lastUsed.get(emoji)) + "-" + emoji.name);
edit.putStringSet(LAST_USE_PREF, set); edit.putStringSet(LAST_USE_PREF, set);
edit.apply(); edit.apply();
} }
@@ -126,7 +126,7 @@ public class EmojiGridView extends GridView
public void setEmoji(Emoji emoji) public void setEmoji(Emoji emoji)
{ {
setText(emoji.kv().getString()); setText(emoji.symbol);
} }
} }

View File

@@ -15,7 +15,7 @@ public class EmojiGroupButtonsBar extends LinearLayout
for (int i = 0; i < Emoji.num_groups; i++) for (int i = 0; i < Emoji.num_groups; i++)
{ {
Emoji first = Emoji.getEmojisByGroup(i)[0]; Emoji first = Emoji.getEmojisByGroup(i)[0];
add_group(i, first.kv().getString()); add_group(i, first.symbol);
} }
} }

View File

@@ -14,16 +14,15 @@ public class EmojiKeyButton extends Button
{ {
super(context, attrs); super(context, attrs);
setOnClickListener(this); setOnClickListener(this);
String key_name = attrs.getAttributeValue(null, "key"); _key = KeyValue.getKeyByName(attrs.getAttributeValue(null, "key"));
_key = (key_name == null) ? null : KeyValue.getKeyByName(key_name); setText(_key.symbol);
setText(_key.getString()); if ((_key.flags & KeyValue.FLAG_KEY_FONT) != 0)
if (_key.hasFlags(KeyValue.FLAG_KEY_FONT)) setTypeface(Theme.getSpecialKeyFont(context));
setTypeface(Theme.getKeyFont(context));
} }
public void onClick(View v) public void onClick(View v)
{ {
Config config = Config.globalConfig(); Config config = Config.globalConfig();
config.handler.handleKeyUp(_key, Pointers.Modifiers.EMPTY); config.handler.handleKeyUp(_key, 0);
} }
} }

View File

@@ -1,93 +0,0 @@
package juloo.keyboard2;
import android.content.Context;
import android.content.res.TypedArray;
import android.content.SharedPreferences;
import android.preference.CheckBoxPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import java.util.HashSet;
import java.util.Set;
public class ExtraKeyCheckBoxPreference extends CheckBoxPreference
{
public static String[] extra_keys = new String[]
{
"alt",
"meta",
"accent_aigu",
"accent_grave",
"accent_double_aigu",
"accent_dot_above",
"accent_circonflexe",
"accent_tilde",
"accent_cedille",
"accent_trema",
"accent_ring",
"accent_caron",
"accent_macron",
"accent_ogonek",
"accent_breve",
"accent_slash",
"accent_bar",
"",
"ß",
"£",
"switch_greekmath",
"capslock",
};
public static boolean default_checked(String name)
{
switch (name)
{
default:
return false;
}
}
boolean _key_font;
public ExtraKeyCheckBoxPreference(Context context, AttributeSet attrs)
{
super(context, attrs);
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ExtraKeyCheckBoxPreference);
int index = a.getInteger(R.styleable.ExtraKeyCheckBoxPreference_index, 0);
a.recycle();
String key_name = extra_keys[index];
KeyValue kv = KeyValue.getKeyByName(key_name);
String title = kv.getString();
String descr = KeyValue.getKeyDescription(key_name);
if (descr != null)
title += " (" + descr + ")";
setKey(pref_key_of_key_name(key_name));
setDefaultValue(default_checked(key_name));
setTitle(title);
_key_font = kv.hasFlags(KeyValue.FLAG_KEY_FONT);
}
@Override
protected void onBindView(View view)
{
super.onBindView(view);
TextView title = (TextView)view.findViewById(android.R.id.title);
title.setTypeface(_key_font ? Theme.getKeyFont(getContext()) : null);
}
static String pref_key_of_key_name(String key_name)
{
return "extra_key_" + key_name;
}
public static Set<KeyValue> get_extra_keys(SharedPreferences prefs)
{
HashSet<KeyValue> ks = new HashSet<KeyValue>();
for (String key_name : extra_keys)
{
if (prefs.getBoolean(pref_key_of_key_name(key_name), default_checked(key_name)))
ks.add(KeyValue.getKeyByName(key_name));
}
return ks;
}
}

View File

@@ -11,38 +11,29 @@ class KeyEventHandler implements Config.IKeyEventHandler
_recv = recv; _recv = recv;
} }
public void handleKeyUp(KeyValue key, Pointers.Modifiers mods) public void handleKeyUp(KeyValue key, int flags)
{ {
if (key == null) key = KeyModifier.handleFlags(key, flags);
if (key == null || (key.flags & KeyValue.FLAG_NOCHAR) != 0)
return; return;
switch (key.getKind()) switch (key.eventCode)
{ {
case Char: case KeyValue.EVENT_CONFIG: _recv.showKeyboardConfig(); return;
_recv.commitChar(key.getChar()); case KeyValue.EVENT_SWITCH_TEXT: _recv.setLayout(-1); return;
break; case KeyValue.EVENT_SWITCH_NUMERIC: _recv.setLayout(R.xml.numeric); return;
case String: case KeyValue.EVENT_SWITCH_EMOJI: _recv.setPane_emoji(); return;
_recv.commitText(key.getString()); case KeyValue.EVENT_SWITCH_BACK_EMOJI: _recv.setPane_normal(); return;
break; case KeyValue.EVENT_CHANGE_METHOD: _recv.switchToNextInputMethod(); return;
case Event: case KeyValue.EVENT_ACTION: _recv.performAction(); return;
switch (key.getEvent()) default:
{ if ((flags & (KeyValue.FLAG_CTRL | KeyValue.FLAG_ALT | KeyValue.FLAG_META)) != 0)
case CONFIG: _recv.showKeyboardConfig(); break; handleKeyUpWithModifier(key, flags);
case SWITCH_TEXT: _recv.switchMain(); break; else if (key.char_ != KeyValue.CHAR_NONE)
case SWITCH_NUMERIC: _recv.switchNumeric(); break; _recv.commitChar(key.char_);
case SWITCH_EMOJI: _recv.setPane_emoji(); break; else if (key.eventCode != KeyValue.EVENT_NONE)
case SWITCH_BACK_EMOJI: _recv.setPane_normal(); break; handleKeyUpWithModifier(key, flags);
case CHANGE_METHOD: _recv.switchToNextInputMethod(); break; else
case ACTION: _recv.performAction(); break; _recv.commitText(key.symbol);
case SWITCH_PROGRAMMING: _recv.switchProgramming(); break;
case SWITCH_GREEKMATH: _recv.switchGreekmath(); break;
case CAPS_LOCK: _recv.enableCapsLock(); break;
}
break;
case Keyevent:
handleKeyUpWithModifier(key.getKeyevent(), mods);
break;
case Modifier:
break;
} }
} }
@@ -66,34 +57,31 @@ class KeyEventHandler implements Config.IKeyEventHandler
return updatedMetaState; return updatedMetaState;
} }
private int sendMetaKeyForModifier(KeyValue.Modifier mod, int metaState, boolean down) /* Send key events corresponding to pressed modifier keys. */
private int sendMetaKeys(int flags, int metaState, boolean down)
{ {
switch (mod) if ((flags & KeyValue.FLAG_CTRL) != 0)
{ metaState = sendMetaKey(KeyEvent.KEYCODE_CTRL_LEFT, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON, metaState, down);
case CTRL: if ((flags & KeyValue.FLAG_ALT) != 0)
return sendMetaKey(KeyEvent.KEYCODE_CTRL_LEFT, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON, metaState, down); metaState = sendMetaKey(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON, metaState, down);
case ALT: if ((flags & KeyValue.FLAG_SHIFT) != 0)
return sendMetaKey(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON, metaState, down); metaState = sendMetaKey(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON, metaState, down);
case SHIFT: if ((flags & KeyValue.FLAG_META) != 0)
return sendMetaKey(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON, metaState, down); metaState = sendMetaKey(KeyEvent.KEYCODE_META_LEFT, KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON, metaState, down);
case META: return metaState;
return sendMetaKey(KeyEvent.KEYCODE_META_LEFT, KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON, metaState, down);
default: return metaState;
}
} }
/* /*
* Don't set KeyEvent.FLAG_SOFT_KEYBOARD. * Don't set KeyEvent.FLAG_SOFT_KEYBOARD.
*/ */
private void handleKeyUpWithModifier(int keyCode, Pointers.Modifiers mods) private void handleKeyUpWithModifier(KeyValue key, int flags)
{ {
int metaState = 0; if (key.eventCode == KeyValue.EVENT_NONE)
for (int i = 0; i < mods.size(); i++) return ;
metaState = sendMetaKeyForModifier(mods.get(i), metaState, true); int metaState = sendMetaKeys(flags, 0, true);
_recv.sendKeyEvent(KeyEvent.ACTION_DOWN, keyCode, metaState); _recv.sendKeyEvent(KeyEvent.ACTION_DOWN, key.eventCode, metaState);
_recv.sendKeyEvent(KeyEvent.ACTION_UP, keyCode, metaState); _recv.sendKeyEvent(KeyEvent.ACTION_UP, key.eventCode, metaState);
for (int i = mods.size() - 1; i >= 0; i--) sendMetaKeys(flags, metaState, false);
metaState = sendMetaKeyForModifier(mods.get(i), metaState, false);
} }
public static interface IReceiver public static interface IReceiver
@@ -103,12 +91,9 @@ class KeyEventHandler implements Config.IKeyEventHandler
public void setPane_normal(); public void setPane_normal();
public void showKeyboardConfig(); public void showKeyboardConfig();
public void performAction(); public void performAction();
public void enableCapsLock();
public void switchMain(); /** 'res_id' is '-1' for the currently selected layout. */
public void switchNumeric(); public void setLayout(int res_id);
public void switchProgramming();
public void switchGreekmath();
public void sendKeyEvent(int eventAction, int eventCode, int meta); public void sendKeyEvent(int eventAction, int eventCode, int meta);

View File

@@ -1,389 +1,121 @@
package juloo.keyboard2; package juloo.keyboard2;
import android.util.SparseArray;
import android.view.KeyCharacterMap; import android.view.KeyCharacterMap;
import android.view.KeyEvent; import android.view.KeyEvent;
import java.util.HashMap; import java.util.HashMap;
class KeyModifier class KeyModifier
{ {
/** Cache key is KeyValue's name */ /* Cache key is KeyValue's name */
private static HashMap<KeyValue, HashMap<Pointers.Modifiers, KeyValue>> _cache = private static HashMap<String, SparseArray<KeyValue>> _cache =
new HashMap<KeyValue, HashMap<Pointers.Modifiers, KeyValue>>(); new HashMap<String, SparseArray<KeyValue>>();
/** Modify a key according to modifiers. */ /* Modify a key according to modifiers. */
public static KeyValue modify(KeyValue k, Pointers.Modifiers mods) public static KeyValue handleFlags(KeyValue k, int flags)
{ {
if (k == null) if (k == null || flags == 0) // No modifier
return null;
int n_mods = mods.size();
HashMap<Pointers.Modifiers, KeyValue> ks = cacheEntry(k);
KeyValue r = ks.get(mods);
if (r == null)
{
r = k;
/* Order: Fn, Shift, accents */
for (int i = 0; i < n_mods; i++)
r = modify(r, mods.get(i));
ks.put(mods, r);
}
/* Keys with an empty string are placeholder keys. */
return (r.getString().length() == 0) ? null : r;
}
public static KeyValue modify(KeyValue k, KeyValue.Modifier mod)
{
switch (mod)
{
case CTRL:
case ALT:
case META: return turn_into_keyevent(k);
case FN: return apply_fn(k);
case SHIFT: return apply_shift(k);
case GRAVE: return apply_dead_char(k, '\u02CB');
case AIGU: return apply_dead_char(k, '\u00B4');
case CIRCONFLEXE: return apply_dead_char(k, '\u02C6');
case TILDE: return apply_dead_char(k, '\u02DC');
case CEDILLE: return apply_dead_char(k, '\u00B8');
case TREMA: return apply_dead_char(k, '\u00A8');
case CARON: return apply_dead_char(k, '\u02C7');
case RING: return apply_dead_char(k, '\u02DA');
case MACRON: return apply_dead_char(k, '\u00AF');
case OGONEK: return apply_dead_char(k, '\u02DB');
case DOT_ABOVE: return apply_dead_char(k, '\u02D9');
case BREVE: return apply_dead_char(k, '\u02D8');
case DOUBLE_AIGU: return apply_map_char(k, map_char_double_aigu);
case ORDINAL: return apply_map_char(k, map_char_ordinal);
case SUPERSCRIPT: return apply_map_char(k, map_char_superscript);
case SUBSCRIPT: return apply_map_char(k, map_char_subscript);
case ARROWS: return apply_map_char(k, map_char_arrows);
case BOX: return apply_map_char(k, map_char_box);
case SLASH: return apply_map_char(k, map_char_slash);
case BAR: return apply_map_char(k, map_char_bar);
case ARROW_RIGHT: return apply_combining(k, "\u20D7");
default: return k;
}
}
private static KeyValue apply_map_char(KeyValue k, Map_char map)
{
switch (k.getKind())
{
case Char:
char kc = k.getChar();
char c = map.apply(kc);
return (kc == c) ? k : k.withChar(c);
default: return k;
}
}
private static KeyValue apply_dead_char(KeyValue k, char dead_char)
{
switch (k.getKind())
{
case Char:
char kc = k.getChar();
char c = (char)KeyCharacterMap.getDeadChar(dead_char, kc);
return (c == 0 || kc == c) ? k : k.withChar(c);
default: return k;
}
}
private static KeyValue apply_combining(KeyValue k, String combining)
{
switch (k.getKind())
{
case Char:
return k.withString(String.valueOf(k.getChar()) + combining);
default: return k;
}
}
private static KeyValue apply_shift(KeyValue k)
{
switch (k.getKind())
{
case Char:
char kc = k.getChar();
char c = map_char_shift(kc);
if (kc == c)
c = Character.toUpperCase(kc);
return (kc == c) ? k : k.withChar(c);
case String:
return k.withString(k.getString().toUpperCase());
default: return k;
}
}
private static KeyValue apply_fn(KeyValue k)
{
String name = null;
switch (k.getKind())
{
case Char: name = apply_fn_char(k.getChar()); break;
case Keyevent: name = apply_fn_keyevent(k.getKeyevent()); break;
case Event: name = apply_fn_event(k.getEvent()); break;
case String:
switch (k.getString())
{
case "":
if (k == KeyValue.getKeyByName("f11_placeholder"))
name = "f11";
else if (k == KeyValue.getKeyByName("f12_placeholder"))
name = "f12";
break;
}
break;
}
return (name == null) ? k : KeyValue.getKeyByName(name);
}
private static String apply_fn_keyevent(int code)
{
switch (code)
{
case KeyEvent.KEYCODE_DPAD_UP: return "page_up";
case KeyEvent.KEYCODE_DPAD_DOWN: return "page_down";
case KeyEvent.KEYCODE_DPAD_LEFT: return "home";
case KeyEvent.KEYCODE_DPAD_RIGHT: return "end";
case KeyEvent.KEYCODE_ESCAPE: return "insert";
case KeyEvent.KEYCODE_TAB: return "\\t";
default: return null;
}
}
private static String apply_fn_event(KeyValue.Event ev)
{
switch (ev)
{
case SWITCH_NUMERIC: return "switch_greekmath";
default: return null;
}
}
/** Return the name of modified key, or [null]. */
private static String apply_fn_char(char c)
{
switch (c)
{
case '1': return "f1";
case '2': return "f2";
case '3': return "f3";
case '4': return "f4";
case '5': return "f5";
case '6': return "f6";
case '7': return "f7";
case '8': return "f8";
case '9': return "f9";
case '0': return "f10";
case '<': return "«";
case '>': return "»";
case '{': return "";
case '}': return "";
case '[': return "";
case ']': return "";
case '(': return "";
case ')': return "";
case '\'': return "";
case '"': return "";
case '-': return "";
case '_': return "";
case '^': return "¬";
case '%': return "";
case '=': return "";
case 'u': return "µ";
case 'a': return "æ";
case 'o': return "œ";
case '*': return "°";
case '.': return "";
case ',': return "·";
case '!': return "¡";
case '?': return "¿";
// arrows
case '↖': return "";
case '↑': return "";
case '↗': return "";
case '←': return "";
case '→': return "";
case '↙': return "";
case '↓': return "";
case '↘': return "";
case '↔': return "";
case '↕': return "";
// Currency symbols
case 'e': return "";
case 'l': return "£";
case 'r': return "";
case 'y': return "¥";
case 'c': return "¢";
case 'p': return "";
case '€': case '£': return "removed"; // Avoid showing these twice
// alternating greek letters
case 'π': return "ϖ";
case 'θ': return "ϑ";
case 'Θ': return "ϴ";
case 'ε': return "ϵ";
case 'β': return "ϐ";
case 'ρ': return "ϱ";
case 'σ': return "ς";
case 'γ': return "ɣ";
case 'φ': return "ϕ";
case 'υ': return "ϒ";
case 'κ': return "ϰ";
// alternating math characters
case '': return "";
case '∩': return "";
case '∃': return "";
case '∈': return "";
case '∫': return "";
case 'Π': return "";
case 'Σ': return "";
case '': return "";
case '∧': return "";
case '⊷': return "";
case '⊂': return "";
case '⊃': return "";
case '±': return "";
// other
case ' ': return "nbsp";
default: return null;
}
}
private static KeyValue turn_into_keyevent(KeyValue k)
{
if (k.getKind() != KeyValue.Kind.Char)
return k; return k;
int e; SparseArray<KeyValue> ks = cacheEntry(k);
switch (k.getChar()) KeyValue r = ks.get(flags);
{ if (r != null) // Found in cache
case 'a': e = KeyEvent.KEYCODE_A; break; return r;
case 'b': e = KeyEvent.KEYCODE_B; break; r = k;
case 'c': e = KeyEvent.KEYCODE_C; break; r = handleFn(r, flags);
case 'd': e = KeyEvent.KEYCODE_D; break; if (r != null)
case 'e': e = KeyEvent.KEYCODE_E; break; r = handleShift(r, flags);
case 'f': e = KeyEvent.KEYCODE_F; break; if (r != null)
case 'g': e = KeyEvent.KEYCODE_G; break; r = handleAccents(r, flags);
case 'h': e = KeyEvent.KEYCODE_H; break; ks.put(flags, r);
case 'i': e = KeyEvent.KEYCODE_I; break; return r;
case 'j': e = KeyEvent.KEYCODE_J; break;
case 'k': e = KeyEvent.KEYCODE_K; break;
case 'l': e = KeyEvent.KEYCODE_L; break;
case 'm': e = KeyEvent.KEYCODE_M; break;
case 'n': e = KeyEvent.KEYCODE_N; break;
case 'o': e = KeyEvent.KEYCODE_O; break;
case 'p': e = KeyEvent.KEYCODE_P; break;
case 'q': e = KeyEvent.KEYCODE_Q; break;
case 'r': e = KeyEvent.KEYCODE_R; break;
case 's': e = KeyEvent.KEYCODE_S; break;
case 't': e = KeyEvent.KEYCODE_T; break;
case 'u': e = KeyEvent.KEYCODE_U; break;
case 'v': e = KeyEvent.KEYCODE_V; break;
case 'w': e = KeyEvent.KEYCODE_W; break;
case 'x': e = KeyEvent.KEYCODE_X; break;
case 'y': e = KeyEvent.KEYCODE_Y; break;
case 'z': e = KeyEvent.KEYCODE_Z; break;
case '0': e = KeyEvent.KEYCODE_0; break;
case '1': e = KeyEvent.KEYCODE_1; break;
case '2': e = KeyEvent.KEYCODE_2; break;
case '3': e = KeyEvent.KEYCODE_3; break;
case '4': e = KeyEvent.KEYCODE_4; break;
case '5': e = KeyEvent.KEYCODE_5; break;
case '6': e = KeyEvent.KEYCODE_6; break;
case '7': e = KeyEvent.KEYCODE_7; break;
case '8': e = KeyEvent.KEYCODE_8; break;
case '9': e = KeyEvent.KEYCODE_9; break;
case '`': e = KeyEvent.KEYCODE_GRAVE; break;
case '-': e = KeyEvent.KEYCODE_MINUS; break;
case '=': e = KeyEvent.KEYCODE_EQUALS; break;
case '[': e = KeyEvent.KEYCODE_LEFT_BRACKET; break;
case ']': e = KeyEvent.KEYCODE_RIGHT_BRACKET; break;
case '\\': e = KeyEvent.KEYCODE_BACKSLASH; break;
case ';': e = KeyEvent.KEYCODE_SEMICOLON; break;
case '\'': e = KeyEvent.KEYCODE_APOSTROPHE; break;
case '/': e = KeyEvent.KEYCODE_SLASH; break;
case '@': e = KeyEvent.KEYCODE_AT; break;
case '+': e = KeyEvent.KEYCODE_PLUS; break;
case ',': e = KeyEvent.KEYCODE_COMMA; break;
case '.': e = KeyEvent.KEYCODE_PERIOD; break;
case '*': e = KeyEvent.KEYCODE_STAR; break;
case '#': e = KeyEvent.KEYCODE_POUND; break;
case '(': e = KeyEvent.KEYCODE_NUMPAD_LEFT_PAREN; break;
case ')': e = KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN; break;
case ' ': e = KeyEvent.KEYCODE_SPACE; break;
default: return k;
}
return k.withKeyevent(e);
} }
/* Lookup the cache entry for a key. Create it needed. */ private static KeyValue handleAccents(KeyValue k, int flags)
private static HashMap<Pointers.Modifiers, KeyValue> cacheEntry(KeyValue k)
{ {
HashMap<Pointers.Modifiers, KeyValue> ks = _cache.get(k); if (k.char_ == KeyValue.CHAR_NONE || (flags & KeyValue.FLAGS_ACCENTS) == 0)
if (ks == null) return k;
{ char c = handleAccentChar(k.char_, flags);
ks = new HashMap<Pointers.Modifiers, KeyValue>(); if (c == 0 || c == k.char_)
_cache.put(k, ks); return k;
} return k.withCharAndSymbol(c);
return ks;
} }
private static abstract class Map_char private static KeyValue handleShift(KeyValue k, int flags)
{ {
public abstract char apply(char c); if ((flags & KeyValue.FLAG_SHIFT) == 0)
} return k;
char c = k.char_;
private static char map_char_shift(char c) if (k.char_ != KeyValue.CHAR_NONE)
{ c = Character.toUpperCase(c);
switch (c) if (c == k.char_) // More rules if toUpperCase() did nothing
{ switch (k.symbol)
case '↙': return '⇙';
case '↓': return '⇓';
case '↘': return '⇘';
case '←': return '⇐';
case '→': return '⇒';
case '↖': return '⇖';
case '↑': return '⇑';
case '↗': return '⇗';
case '└': return '╚';
case '┴': return '╩';
case '┘': return '╝';
case '├': return '╠';
case '┼': return '╬';
case '┤': return '╣';
case '┌': return '╔';
case '┬': return '╦';
case '┐': return '╗';
case '─': return '═';
case '│': return '║';
case 'ß': return 'ẞ';
/* In Turkish, upper case of 'iı' is 'İI' but Java's toUpperCase will
return 'II'. To make 'İ' accessible, make it the shift of 'ı'. This
has the inconvenient of swapping i and ı on the keyboard. */
case 'ı': return 'İ';
case '₹': return '₨';
default: return c;
}
}
private static final Map_char map_char_double_aigu =
new Map_char() {
public char apply(char c)
{ {
case "": c = '⇒'; break;
case "": c = '⇐'; break;
case "<": c = '«'; break;
case ">": c = '»'; break;
case "": c = '”'; break;
default: return k;
}
return k.withCharAndSymbol(c);
}
private static char handleAccentChar(char c, int flags)
{
switch ((flags & KeyValue.FLAGS_ACCENTS))
{
case KeyValue.FLAG_ACCENT1:
return (char)KeyCharacterMap.getDeadChar('\u02CB', c);
case KeyValue.FLAG_ACCENT2:
switch (c) switch (c)
{ {
// Composite characters: a̋ e̋ i̋ m̋ ӳ case '`': return '´';
case 'o': return 'ő'; case '<': return '';
case 'u': return 'ű'; case '>': return '';
case ' ': return '˝'; default: return (char)KeyCharacterMap.getDeadChar('\u00B4', c);
default: return c;
} }
} case KeyValue.FLAG_ACCENT3:
}; return (char)KeyCharacterMap.getDeadChar('\u02C6', c);
case KeyValue.FLAG_ACCENT4:
private static final Map_char map_char_ordinal = switch (c)
new Map_char() { {
public char apply(char c) case '?': return '¿';
{ case '!': return '¡';
default: return (char)KeyCharacterMap.getDeadChar('\u02DC', c);
}
case KeyValue.FLAG_ACCENT5:
switch (c)
{
case 'u': return 'µ';
case '"': return '„';
case '\'': return '';
case '-': return '¬';
case 'a': return 'æ';
case 'o': return 'œ';
default: return (char)KeyCharacterMap.getDeadChar('\u00B8', c);
}
case KeyValue.FLAG_ACCENT6:
switch (c)
{
case '-': return '÷';
default: return (char)KeyCharacterMap.getDeadChar('\u00A8', c);
}
case KeyValue.FLAG_ACCENT_CARON:
switch (c)
{
default: return (char)KeyCharacterMap.getDeadChar('\u02C7', c);
}
case KeyValue.FLAG_ACCENT_RING:
switch (c)
{
default: return (char)KeyCharacterMap.getDeadChar('\u02DA', c);
}
case KeyValue.FLAG_ACCENT_MACRON:
switch (c)
{
default: return (char)KeyCharacterMap.getDeadChar('\u00AF', c);
}
case KeyValue.FLAG_ACCENT_ORDINAL:
switch (c) switch (c)
{ {
case 'a': return 'ª'; case 'a': return 'ª';
@@ -400,13 +132,7 @@ class KeyModifier
case '*': return '°'; case '*': return '°';
default: return c; default: return c;
} }
} case KeyValue.FLAG_ACCENT_SUPERSCRIPT:
};
private static final Map_char map_char_superscript =
new Map_char() {
public char apply(char c)
{
switch (c) switch (c)
{ {
case '1': return '¹'; case '1': return '¹';
@@ -428,13 +154,7 @@ class KeyModifier
case 'n': return 'ⁿ'; case 'n': return 'ⁿ';
default: return c; default: return c;
} }
} case KeyValue.FLAG_ACCENT_SUBSCRIPT:
};
private static final Map_char map_char_subscript =
new Map_char() {
public char apply(char c)
{
switch (c) switch (c)
{ {
case '1': return '₁'; case '1': return '₁';
@@ -458,97 +178,56 @@ class KeyModifier
case 'o': return 'ₒ'; case 'o': return 'ₒ';
default: return c; default: return c;
} }
} default: return c; // Can't happen
}; }
}
private static final Map_char map_char_arrows = private static KeyValue handleFn(KeyValue k, int flags)
new Map_char() { {
public char apply(char c) if ((flags & KeyValue.FLAG_FN) == 0)
{ return k;
switch (c) String name;
{ switch (k.name)
case '1': return '↙'; {
case '2': return '↓'; case "1": name = "f1"; break;
case '3': return '↘'; case "2": name = "f2"; break;
case '4': return '←'; case "3": name = "f3"; break;
case '6': return '→'; case "4": name = "f4"; break;
case '7': return '↖'; case "5": name = "f5"; break;
case '8': return '↑'; case "6": name = "f6"; break;
case '9': return '↗'; case "7": name = "f7"; break;
default: return c; case "8": name = "f8"; break;
} case "9": name = "f9"; break;
} case "0": name = "f10"; break;
}; case "up": name = "page_up"; break;
case "down": name = "page_down"; break;
case "left": name = "home"; break;
case "right": name = "end"; break;
case ">": name = ""; break;
case "<": name = ""; break;
case "\"": name = ""; break;
case "-": name = ""; break;
case "_": name = ""; break;
case "esc": name = "insert"; break;
case "$": name = ""; break;
case "#": name = "£"; break;
case "*": name = "°"; break;
case "tab": name = "\\t"; break;
case "": case "£": return null; // Avoid showing these twice
default: return k;
}
return KeyValue.getKeyByName(name);
}
private static final Map_char map_char_box = /* Lookup the cache entry for a key. Create it needed. */
new Map_char() { private static SparseArray<KeyValue> cacheEntry(KeyValue k)
public char apply(char c) {
{ SparseArray<KeyValue> ks = _cache.get(k.name);
switch (c) if (ks == null)
{ {
case '1': return '└'; ks = new SparseArray<KeyValue>();
case '2': return '┴'; _cache.put(k.name, ks);
case '3': return '┘'; }
case '4': return '├'; return ks;
case '5': return '┼'; }
case '6': return '┤';
case '7': return '┌';
case '8': return '┬';
case '9': return '┐';
case '0': return '─';
case '.': return '│';
default: return c;
}
}
};
private static final Map_char map_char_slash =
new Map_char() {
public char apply(char c)
{
switch (c)
{
case 'a': return 'ⱥ';
case 'b': return '␢';
case 'c': return 'ȼ';
case 'e': return 'ɇ';
case 'g': return 'ꞡ';
case 'k': return 'ꝃ';
case 'l': return 'ł';
case 'n': return 'ꞥ';
case 'o': return 'ø';
case 'r': return 'ꞧ';
case 's': return 'ꞩ';
case 't': return 'ⱦ';
default: return c;
}
}
};
private static final Map_char map_char_bar =
new Map_char() {
public char apply(char c)
{
switch (c)
{
case 'b': return 'ƀ';
case 'c': return 'ꞓ';
case 'd': return 'đ';
case 'g': return 'ǥ';
case 'i': return 'ɨ';
case 'j': return 'ɉ';
case 'k': return 'ꝁ';
case 'l': return 'ƚ';
case 'o': return 'ɵ';
case 'p': return 'ᵽ';
case 'q': return 'ꝗ';
case 'r': return 'ɍ';
case 't': return 'ŧ';
case 'u': return 'ʉ';
case 'y': return 'ɏ';
case 'z': return 'ƶ';
default: return c;
}
}
};
} }

View File

@@ -4,369 +4,264 @@ import android.view.KeyCharacterMap;
import android.view.KeyEvent; import android.view.KeyEvent;
import java.util.HashMap; import java.util.HashMap;
final class KeyValue class KeyValue
{ {
public static enum Event public static final int EVENT_NONE = -1;
{ public static final int EVENT_CONFIG = -2;
CONFIG, public static final int EVENT_SWITCH_TEXT = -3;
SWITCH_TEXT, public static final int EVENT_SWITCH_NUMERIC = -4;
SWITCH_NUMERIC, public static final int EVENT_SWITCH_EMOJI = -5;
SWITCH_EMOJI, public static final int EVENT_SWITCH_BACK_EMOJI = -6;
SWITCH_BACK_EMOJI, public static final int EVENT_CHANGE_METHOD = -7;
CHANGE_METHOD, public static final int EVENT_ACTION = -8;
ACTION, public static final char CHAR_NONE = '\0';
SWITCH_PROGRAMMING,
SWITCH_GREEKMATH,
CAPS_LOCK,
}
// Must be evaluated in the reverse order of their values. // Behavior flags
public static enum Modifier public static final int FLAG_LATCH = 1;
{ public static final int FLAG_LOCK = (1 << 1);
SHIFT, public static final int FLAG_NOREPEAT = (1 << 2);
CTRL, public static final int FLAG_NOCHAR = (1 << 3);
ALT, public static final int FLAG_PRECISE_REPEAT = (1 << 4);
META,
DOUBLE_AIGU,
DOT_ABOVE,
GRAVE,
AIGU,
CIRCONFLEXE,
TILDE,
CEDILLE,
TREMA,
SUPERSCRIPT,
SUBSCRIPT,
RING,
CARON,
MACRON,
ORDINAL,
ARROWS,
BOX,
OGONEK,
SLASH,
ARROW_RIGHT,
BREVE,
BAR,
FN, // Must be placed last to be applied first
}
// Behavior flags. // Rendering flags
public static final int FLAG_LATCH = (1 << 20); public static final int FLAG_KEY_FONT = (1 << 5);
public static final int FLAG_LOCK = (1 << 21); public static final int FLAG_SMALLER_FONT = (1 << 6);
// Special keys are not repeated and don't clear latched modifiers.
public static final int FLAG_SPECIAL = (1 << 22);
public static final int FLAG_PRECISE_REPEAT = (1 << 23);
// Rendering flags.
public static final int FLAG_KEY_FONT = (1 << 24);
public static final int FLAG_SMALLER_FONT = (1 << 25);
// Used by [Pointers].
public static final int FLAG_LOCKED = (1 << 26);
public static final int FLAG_FAKE_PTR = (1 << 27);
// Kinds // Internal flags
public static final int KIND_CHAR = (0 << 29); public static final int FLAG_LOCKED = (1 << 8);
public static final int KIND_STRING = (1 << 29);
public static final int KIND_KEYEVENT = (2 << 29);
public static final int KIND_EVENT = (3 << 29);
public static final int KIND_MODIFIER = (4 << 29);
// Ranges for the different components // Modifier flags
private static final int FLAGS_BITS = (0b111111111 << 20); // 9 bits wide public static final int FLAG_CTRL = (1 << 10);
private static final int KIND_BITS = (0b111 << 29); // 3 bits wide public static final int FLAG_SHIFT = (1 << 11);
private static final int VALUE_BITS = ~(FLAGS_BITS | KIND_BITS); // 20 bits wide public static final int FLAG_ALT = (1 << 12);
static public static final int FLAG_FN = (1 << 13);
{ public static final int FLAG_META = (1 << 14);
check((FLAGS_BITS & KIND_BITS) == 0); // No overlap
check((FLAGS_BITS | KIND_BITS | VALUE_BITS) == ~0); // No holes
}
private final String _symbol; // Accent flags
public static final int FLAG_ACCENT1 = (1 << 16); // Grave
public static final int FLAG_ACCENT2 = (1 << 17); // Aigu
public static final int FLAG_ACCENT3 = (1 << 18); // Circonflexe
public static final int FLAG_ACCENT4 = (1 << 19); // Tilde
public static final int FLAG_ACCENT5 = (1 << 20); // Cédille
public static final int FLAG_ACCENT6 = (1 << 21); // Tréma
public static final int FLAG_ACCENT_SUPERSCRIPT = (1 << 22);
public static final int FLAG_ACCENT_SUBSCRIPT = (1 << 23);
public static final int FLAG_ACCENT_RING = (1 << 24);
public static final int FLAG_ACCENT_CARON = (1 << 26);
public static final int FLAG_ACCENT_MACRON = (1 << 27);
public static final int FLAG_ACCENT_ORDINAL = (1 << 28);
/** This field encodes three things: public static final int FLAGS_ACCENTS = FLAG_ACCENT1 | FLAG_ACCENT2 |
- The kind FLAG_ACCENT3 | FLAG_ACCENT4 | FLAG_ACCENT5 | FLAG_ACCENT6 |
- The flags FLAG_ACCENT_CARON | FLAG_ACCENT_MACRON | FLAG_ACCENT_SUPERSCRIPT |
- The value for Char, Event and Modifier keys. FLAG_ACCENT_SUBSCRIPT | FLAG_ACCENT_ORDINAL | FLAG_ACCENT_RING;
*/
private final int _code;
public static enum Kind // Language specific keys that are removed from the keyboard by default
{ public static final int FLAG_LOCALIZED = (1 << 25);
Char, String, Keyevent, Event, Modifier
}
public Kind getKind() public final String name;
{ public final String symbol;
switch (_code & KIND_BITS) public final char char_;
{ public final int eventCode;
case KIND_CHAR: return Kind.Char; public final int flags;
case KIND_STRING: return Kind.String;
case KIND_KEYEVENT: return Kind.Keyevent;
case KIND_EVENT: return Kind.Event;
case KIND_MODIFIER: return Kind.Modifier;
default: throw new RuntimeException("Corrupted kind flags");
}
}
public int getFlags()
{
return (_code & FLAGS_BITS);
}
public boolean hasFlags(int has)
{
return ((_code & has) == has);
}
/** The string to render on the keyboard.
When [getKind() == Kind.String], also the string to send. */
public String getString()
{
return _symbol;
}
/** Defined only when [getKind() == Kind.Char]. */
public char getChar()
{
return (char)(_code & VALUE_BITS);
}
/** Defined only when [getKind() == Kind.Keyevent]. */
public int getKeyevent()
{
return (_code & VALUE_BITS);
}
/** Defined only when [getKind() == Kind.Event]. */
public Event getEvent()
{
return Event.values()[(_code & VALUE_BITS)];
}
/** Defined only when [getKind() == Kind.Modifier]. */
public Modifier getModifier()
{
return Modifier.values()[(_code & VALUE_BITS)];
}
/* Update the char and the symbol. */ /* Update the char and the symbol. */
public KeyValue withChar(char c) public KeyValue withCharAndSymbol(char c)
{ {
return new KeyValue(String.valueOf(c), KIND_CHAR, c, getFlags()); return withCharAndSymbol(String.valueOf(c), c);
} }
public KeyValue withString(String s) public KeyValue withCharAndSymbol(String s, char c)
{ {
return new KeyValue(s, KIND_STRING, 0, getFlags()); return new KeyValue(name, s, c, eventCode, flags);
} }
public KeyValue withSymbol(String s) public KeyValue withNameAndSymbol(String n, String s)
{ {
return new KeyValue(s, (_code & KIND_BITS), (_code & VALUE_BITS), getFlags()); return new KeyValue(n, s, char_, eventCode, flags);
}
public KeyValue withKeyevent(int code)
{
return new KeyValue(_symbol, KIND_KEYEVENT, code, getFlags());
} }
public KeyValue withFlags(int f) public KeyValue withFlags(int f)
{ {
return new KeyValue(_symbol, (_code & KIND_BITS), (_code & VALUE_BITS), f); return new KeyValue(name, symbol, char_, eventCode, f);
}
@Override
public boolean equals(Object obj)
{
KeyValue snd = (KeyValue)obj;
return _symbol.equals(snd._symbol) && _code == snd._code;
}
@Override
public int hashCode()
{
return _symbol.hashCode() + _code;
} }
private static HashMap<String, KeyValue> keys = new HashMap<String, KeyValue>(); private static HashMap<String, KeyValue> keys = new HashMap<String, KeyValue>();
public KeyValue(String s, int kind, int value, int flags) public KeyValue(String n, String s, char c, int e, int f)
{ {
check((kind & ~KIND_BITS) == 0); name = n;
check((flags & ~FLAGS_BITS) == 0); symbol = s;
check((value & ~VALUE_BITS) == 0); char_ = c;
_symbol = s; eventCode = e;
_code = kind | flags | value; flags = f;
} }
public static KeyValue getKeyByName(String name) public static KeyValue getKeyByName(String name)
{ {
KeyValue kv = keys.get(name); if (name == null)
return null;
KeyValue kv = KeyValue.keys.get(name);
if (kv != null) if (kv != null)
return kv; return kv;
if (name.length() == 1) char c = (name.length() == 1) ? name.charAt(0) : CHAR_NONE;
return new KeyValue(name, KIND_CHAR, name.charAt(0), 0); return new KeyValue(name, name, c, EVENT_NONE, 0);
else
return new KeyValue(name, KIND_STRING, 0, 0);
} }
private static void addKey(String name, String symbol, int kind, int code, int flags) private static void addKey(String name, String symbol, char c, int event, int flags)
{ {
keys.put(name, new KeyValue(symbol, kind, code, flags)); keys.put(name, new KeyValue(name, symbol, c, event, flags));
} }
private static void addCharKey(String name, String symbol, char c, int flags) private static void addCharKey(char c, int event, int flags)
{ {
addKey(name, symbol, KIND_CHAR, c, flags); String name = String.valueOf(c);
addKey(name, name, c, event, flags);
} }
private static void addModifierKey(String name, String symbol, Modifier m, int flags) private static void addCharKey(char c, int event)
{ {
if (symbol.length() > 1) addCharKey(c, event, 0);
flags |= FLAG_SMALLER_FONT;
addKey(name, symbol, KIND_MODIFIER, m.ordinal(),
FLAG_LATCH | FLAG_SPECIAL | flags);
} }
private static void addModifierKey(String name, int symbol, Modifier m, int flags) private static void addModifierKey(String name, String symbol, int extra_flags)
{ {
addModifierKey(name, String.valueOf((char)symbol), m, flags | FLAG_KEY_FONT); addKey(name, symbol, CHAR_NONE, EVENT_NONE,
FLAG_LATCH | FLAG_NOCHAR | FLAG_NOREPEAT | extra_flags);
} }
private static void addDiacritic(String name, int symbol, Modifier m) private static void addSpecialKey(String name, String symbol, int event)
{ {
addModifierKey(name, symbol, m, 0); addSpecialKey(name, symbol, event, 0);
} }
private static void addEventKey(String name, String symbol, Event e, int flags) private static void addSpecialKey(String name, String symbol, int event, int flags)
{ {
addKey(name, symbol, KIND_EVENT, e.ordinal(), flags | FLAG_SPECIAL); addKey(name, symbol, CHAR_NONE, event, flags | FLAG_NOREPEAT);
} }
private static void addEventKey(String name, int symbol, Event e, int flags) private static void addEventKey(String name, String symbol, int event)
{ {
addEventKey(name, String.valueOf((char)symbol), e, flags | FLAG_KEY_FONT); addEventKey(name, symbol, event, 0);
} }
private static void addKeyeventKey(String name, String symbol, int code, int flags) private static void addEventKey(String name, String symbol, int event, int flags)
{ {
addKey(name, symbol, KIND_KEYEVENT, code, flags); addKey(name, symbol, CHAR_NONE, event, flags);
}
private static void addKeyeventKey(String name, int symbol, int code, int flags)
{
addKeyeventKey(name, String.valueOf((char)symbol), code, flags | FLAG_KEY_FONT);
}
// Within VALUE_BITS
private static int placeholder_unique_id = 0;
/** Use a unique id as the value because the symbol is shared between every
placeholders (it is the empty string). */
private static void addPlaceholderKey(String name)
{
addKey(name, "", KIND_STRING, placeholder_unique_id++, 0);
} }
static static
{ {
addModifierKey("shift", 0x0A, Modifier.SHIFT, 0); addModifierKey("shift", "\uE808",
addModifierKey("ctrl", "Ctrl", Modifier.CTRL, 0); FLAG_SHIFT | FLAG_KEY_FONT | FLAG_SMALLER_FONT);
addModifierKey("alt", "Alt", Modifier.ALT, 0); addModifierKey("ctrl", "Ctrl", FLAG_CTRL | FLAG_SMALLER_FONT);
addDiacritic("accent_aigu", 0x50, Modifier.AIGU); addModifierKey("alt", "Alt", FLAG_ALT | FLAG_SMALLER_FONT);
addDiacritic("accent_caron", 0x51, Modifier.CARON); addModifierKey("accent_aigu", "◌́", FLAG_ACCENT2 | FLAG_LOCALIZED);
addDiacritic("accent_cedille", 0x52, Modifier.CEDILLE); addModifierKey("accent_caron", "◌̌", FLAG_ACCENT_CARON | FLAG_LOCALIZED);
addDiacritic("accent_circonflexe", 0x53, Modifier.CIRCONFLEXE); addModifierKey("accent_cedille", "◌̧", FLAG_ACCENT5 | FLAG_LOCALIZED);
addDiacritic("accent_grave", 0x54, Modifier.GRAVE); addModifierKey("accent_circonflexe", "◌̂", FLAG_ACCENT3 | FLAG_LOCALIZED);
addDiacritic("accent_macron", 0x55, Modifier.MACRON); addModifierKey("accent_grave", "◌̀", FLAG_ACCENT1 | FLAG_LOCALIZED);
addDiacritic("accent_ring", 0x56, Modifier.RING); addModifierKey("accent_macron", "◌̄", FLAG_ACCENT_MACRON | FLAG_LOCALIZED);
addDiacritic("accent_tilde", 0x57, Modifier.TILDE); addModifierKey("accent_tilde", "◌̃", FLAG_ACCENT4 | FLAG_LOCALIZED);
addDiacritic("accent_trema", 0x58, Modifier.TREMA); addModifierKey("accent_trema", "◌̈", FLAG_ACCENT6 | FLAG_LOCALIZED);
addDiacritic("accent_ogonek", 0x59, Modifier.OGONEK); addModifierKey("accent_ring", "◌̊", FLAG_ACCENT_RING | FLAG_LOCALIZED);
addDiacritic("accent_dot_above", 0x5A, Modifier.DOT_ABOVE); addModifierKey("superscript", "Sup", FLAG_ACCENT_SUPERSCRIPT | FLAG_SMALLER_FONT);
addDiacritic("accent_double_aigu", 0x5B, Modifier.DOUBLE_AIGU); addModifierKey("subscript", "Sub", FLAG_ACCENT_SUBSCRIPT | FLAG_SMALLER_FONT);
addDiacritic("accent_slash", 0x5C, Modifier.SLASH); addModifierKey("ordinal", "Ord", FLAG_ACCENT_ORDINAL | FLAG_SMALLER_FONT);
addDiacritic("accent_arrow_right", 0x5D, Modifier.ARROW_RIGHT); addModifierKey("fn", "Fn", FLAG_FN | FLAG_SMALLER_FONT);
addDiacritic("accent_breve", 0x5E, Modifier.BREVE); addModifierKey("meta", "", FLAG_META);
addDiacritic("accent_bar", 0x5F, Modifier.BAR);
addModifierKey("superscript", "Sup", Modifier.SUPERSCRIPT, 0);
addModifierKey("subscript", "Sub", Modifier.SUBSCRIPT, 0);
addModifierKey("ordinal", "Ord", Modifier.ORDINAL, 0);
addModifierKey("arrows", "Arr", Modifier.ARROWS, 0);
addModifierKey("box", "Box", Modifier.BOX, 0);
addModifierKey("fn", "Fn", Modifier.FN, 0);
addModifierKey("meta", "Meta", Modifier.META, 0);
addEventKey("config", 0x04, Event.CONFIG, FLAG_SMALLER_FONT); addCharKey('a', KeyEvent.KEYCODE_A);
addEventKey("switch_text", "ABC", Event.SWITCH_TEXT, FLAG_SMALLER_FONT); addCharKey('b', KeyEvent.KEYCODE_B);
addEventKey("switch_numeric", "123+", Event.SWITCH_NUMERIC, FLAG_SMALLER_FONT); addCharKey('c', KeyEvent.KEYCODE_C);
addEventKey("switch_emoji", 0x01, Event.SWITCH_EMOJI, FLAG_SMALLER_FONT); addCharKey('d', KeyEvent.KEYCODE_D);
addEventKey("switch_back_emoji", "ABC", Event.SWITCH_BACK_EMOJI, 0); addCharKey('e', KeyEvent.KEYCODE_E);
addEventKey("switch_programming", "Prog", Event.SWITCH_PROGRAMMING, FLAG_SMALLER_FONT); addCharKey('f', KeyEvent.KEYCODE_F);
addEventKey("switch_greekmath", "πλ∇¬", Event.SWITCH_GREEKMATH, FLAG_SMALLER_FONT); addCharKey('g', KeyEvent.KEYCODE_G);
addEventKey("change_method", 0x09, Event.CHANGE_METHOD, FLAG_SMALLER_FONT); addCharKey('h', KeyEvent.KEYCODE_H);
addEventKey("action", "Action", Event.ACTION, FLAG_SMALLER_FONT); // Will always be replaced addCharKey('i', KeyEvent.KEYCODE_I);
addEventKey("capslock", 0x12, Event.CAPS_LOCK, 0); addCharKey('j', KeyEvent.KEYCODE_J);
addCharKey('k', KeyEvent.KEYCODE_K);
addCharKey('l', KeyEvent.KEYCODE_L);
addCharKey('m', KeyEvent.KEYCODE_M);
addCharKey('n', KeyEvent.KEYCODE_N);
addCharKey('o', KeyEvent.KEYCODE_O);
addCharKey('p', KeyEvent.KEYCODE_P);
addCharKey('q', KeyEvent.KEYCODE_Q);
addCharKey('r', KeyEvent.KEYCODE_R);
addCharKey('s', KeyEvent.KEYCODE_S);
addCharKey('t', KeyEvent.KEYCODE_T);
addCharKey('u', KeyEvent.KEYCODE_U);
addCharKey('v', KeyEvent.KEYCODE_V);
addCharKey('w', KeyEvent.KEYCODE_W);
addCharKey('x', KeyEvent.KEYCODE_X);
addCharKey('y', KeyEvent.KEYCODE_Y);
addCharKey('z', KeyEvent.KEYCODE_Z);
addCharKey('0', KeyEvent.KEYCODE_0);
addCharKey('1', KeyEvent.KEYCODE_1);
addCharKey('2', KeyEvent.KEYCODE_2);
addCharKey('3', KeyEvent.KEYCODE_3);
addCharKey('4', KeyEvent.KEYCODE_4);
addCharKey('5', KeyEvent.KEYCODE_5);
addCharKey('6', KeyEvent.KEYCODE_6);
addCharKey('7', KeyEvent.KEYCODE_7);
addCharKey('8', KeyEvent.KEYCODE_8);
addCharKey('9', KeyEvent.KEYCODE_9);
addCharKey('`', KeyEvent.KEYCODE_GRAVE);
addCharKey('-', KeyEvent.KEYCODE_MINUS);
addCharKey('=', KeyEvent.KEYCODE_EQUALS);
addCharKey('[', KeyEvent.KEYCODE_LEFT_BRACKET);
addCharKey(']', KeyEvent.KEYCODE_RIGHT_BRACKET);
addCharKey('\\', KeyEvent.KEYCODE_BACKSLASH);
addCharKey(';', KeyEvent.KEYCODE_SEMICOLON);
addCharKey('\'', KeyEvent.KEYCODE_APOSTROPHE);
addCharKey('/', KeyEvent.KEYCODE_SLASH);
addCharKey('@', KeyEvent.KEYCODE_AT);
addCharKey('+', KeyEvent.KEYCODE_PLUS);
addCharKey(',', KeyEvent.KEYCODE_COMMA);
addCharKey('.', KeyEvent.KEYCODE_PERIOD);
addCharKey('*', KeyEvent.KEYCODE_STAR);
addCharKey('#', KeyEvent.KEYCODE_POUND);
addCharKey('(', KeyEvent.KEYCODE_NUMPAD_LEFT_PAREN);
addCharKey(')', KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN);
addCharKey('ß', EVENT_NONE, FLAG_LOCALIZED);
addCharKey('€', EVENT_NONE, FLAG_LOCALIZED);
addCharKey('£', EVENT_NONE, FLAG_LOCALIZED);
addKeyeventKey("esc", "Esc", KeyEvent.KEYCODE_ESCAPE, FLAG_SMALLER_FONT); addSpecialKey("config", "\uE806", EVENT_CONFIG, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
addKeyeventKey("enter", 0x0E, KeyEvent.KEYCODE_ENTER, 0); addSpecialKey("switch_text", "ABC", EVENT_SWITCH_TEXT);
addKeyeventKey("up", 0x05, KeyEvent.KEYCODE_DPAD_UP, FLAG_PRECISE_REPEAT); addSpecialKey("switch_numeric", "123+", EVENT_SWITCH_NUMERIC);
addKeyeventKey("right", 0x06, KeyEvent.KEYCODE_DPAD_RIGHT, FLAG_PRECISE_REPEAT); addSpecialKey("switch_emoji", "\uE812" , EVENT_SWITCH_EMOJI, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
addKeyeventKey("down", 0x07, KeyEvent.KEYCODE_DPAD_DOWN, FLAG_PRECISE_REPEAT); addSpecialKey("switch_back_emoji", "ABC", EVENT_SWITCH_BACK_EMOJI);
addKeyeventKey("left", 0x08, KeyEvent.KEYCODE_DPAD_LEFT, FLAG_PRECISE_REPEAT); addSpecialKey("change_method", "\ue807", EVENT_CHANGE_METHOD, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
addKeyeventKey("page_up", 0x02, KeyEvent.KEYCODE_PAGE_UP, 0); addSpecialKey("action", "Action", EVENT_ACTION, FLAG_SMALLER_FONT); // Will always be replaced
addKeyeventKey("page_down", 0x03, KeyEvent.KEYCODE_PAGE_DOWN, 0);
addKeyeventKey("home", 0x0B, KeyEvent.KEYCODE_MOVE_HOME, 0);
addKeyeventKey("end", 0x0C, KeyEvent.KEYCODE_MOVE_END, 0);
addKeyeventKey("backspace", 0x11, KeyEvent.KEYCODE_DEL, 0);
addKeyeventKey("delete", 0x10, KeyEvent.KEYCODE_FORWARD_DEL, 0);
addKeyeventKey("insert", "Ins", KeyEvent.KEYCODE_INSERT, FLAG_SMALLER_FONT);
addKeyeventKey("f1", "F1", KeyEvent.KEYCODE_F1, 0);
addKeyeventKey("f2", "F2", KeyEvent.KEYCODE_F2, 0);
addKeyeventKey("f3", "F3", KeyEvent.KEYCODE_F3, 0);
addKeyeventKey("f4", "F4", KeyEvent.KEYCODE_F4, 0);
addKeyeventKey("f5", "F5", KeyEvent.KEYCODE_F5, 0);
addKeyeventKey("f6", "F6", KeyEvent.KEYCODE_F6, 0);
addKeyeventKey("f7", "F7", KeyEvent.KEYCODE_F7, 0);
addKeyeventKey("f8", "F8", KeyEvent.KEYCODE_F8, 0);
addKeyeventKey("f9", "F9", KeyEvent.KEYCODE_F9, 0);
addKeyeventKey("f10", "F10", KeyEvent.KEYCODE_F10, 0);
addKeyeventKey("f11", "F11", KeyEvent.KEYCODE_F11, FLAG_SMALLER_FONT);
addKeyeventKey("f12", "F12", KeyEvent.KEYCODE_F12, FLAG_SMALLER_FONT);
addKeyeventKey("tab", 0x0F, KeyEvent.KEYCODE_TAB, FLAG_SMALLER_FONT);
addCharKey("\\t", "\\t", '\t', 0); // Send the tab character addEventKey("esc", "Esc", KeyEvent.KEYCODE_ESCAPE, FLAG_SMALLER_FONT);
addCharKey("space", "\r", ' ', FLAG_KEY_FONT); addEventKey("enter", "\ue800", KeyEvent.KEYCODE_ENTER, FLAG_KEY_FONT);
addCharKey("nbsp", "\u237d", '\u00a0', FLAG_SMALLER_FONT); addEventKey("up", "\uE80B", KeyEvent.KEYCODE_DPAD_UP, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
addEventKey("right", "\uE80C", KeyEvent.KEYCODE_DPAD_RIGHT, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
addEventKey("down", "\uE809", KeyEvent.KEYCODE_DPAD_DOWN, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
addEventKey("left", "\uE80A", KeyEvent.KEYCODE_DPAD_LEFT, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
addEventKey("page_up", "\uE810", KeyEvent.KEYCODE_PAGE_UP, FLAG_KEY_FONT);
addEventKey("page_down", "\uE811", KeyEvent.KEYCODE_PAGE_DOWN, FLAG_KEY_FONT);
addEventKey("home", "\uE80E", KeyEvent.KEYCODE_MOVE_HOME, FLAG_KEY_FONT);
addEventKey("end", "\uE80F", KeyEvent.KEYCODE_MOVE_END, FLAG_KEY_FONT);
addEventKey("backspace", "", KeyEvent.KEYCODE_DEL, FLAG_SMALLER_FONT);
addEventKey("delete", "", KeyEvent.KEYCODE_FORWARD_DEL, FLAG_SMALLER_FONT);
addEventKey("insert", "Ins", KeyEvent.KEYCODE_INSERT, FLAG_SMALLER_FONT);
addEventKey("f1", "F1", KeyEvent.KEYCODE_F1);
addEventKey("f2", "F2", KeyEvent.KEYCODE_F2);
addEventKey("f3", "F3", KeyEvent.KEYCODE_F3);
addEventKey("f4", "F4", KeyEvent.KEYCODE_F4);
addEventKey("f5", "F5", KeyEvent.KEYCODE_F5);
addEventKey("f6", "F6", KeyEvent.KEYCODE_F6);
addEventKey("f7", "F7", KeyEvent.KEYCODE_F7);
addEventKey("f8", "F8", KeyEvent.KEYCODE_F8);
addEventKey("f9", "F9", KeyEvent.KEYCODE_F9);
addEventKey("f10", "F10", KeyEvent.KEYCODE_F10);
addEventKey("tab", "", KeyEvent.KEYCODE_TAB);
addPlaceholderKey("removed"); addKey("\\t", "\\t", '\t', EVENT_NONE, 0); // Send the tab character
addPlaceholderKey("f11_placeholder"); addKey("space", "\ue80d", ' ', KeyEvent.KEYCODE_SPACE, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
addPlaceholderKey("f12_placeholder");
}
static final HashMap<String, String> keys_descr = new HashMap<String, String>();
/* Some keys have a description attached. Return [null] if otherwise. */
public static String getKeyDescription(String name)
{
return keys_descr.get(name);
}
static void addKeyDescr(String name, String descr)
{
keys_descr.put(name, descr);
}
static {
/* Keys description is shown in the settings. */
addKeyDescr("capslock", "Caps lock");
addKeyDescr("switch_greekmath", "Greek & math symbols");
}
// Substitute for [assert], which has no effect on Android.
private static void check(boolean b)
{
if (!b)
throw new RuntimeException("Assertion failure");
} }
} }

View File

@@ -20,14 +20,12 @@ import android.view.ViewGroup;
import android.view.ViewParent; import android.view.ViewParent;
import android.util.Log; import android.util.Log;
import android.util.LogPrinter; import android.util.LogPrinter;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
public class Keyboard2 extends InputMethodService public class Keyboard2 extends InputMethodService
implements SharedPreferences.OnSharedPreferenceChangeListener, implements SharedPreferences.OnSharedPreferenceChangeListener
Autocapitalisation.Callback
{ {
static private final String TAG = "Keyboard2"; static private final String TAG = "Keyboard2";
@@ -36,7 +34,6 @@ public class Keyboard2 extends InputMethodService
private ViewGroup _emojiPane = null; private ViewGroup _emojiPane = null;
private Config _config; private Config _config;
private Autocapitalisation _autocap;
private boolean _debug_logs = false; private boolean _debug_logs = false;
@@ -57,15 +54,6 @@ public class Keyboard2 extends InputMethodService
_keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard); _keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard);
_keyboardView.reset(); _keyboardView.reset();
_debug_logs = getResources().getBoolean(R.bool.debug_logs); _debug_logs = getResources().getBoolean(R.bool.debug_logs);
_autocap = new Autocapitalisation(getMainLooper(), this);
}
public void update_shift_state(boolean should_enable, boolean should_disable)
{
if (should_enable)
_keyboardView.set_shift_state(true, false);
else if (should_disable)
_keyboardView.set_shift_state(false, false);
} }
private List<InputMethodSubtype> getEnabledSubtypes(InputMethodManager imm) private List<InputMethodSubtype> getEnabledSubtypes(InputMethodManager imm)
@@ -74,7 +62,7 @@ public class Keyboard2 extends InputMethodService
for (InputMethodInfo imi : imm.getEnabledInputMethodList()) for (InputMethodInfo imi : imm.getEnabledInputMethodList())
if (imi.getPackageName().equals(pkg)) if (imi.getPackageName().equals(pkg))
return imm.getEnabledInputMethodSubtypeList(imi, true); return imm.getEnabledInputMethodSubtypeList(imi, true);
return Arrays.asList(); return null;
} }
private void refreshSubtypeLayout(InputMethodSubtype subtype) private void refreshSubtypeLayout(InputMethodSubtype subtype)
@@ -91,37 +79,34 @@ public class Keyboard2 extends InputMethodService
_currentTextLayout = l; _currentTextLayout = l;
} }
private void extra_keys_of_subtype(Set<KeyValue> dst, InputMethodSubtype subtype) private void extra_keys_of_subtype(Set<String> dst, InputMethodSubtype subtype)
{ {
String extra_keys = subtype.getExtraValueOf("extra_keys"); String extra_keys = subtype.getExtraValueOf("extra_keys");
if (extra_keys == null) if (extra_keys == null)
return; return;
String[] ks = extra_keys.split("\\|"); String[] ks = extra_keys.split("\\|");
for (int i = 0; i < ks.length; i++) for (int i = 0; i < ks.length; i++)
dst.add(KeyValue.getKeyByName(ks[i])); dst.add(ks[i]);
} }
private void refreshAccentsOption(InputMethodManager imm, InputMethodSubtype subtype) private void refreshAccentsOption(InputMethodManager imm, InputMethodSubtype subtype)
{ {
HashSet<KeyValue> extra_keys = new HashSet<KeyValue>(); HashSet<String> extra_keys = new HashSet<String>();
List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm);
switch (_config.accents) switch (_config.accents)
{ {
// '3' was "all accents", now unused case 1:
case 1: case 3:
extra_keys_of_subtype(extra_keys, subtype); extra_keys_of_subtype(extra_keys, subtype);
for (InputMethodSubtype s : enabled_subtypes) for (InputMethodSubtype s : getEnabledSubtypes(imm))
extra_keys_of_subtype(extra_keys, s); extra_keys_of_subtype(extra_keys, s);
break; break;
case 2: case 2:
extra_keys_of_subtype(extra_keys, subtype); extra_keys_of_subtype(extra_keys, subtype);
break; break;
case 3: extra_keys = null; break;
case 4: break; case 4: break;
default: throw new IllegalArgumentException(); default: throw new IllegalArgumentException();
} }
_config.extra_keys_subtype = extra_keys; _config.extra_keys = extra_keys;
if (enabled_subtypes.size() > 1)
_config.shouldOfferSwitchingToNextInputMethod = true;
} }
private void refreshSubtypeLegacyFallback() private void refreshSubtypeLegacyFallback()
@@ -129,8 +114,8 @@ public class Keyboard2 extends InputMethodService
// Fallback for the accents option: Only respect the "None" case // Fallback for the accents option: Only respect the "None" case
switch (_config.accents) switch (_config.accents)
{ {
case 1: case 2: case 3: _config.extra_keys_subtype = null; break; case 1: case 2: case 3: _config.extra_keys = null; break;
case 4: _config.extra_keys_subtype = new HashSet<KeyValue>(); break; case 4: _config.extra_keys = new HashSet<String>(); break;
} }
// Fallback for the layout option: Use qwerty in the "system settings" case // Fallback for the layout option: Use qwerty in the "system settings" case
_currentTextLayout = (_config.layout == -1) ? R.xml.qwerty : _config.layout; _currentTextLayout = (_config.layout == -1) ? R.xml.qwerty : _config.layout;
@@ -148,20 +133,9 @@ public class Keyboard2 extends InputMethodService
else else
{ {
InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype(); InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype();
if (subtype == null) refreshSubtypeLayout(subtype);
{ refreshAccentsOption(imm, subtype);
// On some rare cases, [subtype] is null.
refreshSubtypeLegacyFallback();
}
else
{
refreshSubtypeLayout(subtype);
refreshAccentsOption(imm, subtype);
}
} }
_config.shouldOfferSwitchingToProgramming =
_config.programming_layout != -1 &&
_currentTextLayout != _config.programming_layout;
} }
private String actionLabel_of_imeAction(int action) private String actionLabel_of_imeAction(int action)
@@ -182,7 +156,7 @@ public class Keyboard2 extends InputMethodService
return getResources().getString(res); return getResources().getString(res);
} }
private void refresh_action_label(EditorInfo info) private void refreshEditorInfo(EditorInfo info)
{ {
// First try to look at 'info.actionLabel', if it isn't set, look at // First try to look at 'info.actionLabel', if it isn't set, look at
// 'imeOptions'. // 'imeOptions'.
@@ -225,27 +199,15 @@ public class Keyboard2 extends InputMethodService
Log.d(TAG, "actionLabel: "+_config.actionLabel); Log.d(TAG, "actionLabel: "+_config.actionLabel);
} }
private int chooseLayout(EditorInfo info)
{
switch (info.inputType & InputType.TYPE_MASK_CLASS)
{
case InputType.TYPE_CLASS_NUMBER:
return R.xml.pin;
case InputType.TYPE_CLASS_PHONE:
case InputType.TYPE_CLASS_DATETIME:
return R.xml.pin;
default:
return _currentTextLayout;
}
}
@Override @Override
public void onStartInputView(EditorInfo info, boolean restarting) public void onStartInputView(EditorInfo info, boolean restarting)
{ {
refreshConfig(); refreshConfig();
refresh_action_label(info); refreshEditorInfo(info);
_keyboardView.setKeyboard(getLayout(chooseLayout(info))); if ((info.inputType & InputType.TYPE_CLASS_NUMBER) != 0)
_autocap.started(info, getCurrentInputConnection()); _keyboardView.setKeyboard(getLayout(R.xml.numeric));
else
_keyboardView.setKeyboard(getLayout(_currentTextLayout));
setInputView(_keyboardView); setInputView(_keyboardView);
if (_debug_logs) if (_debug_logs)
log_editor_info(info); log_editor_info(info);
@@ -267,13 +229,6 @@ public class Keyboard2 extends InputMethodService
_keyboardView.setKeyboard(getLayout(_currentTextLayout)); _keyboardView.setKeyboard(getLayout(_currentTextLayout));
} }
@Override
public void onUpdateSelection(int oldSelStart, int oldSelEnd, int newSelStart, int newSelEnd, int candidatesStart, int candidatesEnd)
{
super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, candidatesStart, candidatesEnd);
_autocap.selection_updated(oldSelStart, newSelStart);
}
@Override @Override
public void onFinishInputView(boolean finishingInput) public void onFinishInputView(boolean finishingInput)
{ {
@@ -287,13 +242,6 @@ public class Keyboard2 extends InputMethodService
refreshConfig(); refreshConfig();
} }
@Override
public boolean onEvaluateFullscreenMode()
{
/* Entirely disable fullscreen mode. */
return false;
}
/** Not static */ /** Not static */
public class Receiver implements KeyEventHandler.IReceiver public class Receiver implements KeyEventHandler.IReceiver
{ {
@@ -325,41 +273,11 @@ public class Keyboard2 extends InputMethodService
conn.performEditorAction(_config.actionId); conn.performEditorAction(_config.actionId);
} }
public void enableCapsLock() public void setLayout(int res_id)
{ {
_keyboardView.set_shift_state(true, true); if (res_id == -1)
} res_id = _currentTextLayout;
_keyboardView.setKeyboard(getLayout(res_id));
public void switchMain()
{
_keyboardView.setKeyboard(getLayout(_currentTextLayout));
}
public void switchNumeric()
{
_keyboardView.setKeyboard(getLayout(R.xml.numeric));
}
public void switchGreekmath()
{
_keyboardView.setKeyboard(getLayout(R.xml.greekmath));
}
public void switchProgramming()
{
if (_config.programming_layout == -1)
return;
KeyboardData layout =
getLayout(_config.programming_layout).mapKeys(new KeyboardData.MapKeyValues() {
public KeyValue apply(KeyValue key, boolean localized)
{
if (key.getKind() == KeyValue.Kind.Event
&& key.getEvent() == KeyValue.Event.SWITCH_PROGRAMMING)
return KeyValue.getKeyByName("switch_text");
return key;
}
});
_keyboardView.setKeyboard(layout);
} }
public void sendKeyEvent(int eventAction, int eventCode, int meta) public void sendKeyEvent(int eventAction, int eventCode, int meta)
@@ -368,8 +286,6 @@ public class Keyboard2 extends InputMethodService
if (conn == null) if (conn == null)
return; return;
conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0, meta)); conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0, meta));
if (eventAction == KeyEvent.ACTION_UP)
_autocap.event_sent(eventCode, meta);
} }
public void showKeyboardConfig() public void showKeyboardConfig()
@@ -382,13 +298,11 @@ public class Keyboard2 extends InputMethodService
public void commitText(String text) public void commitText(String text)
{ {
getCurrentInputConnection().commitText(text, 1); getCurrentInputConnection().commitText(text, 1);
_autocap.typed(text);
} }
public void commitChar(char c) public void commitChar(char c)
{ {
sendKeyChar(c); sendKeyChar(c);
_autocap.typed(c);
} }
} }

View File

@@ -1,30 +1,29 @@
package juloo.keyboard2; package juloo.keyboard2;
import android.content.Context; import android.content.Context;
import android.content.ContextWrapper;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.RectF; import android.graphics.RectF;
import android.inputmethodservice.InputMethodService; import android.os.Vibrator;
import android.os.Build.VERSION;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.Window;
public class Keyboard2View extends View public class Keyboard2View extends View
implements View.OnTouchListener, Pointers.IPointerEventHandler implements View.OnTouchListener, Pointers.IPointerEventHandler
{ {
private static final long VIBRATE_MIN_INTERVAL = 100;
private KeyboardData _keyboard; private KeyboardData _keyboard;
private KeyValue _shift_kv;
private KeyboardData.Key _shift_key;
private Pointers _pointers; private Pointers _pointers;
private Pointers.Modifiers _mods; private int _flags = 0;
private Vibrator _vibratorService;
private long _lastVibration = 0;
private static int _currentWhat = 0; private static int _currentWhat = 0;
@@ -46,103 +45,65 @@ public class Keyboard2View extends View
public Keyboard2View(Context context, AttributeSet attrs) public Keyboard2View(Context context, AttributeSet attrs)
{ {
super(context, attrs); super(context, attrs);
_vibratorService = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
_theme = new Theme(getContext(), attrs); _theme = new Theme(getContext(), attrs);
_config = Config.globalConfig(); _config = Config.globalConfig();
_pointers = new Pointers(this, _config); _pointers = new Pointers(this, _config);
refresh_navigation_bar(context);
setOnTouchListener(this); setOnTouchListener(this);
reset(); reset();
} }
private Window getParentWindow(Context context)
{
if (context instanceof InputMethodService)
return ((InputMethodService)context).getWindow().getWindow();
if (context instanceof ContextWrapper)
return getParentWindow(((ContextWrapper)context).getBaseContext());
return null;
}
public void refresh_navigation_bar(Context context)
{
if (VERSION.SDK_INT < 21)
return;
// The intermediate Window is a [Dialog].
Window w = getParentWindow(context);
int uiFlags = getSystemUiVisibility();
if (_theme.isLightNavBar)
uiFlags |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
else
uiFlags &= ~View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
w.setNavigationBarColor(_theme.colorNavBar);
setSystemUiVisibility(uiFlags);
}
public void setKeyboard(KeyboardData kw) public void setKeyboard(KeyboardData kw)
{ {
_keyboard = _config.modify_layout(kw); _keyboard = _config.modify_layout(kw);
_shift_kv = KeyValue.getKeyByName("shift");
_shift_key = _keyboard.findKeyWithValue(_shift_kv);
if (_shift_key == null)
{
_shift_kv = _shift_kv.withFlags(_shift_kv.getFlags() | KeyValue.FLAG_LOCK);
_shift_key = _keyboard.findKeyWithValue(_shift_kv);
}
reset(); reset();
} }
public void reset() public void reset()
{ {
_mods = Pointers.Modifiers.EMPTY; _flags = 0;
_pointers.clear(); _pointers.clear();
requestLayout(); requestLayout();
invalidate(); invalidate();
} }
/** Called by auto-capitalisation. */ public void onPointerDown(KeyValue k)
public void set_shift_state(boolean state, boolean lock)
{ {
if (_keyboard == null || _shift_key == null) updateFlags();
return;
if (state)
_pointers.add_fake_pointer(_shift_kv, _shift_key, lock);
else
_pointers.remove_fake_pointer(_shift_kv, _shift_key);
invalidate(); invalidate();
} if (k != null)
public KeyValue modifyKey(KeyValue k, Pointers.Modifiers mods)
{
return KeyModifier.modify(k, mods);
}
public void onPointerDown(boolean isSwipe)
{
invalidate();
vibrate();
}
public void onPointerUp(KeyValue k, Pointers.Modifiers mods)
{
_config.handler.handleKeyUp(k, mods);
invalidate();
}
public void onPointerHold(KeyValue k, Pointers.Modifiers mods)
{
_config.handler.handleKeyUp(k, mods);
}
public void onPointerFlagsChanged(boolean shouldVibrate)
{
invalidate();
if (shouldVibrate)
vibrate(); vibrate();
} }
public void onPointerSwipe(KeyValue k)
{
updateFlags();
invalidate();
if (k != null)
vibrate();
}
public void onPointerUp(KeyValue k)
{
_config.handler.handleKeyUp(k, _flags);
updateFlags();
invalidate();
}
public void onPointerHold(KeyValue k)
{
_config.handler.handleKeyUp(k, _flags);
}
public void onPointerFlagsChanged()
{
updateFlags();
invalidate();
}
private void updateFlags() private void updateFlags()
{ {
_mods = _pointers.getModifiers(); _flags = _pointers.getFlags();
} }
@Override @Override
@@ -199,13 +160,9 @@ public class Keyboard2View extends View
return null; return null;
for (KeyboardData.Key key : row.keys) for (KeyboardData.Key key : row.keys)
{ {
float xLeft = x + key.shift * _keyWidth; x += (key.shift + key.width) * _keyWidth;
float xRight = xLeft + key.width * _keyWidth; if (tx < x)
if (tx < xLeft)
return null;
if (tx < xRight)
return key; return key;
x = xRight;
} }
return null; return null;
} }
@@ -214,10 +171,18 @@ public class Keyboard2View extends View
{ {
if (!_config.vibrateEnabled) if (!_config.vibrateEnabled)
return ; return ;
if (VERSION.SDK_INT >= 5) long now = System.currentTimeMillis();
if ((now - _lastVibration) > VIBRATE_MIN_INTERVAL)
{ {
performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY, _lastVibration = now;
HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); try
{
_vibratorService.vibrate(_config.vibrateDuration);
}
catch (Exception e)
{
e.printStackTrace();
}
} }
} }
@@ -237,7 +202,6 @@ public class Keyboard2View extends View
@Override @Override
protected void onDraw(Canvas canvas) protected void onDraw(Canvas canvas)
{ {
updateFlags();
float y = _config.marginTop + _config.keyVerticalInterval / 2; float y = _config.marginTop + _config.keyVerticalInterval / 2;
for (KeyboardData.Row row : _keyboard.rows) for (KeyboardData.Row row : _keyboard.rows)
{ {
@@ -267,10 +231,6 @@ public class Keyboard2View extends View
drawSubLabel(canvas, k.key2, x, y, keyW, keyH, Paint.Align.RIGHT, Vertical.TOP, isKeyDown); drawSubLabel(canvas, k.key2, x, y, keyW, keyH, Paint.Align.RIGHT, Vertical.TOP, isKeyDown);
drawSubLabel(canvas, k.key4, x, y, keyW, keyH, Paint.Align.RIGHT, Vertical.BOTTOM, isKeyDown); drawSubLabel(canvas, k.key4, x, y, keyW, keyH, Paint.Align.RIGHT, Vertical.BOTTOM, isKeyDown);
} }
if (k.indication != null)
{
drawIndication(canvas, k.indication, keyW / 2f + x, y, keyH);
}
x += _keyWidth * k.width; x += _keyWidth * k.width;
} }
y += row.height * _config.keyHeight; y += row.height * _config.keyHeight;
@@ -285,7 +245,7 @@ public class Keyboard2View extends View
private int labelColor(KeyValue k, boolean isKeyDown, int defaultColor) private int labelColor(KeyValue k, boolean isKeyDown, int defaultColor)
{ {
if (isKeyDown && k.hasFlags(KeyValue.FLAG_LATCH)) if (isKeyDown && (k.flags & KeyValue.FLAG_LATCH) != 0)
{ {
int flags = _pointers.getKeyFlags(k); int flags = _pointers.getKeyFlags(k);
if (flags != -1) if (flags != -1)
@@ -299,32 +259,26 @@ public class Keyboard2View extends View
return defaultColor; return defaultColor;
} }
private void drawLabel(Canvas canvas, KeyboardData.Corner k, float x, float y, float keyH, boolean isKeyDown) private void drawLabel(Canvas canvas, KeyValue k, float x, float y, float keyH, boolean isKeyDown)
{ {
k = KeyModifier.handleFlags(k, _flags);
if (k == null) if (k == null)
return; return;
KeyValue kv = KeyModifier.modify(k.kv, _mods); float textSize = scaleTextSize(k, _config.labelTextSize, keyH);
if (kv == null) Paint p = _theme.labelPaint(((k.flags & KeyValue.FLAG_KEY_FONT) != 0));
return; p.setColor(labelColor(k, isKeyDown, _theme.labelColor));
float textSize = scaleTextSize(kv, _config.labelTextSize, keyH);
Paint p = _theme.labelPaint(kv.hasFlags(KeyValue.FLAG_KEY_FONT));
p.setColor(labelColor(kv, isKeyDown, _theme.labelColor));
p.setTextSize(textSize); p.setTextSize(textSize);
canvas.drawText(kv.getString(), x, (keyH - p.ascent() - p.descent()) / 2f + y, p); canvas.drawText(k.symbol, x, (keyH - p.ascent() - p.descent()) / 2f + y, p);
} }
private void drawSubLabel(Canvas canvas, KeyboardData.Corner k, float x, private void drawSubLabel(Canvas canvas, KeyValue k, float x, float y, float keyW, float keyH, Paint.Align a, Vertical v, boolean isKeyDown)
float y, float keyW, float keyH, Paint.Align a, Vertical v,
boolean isKeyDown)
{ {
k = KeyModifier.handleFlags(k, _flags);
if (k == null) if (k == null)
return; return;
KeyValue kv = KeyModifier.modify(k.kv, _mods); float textSize = scaleTextSize(k, _config.sublabelTextSize, keyH);
if (kv == null) Paint p = _theme.subLabelPaint(((k.flags & KeyValue.FLAG_KEY_FONT) != 0), a);
return; p.setColor(labelColor(k, isKeyDown, _theme.subLabelColor));
float textSize = scaleTextSize(kv, _config.sublabelTextSize, keyH);
Paint p = _theme.subLabelPaint(kv.hasFlags(KeyValue.FLAG_KEY_FONT), a);
p.setColor(labelColor(kv, isKeyDown, _theme.subLabelColor));
p.setTextSize(textSize); p.setTextSize(textSize);
float subPadding = _config.keyPadding; float subPadding = _config.keyPadding;
if (v == Vertical.CENTER) if (v == Vertical.CENTER)
@@ -335,23 +289,12 @@ public class Keyboard2View extends View
x += keyW / 2f; x += keyW / 2f;
else else
x += (a == Paint.Align.LEFT) ? subPadding : keyW - subPadding; x += (a == Paint.Align.LEFT) ? subPadding : keyW - subPadding;
canvas.drawText(kv.getString(), x, y, p); canvas.drawText(k.symbol, x, y, p);
}
private void drawIndication(Canvas canvas, String indication, float x,
float y, float keyH)
{
float textSize = keyH * _config.sublabelTextSize * _config.characterSize;
Paint p = _theme.indicationPaint();
p.setColor(_theme.subLabelColor);
p.setTextSize(textSize);
canvas.drawText(indication, x,
(keyH - p.ascent() - p.descent()) * 4/5 + y, p);
} }
private float scaleTextSize(KeyValue k, float rel_size, float keyH) private float scaleTextSize(KeyValue k, float rel_size, float keyH)
{ {
float smaller_font = k.hasFlags(KeyValue.FLAG_SMALLER_FONT) ? 0.75f : 1.f; float smaller_font = ((k.flags & KeyValue.FLAG_SMALLER_FONT) == 0) ? 1.f : 0.75f;
return keyH * rel_size * smaller_font * _config.characterSize; return keyH * rel_size * smaller_font * _config.characterSize;
} }
} }

View File

@@ -3,106 +3,28 @@ package juloo.keyboard2;
import android.content.res.Resources; import android.content.res.Resources;
import android.content.res.XmlResourceParser; import android.content.res.XmlResourceParser;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.function.Function;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Function;
class KeyboardData class KeyboardData
{ {
public final List<Row> rows; public final List<Row> rows;
/** Total width of the keyboard. */ /* Total width of the keyboard. Unit is abstract. */
public final float keysWidth; public final float keysWidth;
/** Total height of the keyboard. */ /* Total height of the keyboard. Unit is abstract. */
public final float keysHeight; public final float keysHeight;
/** Whether to add extra keys. */
public final boolean extra_keys;
/** Whether to possibly add NumPad. */
public final boolean num_pad;
public KeyboardData mapKeys(MapKey f) public KeyboardData replaceKeys(MapKeys f)
{ {
ArrayList<Row> rows_ = new ArrayList<Row>(); ArrayList<Row> rows_ = new ArrayList<Row>();
for (Row r : rows) for (Row r : rows)
rows_.add(r.mapKeys(f)); rows_.add(r.replaceKeys(f));
return new KeyboardData(rows_, keysWidth, extra_keys, num_pad); return new KeyboardData(rows_, keysWidth);
}
/** Add keys from the given iterator into the keyboard. Extra keys are added
* on the empty key4 corner of the second row, from right to left. If there's
* not enough room, key3 of the second row is tried then key2 and key1 of the
* third row. */
public KeyboardData addExtraKeys(Iterator<KeyValue> k)
{
if (!extra_keys)
return this;
ArrayList<Row> rows = new ArrayList<Row>(this.rows);
addExtraKeys_to_row(rows, k, 1, 4);
addExtraKeys_to_row(rows, k, 1, 3);
addExtraKeys_to_row(rows, k, 2, 2);
addExtraKeys_to_row(rows, k, 2, 1);
if (k.hasNext())
{
for (int r = 0; r < rows.size(); r++)
for (int c = 1; c <= 4; c++)
addExtraKeys_to_row(rows, k, r, c);
}
return new KeyboardData(rows, keysWidth, extra_keys, num_pad);
}
public KeyboardData addNumPad()
{
if (!num_pad || _numPadKeyboardData == null)
return this;
ArrayList<Row> extendedRows = new ArrayList<Row>();
Iterator<Row> iterNumPadRows = _numPadKeyboardData.rows.iterator();
for (Row row : rows)
{
ArrayList<KeyboardData.Key> keys = new ArrayList<Key>(row.keys);
if (iterNumPadRows.hasNext())
{
Row numPadRow = iterNumPadRows.next();
List<Key> nps = numPadRow.keys;
if (nps.size() > 0) {
float firstNumPadShift = 0.5f + keysWidth - row.keysWidth;
keys.add(nps.get(0).withShift(firstNumPadShift));
for (int i = 1; i < nps.size(); i++)
keys.add(nps.get(i));
}
}
extendedRows.add(new Row(keys, row.height, row.shift));
}
return new KeyboardData(extendedRows, compute_max_width(extendedRows), extra_keys, num_pad);
}
public Key findKeyWithValue(KeyValue kv)
{
for (Row r : rows)
{
Key k = r.findKeyWithValue(kv);
if (k != null)
return k;
}
return null;
}
private static void addExtraKeys_to_row(ArrayList<Row> rows, final Iterator<KeyValue> extra_keys, int row_i, final int d)
{
if (!extra_keys.hasNext())
return;
rows.set(row_i, rows.get(row_i).mapKeys(new MapKey(){
public Key apply(Key k) {
if (k.getKeyValue(d) == null && extra_keys.hasNext())
return k.withKeyValue(d, extra_keys.next());
else
return k;
}
}));
} }
private static Row _bottomRow = null; private static Row _bottomRow = null;
private static KeyboardData _numPadKeyboardData = null;
private static Map<Integer, KeyboardData> _layoutCache = new HashMap<Integer, KeyboardData>(); private static Map<Integer, KeyboardData> _layoutCache = new HashMap<Integer, KeyboardData>();
public static KeyboardData load(Resources res, int id) public static KeyboardData load(Resources res, int id)
@@ -114,10 +36,6 @@ class KeyboardData
{ {
if (_bottomRow == null) if (_bottomRow == null)
_bottomRow = parse_bottom_row(res.getXml(R.xml.bottom_row)); _bottomRow = parse_bottom_row(res.getXml(R.xml.bottom_row));
if (_numPadKeyboardData == null)
{
_numPadKeyboardData = parse_keyboard(res.getXml(R.xml.numpad));
}
l = parse_keyboard(res.getXml(id)); l = parse_keyboard(res.getXml(id));
_layoutCache.put(id, l); _layoutCache.put(id, l);
} }
@@ -134,16 +52,13 @@ class KeyboardData
if (!expect_tag(parser, "keyboard")) if (!expect_tag(parser, "keyboard"))
throw new Exception("Empty layout file"); throw new Exception("Empty layout file");
boolean bottom_row = parser.getAttributeBooleanValue(null, "bottom_row", true); boolean bottom_row = parser.getAttributeBooleanValue(null, "bottom_row", true);
boolean extra_keys = parser.getAttributeBooleanValue(null, "extra_keys", true);
boolean num_pad = parser.getAttributeBooleanValue(null, "num_pad", true);
float specified_kw = parser.getAttributeFloatValue(null, "width", 0f);
ArrayList<Row> rows = new ArrayList<Row>(); ArrayList<Row> rows = new ArrayList<Row>();
while (expect_tag(parser, "row")) while (expect_tag(parser, "row"))
rows.add(Row.parse(parser)); rows.add(Row.parse(parser));
float kw = (specified_kw != 0f) ? specified_kw : compute_max_width(rows); float kw = compute_max_width(rows);
if (bottom_row) if (bottom_row)
rows.add(_bottomRow.updateWidth(kw)); rows.add(_bottomRow.updateWidth(kw));
return new KeyboardData(rows, kw, extra_keys, num_pad); return new KeyboardData(rows, kw);
} }
private static float compute_max_width(List<Row> rows) private static float compute_max_width(List<Row> rows)
@@ -161,7 +76,7 @@ class KeyboardData
return Row.parse(parser); return Row.parse(parser);
} }
protected KeyboardData(List<Row> rows_, float kw, boolean xk, boolean np) protected KeyboardData(List<Row> rows_, float kw)
{ {
float kh = 0.f; float kh = 0.f;
for (Row r : rows_) for (Row r : rows_)
@@ -169,19 +84,17 @@ class KeyboardData
rows = rows_; rows = rows_;
keysWidth = kw; keysWidth = kw;
keysHeight = kh; keysHeight = kh;
extra_keys = xk;
num_pad = np;
} }
public static class Row public static class Row
{ {
public final List<Key> keys; public final List<Key> keys;
/** Height of the row, without 'shift'. */ /* Height of the row, without 'shift'. Unit is abstract. */
public final float height; public final float height;
/** Extra empty space on the top. */ /* Extra empty space on the top. */
public final float shift; public final float shift;
/** Total width of the row. */ /* Total width of the row. Unit is abstract. */
public final float keysWidth; private final float keysWidth;
protected Row(List<Key> keys_, float h, float s) protected Row(List<Key> keys_, float h, float s)
{ {
@@ -204,29 +117,22 @@ class KeyboardData
return new Row(keys, h, shift); return new Row(keys, h, shift);
} }
public Row mapKeys(MapKey f) public Row replaceKeys(MapKeys f)
{ {
ArrayList<Key> keys_ = new ArrayList<Key>(); ArrayList<Key> keys_ = new ArrayList<Key>();
for (Key k : keys) for (Key k : keys)
keys_.add(f.apply(k)); keys_.add(k.replaceKeys(f));
return new Row(keys_, height, shift); return new Row(keys_, height, shift);
} }
/** Change the width of every keys so that the row is 's' units wide. */ /** Change the width of every keys so that the row is 's' units wide. */
public Row updateWidth(float newWidth) public Row updateWidth(float newWidth)
{ {
final float s = newWidth / keysWidth; float s = newWidth / keysWidth;
return mapKeys(new MapKey(){ ArrayList<Key> keys_ = new ArrayList<Key>();
public Key apply(Key k) { return k.scaleWidth(s); }
});
}
public Key findKeyWithValue(KeyValue kv)
{
for (Key k : keys) for (Key k : keys)
if (k.hasValue(kv)) keys_.add(k.scaleWidth(s));
return k; return new Row(keys_, height, shift);
return null;
} }
} }
@@ -237,21 +143,20 @@ class KeyboardData
** 0 ** 0
** 3 4 ** 3 4
*/ */
public final Corner key0; public final KeyValue key0;
public final Corner key1; public final KeyValue key1;
public final Corner key2; public final KeyValue key2;
public final Corner key3; public final KeyValue key3;
public final Corner key4; public final KeyValue key4;
/** Key width in relative unit. */ /* Key width in relative unit. */
public final float width; public final float width;
/** Extra empty space on the left of the key. */ /* Extra empty space on the left of the key. */
public final float shift; public final float shift;
/** Put keys 1 to 4 on the edges instead of the corners. */ /* Put keys 1 to 4 on the edges instead of the corners. */
public final boolean edgekeys; public final boolean edgekeys;
public final String indication;
protected Key(Corner k0, Corner k1, Corner k2, Corner k3, Corner k4, float w, float s, boolean e, String i) protected Key(KeyValue k0, KeyValue k1, KeyValue k2, KeyValue k3, KeyValue k4, float w, float s, boolean e)
{ {
key0 = k0; key0 = k0;
key1 = k1; key1 = k1;
@@ -261,186 +166,37 @@ class KeyboardData
width = w; width = w;
shift = s; shift = s;
edgekeys = e; edgekeys = e;
indication = i;
} }
public static Key parse(XmlResourceParser parser) throws Exception public static Key parse(XmlResourceParser parser) throws Exception
{ {
Corner k0 = Corner.parse_of_attr(parser, "key0"); KeyValue k0 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key0"));
Corner k1 = Corner.parse_of_attr(parser, "key1"); KeyValue k1 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key1"));
Corner k2 = Corner.parse_of_attr(parser, "key2"); KeyValue k2 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key2"));
Corner k3 = Corner.parse_of_attr(parser, "key3"); KeyValue k3 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key3"));
Corner k4 = Corner.parse_of_attr(parser, "key4"); KeyValue k4 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key4"));
float width = parser.getAttributeFloatValue(null, "width", 1f); float width = parser.getAttributeFloatValue(null, "width", 1f);
float shift = parser.getAttributeFloatValue(null, "shift", 0.f); float shift = parser.getAttributeFloatValue(null, "shift", 0.f);
boolean edgekeys = parser.getAttributeBooleanValue(null, "edgekeys", false); boolean edgekeys = parser.getAttributeBooleanValue(null, "edgekeys", false);
String indication = parser.getAttributeValue(null, "indication");
while (parser.next() != XmlResourceParser.END_TAG) while (parser.next() != XmlResourceParser.END_TAG)
continue ; continue ;
return new Key(k0, k1, k2, k3, k4, width, shift, edgekeys, indication); return new Key(k0, k1, k2, k3, k4, width, shift, edgekeys);
}
public Key replaceKeys(MapKeys f)
{
return new Key(f.apply(key0), f.apply(key1), f.apply(key2),
f.apply(key3), f.apply(key4), width, shift, edgekeys);
} }
/** New key with the width multiplied by 's'. */ /** New key with the width multiplied by 's'. */
public Key scaleWidth(float s) public Key scaleWidth(float s)
{ {
return new Key(key0, key1, key2, key3, key4, width * s, shift, edgekeys, return new Key(key0, key1, key2, key3, key4, width * s, shift, edgekeys);
indication);
}
public KeyValue getKeyValue(int i)
{
Corner c;
switch (i)
{
case 0: c = key0; break;
case 1: c = key1; break;
case 2: c = key2; break;
case 3: c = key3; break;
case 4: c = key4; break;
default: c = null; break;
}
return (c == null) ? null : c.kv;
}
public Key withKeyValue(int i, KeyValue kv)
{
Corner k0 = key0, k1 = key1, k2 = key2, k3 = key3, k4 = key4;
Corner k = Corner.of_kv(kv);
switch (i)
{
case 0: k0 = k; break;
case 1: k1 = k; break;
case 2: k2 = k; break;
case 3: k3 = k; break;
case 4: k4 = k; break;
}
return new Key(k0, k1, k2, k3, k4, width, shift, edgekeys, indication);
}
public Key withShift(float s)
{
return new Key(key0, key1, key2, key3, key4, width, s, edgekeys, indication);
}
/**
* See Pointers.onTouchMove() for the represented direction.
*/
public KeyValue getAtDirection(int direction)
{
Corner c = null;
if (edgekeys)
{
// \ 1 /
// \ /
// 3 0 2
// / \
// / 4 \
switch (direction)
{
case 2: case 3: c = key1; break;
case 4: case 5: c = key2; break;
case 6: case 7: c = key4; break;
case 8: case 1: c = key3; break;
}
}
else
{
// 1 | 2
// |
// --0--
// |
// 3 | 4
switch (direction)
{
case 1: case 2: c = key1; break;
case 3: case 4: c = key2; break;
case 5: case 6: c = key4; break;
case 7: case 8: c = key3; break;
}
}
return (c == null) ? null : c.kv;
}
public boolean hasValue(KeyValue kv)
{
return (hasValue(key0, kv) || hasValue(key1, kv) || hasValue(key2, kv) ||
hasValue(key3, kv) || hasValue(key4, kv));
}
private static boolean hasValue(Corner c, KeyValue kv)
{
return (c != null && c.kv.equals(kv));
} }
} }
public static final class Corner public static abstract interface MapKeys extends Function<KeyValue, KeyValue> { }
{
public final KeyValue kv;
/** Whether the kv is marked with the "loc " prefix. To be removed if not
specified in the [extra_keys]. */
public final boolean localized;
protected Corner(KeyValue k, boolean l)
{
kv = k;
localized = l;
}
public static Corner parse_of_attr(XmlResourceParser parser, String attr) throws Exception
{
String name = parser.getAttributeValue(null, attr);
boolean localized = false;
if (name == null)
return null;
String name_loc = stripPrefix(name, "loc ");
if (name_loc != null)
{
localized = true;
name = name_loc;
}
return new Corner(KeyValue.getKeyByName(name), localized);
}
public static Corner of_kv(KeyValue kv)
{
return new Corner(kv, false);
}
private static String stripPrefix(String s, String prefix)
{
if (s.startsWith(prefix))
return s.substring(prefix.length());
else
return null;
}
}
// Not using Function<KeyValue, KeyValue> to keep compatibility with Android 6.
public static abstract interface MapKey {
public Key apply(Key k);
}
public static abstract class MapKeyValues implements MapKey {
abstract public KeyValue apply(KeyValue c, boolean localized);
public Key apply(Key k)
{
return new Key(apply(k.key0), apply(k.key1), apply(k.key2),
apply(k.key3), apply(k.key4), k.width, k.shift, k.edgekeys,
k.indication);
}
private Corner apply(Corner c)
{
if (c == null)
return null;
KeyValue kv = apply(c.kv, c.localized);
if (kv == null)
return null;
return Corner.of_kv(kv);
}
}
/** Parsing utils */ /** Parsing utils */

View File

@@ -2,7 +2,6 @@ package juloo.keyboard2;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import java.util.Arrays;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
@@ -23,27 +22,12 @@ public final class Pointers implements Handler.Callback
_config = c; _config = c;
} }
/** Return the list of modifiers currently activated. */ public int getFlags()
public Modifiers getModifiers()
{ {
return getModifiers(false); int flags = 0;
} for (Pointer p : _ptrs)
flags |= p.flags;
/** When [skip_latched] is true, don't take flags of latched keys into account. */ return flags;
private Modifiers getModifiers(boolean skip_latched)
{
int n_ptrs = _ptrs.size();
KeyValue.Modifier[] mods = new KeyValue.Modifier[n_ptrs];
int n_mods = 0;
for (int i = 0; i < n_ptrs; i++)
{
Pointer p = _ptrs.get(i);
if (p.value != null && p.value.getKind() == KeyValue.Kind.Modifier
&& !(skip_latched && p.pointerId == -1
&& (p.flags & KeyValue.FLAG_LOCKED) == 0))
mods[n_mods++] = p.value.getModifier();
}
return Modifiers.ofArray(mods, n_mods);
} }
public void clear() public void clear()
@@ -69,31 +53,11 @@ public final class Pointers implements Handler.Callback
public int getKeyFlags(KeyValue kv) public int getKeyFlags(KeyValue kv)
{ {
for (Pointer p : _ptrs) for (Pointer p : _ptrs)
if (p.value != null && p.value.equals(kv)) if (p.value != null && p.value.name == kv.name) // Physical equality
return p.flags; return p.flags;
return -1; return -1;
} }
/** Fake pointers are latched and not lockable. */
public void add_fake_pointer(KeyValue kv, KeyboardData.Key key, boolean locked)
{
if (getLatched(key, kv) != null)
return; // Already latched, don't add an other pointer.
Pointer ptr = new Pointer(-1, key, kv, 0.f, 0.f, Modifiers.EMPTY);
ptr.flags &= ~KeyValue.FLAG_LATCH;
ptr.flags |= KeyValue.FLAG_LOCK | KeyValue.FLAG_FAKE_PTR;
if (locked)
ptr.flags = (ptr.flags & ~KeyValue.FLAG_LOCK) | KeyValue.FLAG_LOCKED;
_ptrs.add(ptr);
}
public void remove_fake_pointer(KeyValue kv, KeyboardData.Key key)
{
Pointer ptr = getLatched(key, kv);
if (ptr != null && (ptr.flags & KeyValue.FLAG_FAKE_PTR) != 0)
removePtr(ptr);
}
// Receiving events // Receiving events
public void onTouchUp(int pointerId) public void onTouchUp(int pointerId)
@@ -102,29 +66,32 @@ public final class Pointers implements Handler.Callback
if (ptr == null) if (ptr == null)
return; return;
stopKeyRepeat(ptr); stopKeyRepeat(ptr);
Pointer latched = getLatched(ptr); Pointer latched = getLatched(ptr.value);
if (latched != null) // Already latched if (latched != null) // Already latched
{ {
removePtr(ptr); // Remove dupplicate removePtr(ptr); // Remove dupplicate
if ((latched.flags & KeyValue.FLAG_LOCK) != 0) // Toggle lockable key if ((latched.flags & KeyValue.FLAG_LOCK) != 0) // Locking key, toggle lock
lockPointer(latched, false); {
latched.flags = (latched.flags & ~KeyValue.FLAG_LOCK) | KeyValue.FLAG_LOCKED;
_handler.onPointerFlagsChanged();
}
else // Otherwise, unlatch else // Otherwise, unlatch
{ {
removePtr(latched); removePtr(latched);
_handler.onPointerUp(ptr.value, ptr.modifiers); _handler.onPointerUp(ptr.value);
} }
} }
else if ((ptr.flags & KeyValue.FLAG_LATCH) != 0) else if ((ptr.flags & KeyValue.FLAG_LATCH) != 0)
{ {
ptr.flags &= ~KeyValue.FLAG_LATCH; ptr.flags &= ~KeyValue.FLAG_LATCH;
ptr.pointerId = -1; // Latch ptr.pointerId = -1; // Latch
_handler.onPointerFlagsChanged(false); _handler.onPointerFlagsChanged();
} }
else else
{ {
clearLatched(); clearLatched();
removePtr(ptr); removePtr(ptr);
_handler.onPointerUp(ptr.value, ptr.modifiers); _handler.onPointerUp(ptr.value);
} }
} }
@@ -135,65 +102,21 @@ public final class Pointers implements Handler.Callback
return; return;
stopKeyRepeat(ptr); stopKeyRepeat(ptr);
removePtr(ptr); removePtr(ptr);
_handler.onPointerFlagsChanged(true); _handler.onPointerFlagsChanged();
}
/* Whether an other pointer is down on a non-special key. */
private boolean isOtherPointerDown()
{
for (Pointer p : _ptrs)
if (p.pointerId != -1 && (p.flags & KeyValue.FLAG_SPECIAL) == 0)
return true;
return false;
} }
public void onTouchDown(float x, float y, int pointerId, KeyboardData.Key key) public void onTouchDown(float x, float y, int pointerId, KeyboardData.Key key)
{ {
// Ignore new presses while a modulated key is active. On some devices, // Ignore new pointers that are too close to an existing pointer. This
// ghost touch events can happen while the pointer travels on top of other // might be glitches.
// keys. if (isPointerNearby(x, y))
if (isModulatedKeyPressed())
return; return;
// Don't take latched modifiers into account if an other key is pressed. KeyValue value = key.key0;
// The other key already "own" the latched modifiers and will clear them. Pointer ptr = new Pointer(pointerId, key, value, x, y);
Modifiers mods = getModifiers(isOtherPointerDown());
KeyValue value = handleKV(key.key0, mods);
Pointer ptr = new Pointer(pointerId, key, value, x, y, mods);
_ptrs.add(ptr); _ptrs.add(ptr);
startKeyRepeat(ptr); if (value != null && (value.flags & KeyValue.FLAG_NOREPEAT) == 0)
_handler.onPointerDown(false); startKeyRepeat(ptr);
} _handler.onPointerDown(value);
/*
* Get the KeyValue at the given direction. In case of swipe (!= 0), get the
* nearest KeyValue that is not key0.
* Take care of applying [_handler.onPointerSwipe] to the selected key, this
* must be done at the same time to be sure to treat removed keys correctly.
* Return [null] if no key could be found in the given direction or if the
* selected key didn't change.
*/
private KeyValue getKeyAtDirection(Pointer ptr, int direction)
{
if (direction == 0)
return handleKV(ptr.key.key0, ptr.modifiers);
KeyValue k;
for (int i = 0; i > -3; i = (~i>>31) - i)
{
int d = (direction + i + 8 - 1) % 8 + 1;
// Don't make the difference between a key that doesn't exist and a key
// that is removed by [_handler]. Triggers side effects.
k = _handler.modifyKey(ptr.key.getAtDirection(d), ptr.modifiers);
if (k != null)
return k;
}
return null;
}
private KeyValue handleKV(KeyboardData.Corner c, Modifiers modifiers)
{
if (c == null)
return null;
return _handler.modifyKey(c.kv, modifiers);
} }
public void onTouchMove(float x, float y, int pointerId) public void onTouchMove(float x, float y, int pointerId)
@@ -201,51 +124,45 @@ public final class Pointers implements Handler.Callback
Pointer ptr = getPtr(pointerId); Pointer ptr = getPtr(pointerId);
if (ptr == null) if (ptr == null)
return; return;
// The position in a IME windows is clampled to view.
// For a better up swipe behaviour, set the y position to a negative value when clamped.
if (y == 0.0) y = -400;
float dx = x - ptr.downX; float dx = x - ptr.downX;
float dy = y - ptr.downY; float dy = y - ptr.downY;
float dist = Math.abs(dx) + Math.abs(dy); float dist = Math.abs(dx) + Math.abs(dy);
ptr.ptrDist = dist; ptr.ptrDistX = dx;
ptr.ptrDistY = dy;
int direction; KeyValue newValue;
if (dist < _config.swipe_dist_px) if (dist < _config.swipe_dist_px)
{ {
direction = 0; newValue = ptr.key.key0;
}
else if (ptr.key.edgekeys)
{
if (Math.abs(dy) > Math.abs(dx)) // vertical swipe
newValue = (dy < 0) ? ptr.key.key1 : ptr.key.key4;
else // horizontal swipe
newValue = (dx < 0) ? ptr.key.key3 : ptr.key.key2;
} }
else else
{ {
// One of the 8 directions: if (dx < 0) // left side
// |\2|3/| newValue = (dy < 0) ? ptr.key.key1 : ptr.key.key3;
// |1\|/4| else // right side
// |-----| newValue = (dy < 0) ? ptr.key.key2 : ptr.key.key4;
// |8/|\5|
// |/7|6\|
direction = 1;
if (dx > 0) direction += 2;
if (dx > Math.abs(dy) || (dx < 0 && dx > -Math.abs(dy))) direction += 1;
if (dy > 0) direction = 9 - direction;
} }
if (newValue != null && newValue != ptr.value)
if (direction != ptr.selected_direction)
{ {
ptr.selected_direction = direction; int old_flags = (ptr.value != null) ? ptr.value.flags : 0;
KeyValue newValue = getKeyAtDirection(ptr, direction); ptr.value = newValue;
if (newValue != null && (ptr.value == null || !newValue.equals(ptr.value))) ptr.flags = newValue.flags;
if ((old_flags & newValue.flags & KeyValue.FLAG_PRECISE_REPEAT) != 0)
{ {
int old_flags = ptr.flags;
ptr.value = newValue;
ptr.flags = newValue.getFlags();
// Keep the keyrepeat going between modulated keys. // Keep the keyrepeat going between modulated keys.
if ((old_flags & ptr.flags & KeyValue.FLAG_PRECISE_REPEAT) == 0) }
{ else
stopKeyRepeat(ptr); {
stopKeyRepeat(ptr);
if ((newValue.flags & KeyValue.FLAG_NOREPEAT) == 0)
startKeyRepeat(ptr); startKeyRepeat(ptr);
} _handler.onPointerSwipe(newValue);
_handler.onPointerDown(true);
} }
} }
} }
@@ -265,17 +182,10 @@ public final class Pointers implements Handler.Callback
_ptrs.remove(ptr); _ptrs.remove(ptr);
} }
private Pointer getLatched(Pointer target) private Pointer getLatched(KeyValue kv)
{ {
return getLatched(target.key, target.value);
}
private Pointer getLatched(KeyboardData.Key k, KeyValue v)
{
if (v == null)
return null;
for (Pointer p : _ptrs) for (Pointer p : _ptrs)
if (p.key == k && p.pointerId == -1 && p.value != null && p.value.equals(v)) if (p.value == kv && p.pointerId == -1)
return p; return p;
return null; return null;
} }
@@ -288,24 +198,21 @@ public final class Pointers implements Handler.Callback
// Latched and not locked, remove // Latched and not locked, remove
if (ptr.pointerId == -1 && (ptr.flags & KeyValue.FLAG_LOCKED) == 0) if (ptr.pointerId == -1 && (ptr.flags & KeyValue.FLAG_LOCKED) == 0)
_ptrs.remove(i); _ptrs.remove(i);
// Not latched but pressed, don't latch once released and stop long press. // Not latched but pressed, don't latch once released
else if ((ptr.flags & KeyValue.FLAG_LATCH) != 0) else if ((ptr.flags & KeyValue.FLAG_LATCH) != 0)
ptr.flags &= ~KeyValue.FLAG_LATCH; ptr.flags &= ~KeyValue.FLAG_LATCH;
} }
} }
/** Make a pointer into the locked state. */ /** Check if a pointer is within a radius of 'pointerTooClose' */
private void lockPointer(Pointer ptr, boolean shouldVibrate) private boolean isPointerNearby(float x, float y)
{ {
ptr.flags = (ptr.flags & ~KeyValue.FLAG_LOCK) | KeyValue.FLAG_LOCKED; for (Pointer p : _ptrs)
_handler.onPointerFlagsChanged(shouldVibrate);
}
private boolean isModulatedKeyPressed()
{
for (Pointer ptr : _ptrs)
{ {
if ((ptr.flags & KeyValue.FLAG_PRECISE_REPEAT) != 0) float dx = p.downX + p.ptrDistX - x;
float dy = p.downY + p.ptrDistY - y;
float d = Math.abs(dx) + Math.abs(dy);
if (d < _config.pointerTooClose)
return true; return true;
} }
return false; return false;
@@ -321,33 +228,26 @@ public final class Pointers implements Handler.Callback
{ {
if (ptr.timeoutWhat == msg.what) if (ptr.timeoutWhat == msg.what)
{ {
if (handleKeyRepeat(ptr)) long nextInterval = _config.longPressInterval;
_keyrepeat_handler.sendEmptyMessageDelayed(msg.what, nextRepeatInterval(ptr)); if (_config.preciseRepeat && (ptr.flags & KeyValue.FLAG_PRECISE_REPEAT) != 0)
else {
ptr.timeoutWhat = -1; // Slower repeat for modulated keys
return true; nextInterval *= 2;
// Modulate repeat interval depending on the distance of the pointer
nextInterval = (long)((float)nextInterval / modulatePreciseRepeat(ptr));
}
_keyrepeat_handler.sendEmptyMessageDelayed(msg.what, nextInterval);
_handler.onPointerHold(ptr.value);
return (true);
} }
} }
return false; return (false);
}
private long nextRepeatInterval(Pointer ptr)
{
long t = _config.longPressInterval;
if (_config.preciseRepeat && (ptr.flags & KeyValue.FLAG_PRECISE_REPEAT) != 0)
{
// Modulate repeat interval depending on the distance of the pointer
t = (long)((float)t * 2.f / modulatePreciseRepeat(ptr));
}
return t;
} }
private static int uniqueTimeoutWhat = 0; private static int uniqueTimeoutWhat = 0;
private void startKeyRepeat(Pointer ptr) private void startKeyRepeat(Pointer ptr)
{ {
if (ptr.value == null)
return;
int what = (uniqueTimeoutWhat++); int what = (uniqueTimeoutWhat++);
ptr.timeoutWhat = what; ptr.timeoutWhat = what;
long timeout = _config.longPressTimeout; long timeout = _config.longPressTimeout;
@@ -367,137 +267,56 @@ public final class Pointers implements Handler.Callback
} }
} }
/** A pointer is repeating. Returns [true] if repeat should continue. */
private boolean handleKeyRepeat(Pointer ptr)
{
// Long press toggle lock on modifiers
if ((ptr.flags & KeyValue.FLAG_LATCH) != 0)
{
lockPointer(ptr, true);
return false;
}
// Stop repeating: Latched key, special keys
if (ptr.pointerId == -1 || (ptr.flags & KeyValue.FLAG_SPECIAL) != 0)
return false;
_handler.onPointerHold(ptr.value, ptr.modifiers);
return true;
}
private float modulatePreciseRepeat(Pointer ptr) private float modulatePreciseRepeat(Pointer ptr)
{ {
float ptrDist = Math.abs(ptr.ptrDistX) + Math.abs(ptr.ptrDistY);
if (ptr.repeatingPtrDist < 0.f) if (ptr.repeatingPtrDist < 0.f)
ptr.repeatingPtrDist = ptr.ptrDist; // First repeat ptr.repeatingPtrDist = ptrDist; // First repeat
if (ptr.ptrDist > ptr.repeatingPtrDist * 2.f) if (ptrDist > ptr.repeatingPtrDist * 2.f)
ptr.repeatingPtrDist = ptr.ptrDist / 2.f; // Large swipe, move the middle point ptr.repeatingPtrDist = ptrDist / 2.f; // Large swipe, move the middle point
float left = ptr.repeatingPtrDist / 2.f; float left = ptr.repeatingPtrDist / 2.f;
float accel = (ptr.ptrDist - left) / (ptr.repeatingPtrDist - left); float accel = (ptrDist - left) / (ptr.repeatingPtrDist - left);
return Math.min(8.f, Math.max(0.1f, accel)); return Math.min(8.f, Math.max(0.1f, accel));
} }
private static final class Pointer private final class Pointer
{ {
/** -1 when latched. */ /** -1 when latched. */
public int pointerId; public int pointerId;
/** The Key pressed by this Pointer */ public KeyboardData.Key key;
public final KeyboardData.Key key;
/** Current direction. */
public int selected_direction;
/** Selected value with [modifiers] applied. */
public KeyValue value; public KeyValue value;
public float downX; public float downX;
public float downY; public float downY;
/** Distance of the pointer to the initial press. */ /** Distance of the pointer to the initial press. */
public float ptrDist; public float ptrDistX;
/** Modifier flags at the time the key was pressed. */ public float ptrDistY;
public Modifiers modifiers;
/** Flags of the value. Latch, lock and locked flags are updated. */
public int flags; public int flags;
/** Identify timeout messages. */ /** Identify timeout messages. */
public int timeoutWhat; public int timeoutWhat;
/** ptrDist at the first repeat, -1 otherwise. */ /** ptrDist at the first repeat, -1 otherwise. */
public float repeatingPtrDist; public float repeatingPtrDist;
public Pointer(int p, KeyboardData.Key k, KeyValue v, float x, float y, Modifiers m) public Pointer(int p, KeyboardData.Key k, KeyValue v, float x, float y)
{ {
pointerId = p; pointerId = p;
key = k; key = k;
selected_direction = 0;
value = v; value = v;
downX = x; downX = x;
downY = y; downY = y;
ptrDist = 0.f; ptrDistX = 0.f;
modifiers = m; ptrDistY = 0.f;
flags = (v == null) ? 0 : v.getFlags(); flags = (v == null) ? 0 : v.flags;
timeoutWhat = -1; timeoutWhat = -1;
repeatingPtrDist = -1.f; repeatingPtrDist = -1.f;
} }
} }
/** Represent modifiers currently activated.
Sorted in the order they should be evaluated. */
public static final class Modifiers
{
private final KeyValue.Modifier[] _mods;
private final int _size;
private Modifiers(KeyValue.Modifier[] m, int s)
{
_mods = m; _size = s;
}
public KeyValue.Modifier get(int i) { return _mods[_size - 1 - i]; }
public int size() { return _size; }
@Override
public int hashCode() { return Arrays.hashCode(_mods); }
@Override
public boolean equals(Object obj)
{
return Arrays.equals(_mods, ((Modifiers)obj)._mods);
}
public static final Modifiers EMPTY =
new Modifiers(new KeyValue.Modifier[0], 0);
protected static Modifiers ofArray(KeyValue.Modifier[] mods, int size)
{
// Sort and remove duplicates and nulls.
if (size > 1)
{
Arrays.sort(mods, 0, size);
int j = 0;
for (int i = 0; i < size; i++)
{
KeyValue.Modifier m = mods[i];
if (m != null && (i + 1 >= size || m != mods[i + 1]))
{
mods[j] = m;
j++;
}
}
size = j;
}
return new Modifiers(mods, size);
}
}
public interface IPointerEventHandler public interface IPointerEventHandler
{ {
/** Key can be modified or removed by returning [null]. */ public void onPointerDown(KeyValue k);
public KeyValue modifyKey(KeyValue k, Modifiers flags); public void onPointerSwipe(KeyValue k);
public void onPointerUp(KeyValue k);
/** A key is pressed. [getModifiers()] is uptodate. Might be called after a public void onPointerFlagsChanged();
press or a swipe to a different value. */ public void onPointerHold(KeyValue k);
public void onPointerDown(boolean isSwipe);
/** Key is released. [k] is the key that was returned by
[modifySelectedKey] or [modifySelectedKey]. */
public void onPointerUp(KeyValue k, Modifiers flags);
/** Flags changed because latched or locked keys or cancelled pointers. */
public void onPointerFlagsChanged(boolean shouldVibrate);
/** Key is repeating. */
public void onPointerHold(KeyValue k, Modifiers flags);
} }
} }

View File

@@ -1,7 +1,5 @@
package juloo.keyboard2; package juloo.keyboard2;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceActivity; import android.preference.PreferenceActivity;
@@ -10,20 +8,7 @@ public class SettingsActivity extends PreferenceActivity
@Override @Override
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState)
{ {
detectSystemTheme();
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings); addPreferencesFromResource(R.xml.settings);
} }
/** The default theme is [Theme.DeviceDefault], which is dark. Detect if the
system is using light theme. */
void detectSystemTheme()
{
if (Build.VERSION.SDK_INT >= 14)
{
int ui_mode = getResources().getConfiguration().uiMode;
if ((ui_mode & Configuration.UI_MODE_NIGHT_NO) != 0)
setTheme(android.R.style.Theme_DeviceDefault_Light);
}
}
} }

View File

@@ -18,14 +18,10 @@ public class Theme
public final float keyBorderRadius; public final float keyBorderRadius;
public final int colorNavBar;
public final boolean isLightNavBar;
private final Paint _keyLabelPaint; private final Paint _keyLabelPaint;
private final Paint _specialKeyLabelPaint; private final Paint _specialKeyLabelPaint;
private final Paint _keySubLabelPaint; private final Paint _keySubLabelPaint;
private final Paint _specialKeySubLabelPaint; private final Paint _specialKeySubLabelPaint;
private final Paint _indicationPaint;
public Theme(Context context, AttributeSet attrs) public Theme(Context context, AttributeSet attrs)
{ {
@@ -33,8 +29,6 @@ public class Theme
keyBgPaint.setColor(s.getColor(R.styleable.keyboard_colorKey, 0)); keyBgPaint.setColor(s.getColor(R.styleable.keyboard_colorKey, 0));
keyDownBgPaint.setColor(s.getColor(R.styleable.keyboard_colorKeyActivated, 0)); keyDownBgPaint.setColor(s.getColor(R.styleable.keyboard_colorKeyActivated, 0));
// colorKeyboard = s.getColor(R.styleable.keyboard_colorKeyboard, 0); // colorKeyboard = s.getColor(R.styleable.keyboard_colorKeyboard, 0);
colorNavBar = s.getColor(R.styleable.keyboard_navigationBarColor, 0);
isLightNavBar = s.getBoolean(R.styleable.keyboard_windowLightNavigationBar, false);
labelColor = s.getColor(R.styleable.keyboard_colorLabel, 0); labelColor = s.getColor(R.styleable.keyboard_colorLabel, 0);
activatedColor = s.getColor(R.styleable.keyboard_colorLabelActivated, 0); activatedColor = s.getColor(R.styleable.keyboard_colorLabelActivated, 0);
lockedColor = s.getColor(R.styleable.keyboard_colorLabelLocked, 0); lockedColor = s.getColor(R.styleable.keyboard_colorLabelLocked, 0);
@@ -43,10 +37,9 @@ public class Theme
s.recycle(); s.recycle();
_keyLabelPaint = initLabelPaint(Paint.Align.CENTER, null); _keyLabelPaint = initLabelPaint(Paint.Align.CENTER, null);
_keySubLabelPaint = initLabelPaint(Paint.Align.LEFT, null); _keySubLabelPaint = initLabelPaint(Paint.Align.LEFT, null);
Typeface specialKeyFont = getKeyFont(context); Typeface specialKeyFont = getSpecialKeyFont(context);
_specialKeyLabelPaint = initLabelPaint(Paint.Align.CENTER, specialKeyFont); _specialKeyLabelPaint = initLabelPaint(Paint.Align.CENTER, specialKeyFont);
_specialKeySubLabelPaint = initLabelPaint(Paint.Align.LEFT, specialKeyFont); _specialKeySubLabelPaint = initLabelPaint(Paint.Align.LEFT, specialKeyFont);
_indicationPaint = initLabelPaint(Paint.Align.CENTER, null);
} }
public Paint labelPaint(boolean special_font) public Paint labelPaint(boolean special_font)
@@ -62,11 +55,6 @@ public class Theme
return p; return p;
} }
public Paint indicationPaint()
{
return _indicationPaint;
}
private Paint initLabelPaint(Paint.Align align, Typeface font) private Paint initLabelPaint(Paint.Align align, Typeface font)
{ {
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
@@ -76,12 +64,14 @@ public class Theme
return (paint); return (paint);
} }
private static Typeface _key_font = null; private static Typeface _specialKeyFont = null;
static public Typeface getKeyFont(Context context) static public Typeface getSpecialKeyFont(Context context)
{ {
if (_key_font == null) if (_specialKeyFont == null)
_key_font = Typeface.createFromAsset(context.getAssets(), "special_font.ttf"); {
return _key_font; _specialKeyFont = Typeface.createFromAsset(context.getAssets(), "fonts/keys.ttf");
}
return _specialKeyFont;
} }
} }

Some files were not shown because too many files have changed in this diff Show More