Compare commits
165 Commits
Author | SHA1 | Date | |
---|---|---|---|
cb2ea83f8a | |||
90cad963ec | |||
bf31872955 | |||
199ca5cf03 | |||
87d21685ca | |||
8665d002bf | |||
f0fcd791ec | |||
cd2c2357ed | |||
c17b53ce7f | |||
940fc81193 | |||
523de040be | |||
804ea84981 | |||
aaf3d8b630 | |||
19c38ca6a2 | |||
e745c81269 | |||
09d984a1ab | |||
69994a55c5 | |||
ebdacbc2b2 | |||
122a9c23d0 | |||
6fb15b3f16 | |||
9a0e03f644 | |||
f7e16c0345 | |||
64c7c8ce20 | |||
c1751578ef | |||
2aa98de7aa | |||
078dbcd5ff | |||
22a7df6632 | |||
e213834f67 | |||
b102ad9078 | |||
51b330c616 | |||
815e30a505 | |||
4d99bd4f4b | |||
d644d2bf0e | |||
fc68f2e07d | |||
8350efaa83 | |||
ef34303c7e | |||
f1ce6abe5a | |||
29fbb27a8a | |||
fdebae929b | |||
25cefc5890 | |||
30198acddd | |||
96db0397f0 | |||
d2128e777e | |||
6a7fbf5e50 | |||
1e067c9863 | |||
ebe66eb740 | |||
d2328d4b9a | |||
7edfd81db1 | |||
67e46e2da3 | |||
4f3fcfe64b | |||
2e598a4d47 | |||
e01a2733b1 | |||
e1145d3851 | |||
baec5a76ee | |||
ea0b873dd8 | |||
6aa4740702 | |||
ff0c0354d6 | |||
344df4c5c1 | |||
36e10a792f | |||
55cece7965 | |||
167c63ee25 | |||
f56b926857 | |||
75df3afda6 | |||
7fb5c992b6 | |||
158a3577be | |||
138e59f13a | |||
db347c665c | |||
8be80eecd4 | |||
d9a8688237 | |||
7f51cf001a | |||
1909f2fcb4 | |||
fc8bb3a539 | |||
dda8f0314d | |||
5873b7315d | |||
64e263a1af | |||
90b9b0e399 | |||
5169472dfc | |||
3081af5190 | |||
c778b4e8a2 | |||
65210fb14f | |||
d8882c87ae | |||
2fc40512c6 | |||
5811643562 | |||
a365fdc6a3 | |||
9fc1565065 | |||
b0a2298899 | |||
81f07b427f | |||
0b388b93c7 | |||
25a6e71ee8 | |||
617f0878bc | |||
773194ca4a | |||
bc8bcce82a | |||
4f5ce66347 | |||
85d798299e | |||
dec0a7471b | |||
53b9afa973 | |||
081e9a6e53 | |||
bfde31da6e | |||
324756535e | |||
2d8ed2d858 | |||
929b30f723 | |||
3033091f9d | |||
fdd640ef09 | |||
13a13ecbb6 | |||
d5836ebb97 | |||
db8ebc2f4d | |||
1d406e948f | |||
1ddd089166 | |||
1951448f9e | |||
ff01678ba6 | |||
d74e8f3b08 | |||
ab987c776c | |||
6e5be63e25 | |||
402bf4990e | |||
fda53e3952 | |||
ef03dfed5c | |||
e0131fa6b0 | |||
b236a74b64 | |||
f6338a652b | |||
9a42fa4dca | |||
4d104eacf3 | |||
31d6a70dfb | |||
7462955507 | |||
9aac7900c0 | |||
088d46d6e6 | |||
5cc7fdf6d7 | |||
cc571ea1ca | |||
c1a816d3d4 | |||
e10c587dc5 | |||
d03e96da3e | |||
b3b7877a3b | |||
02124dd71f | |||
e4e54628b7 | |||
4127aa6f03 | |||
4f9375373e | |||
9b154a2495 | |||
646ff4834d | |||
815025aaa9 | |||
d9f2fdf8bf | |||
2e81cb5cf7 | |||
89dfc782a7 | |||
eb42943327 | |||
121a2ba76f | |||
82d3290c6a | |||
b15ca662c2 | |||
9a48acfe3e | |||
bce0a98f62 | |||
a27c64479f | |||
7da7a5082d | |||
80600ed659 | |||
3b1c652370 | |||
8cb1789eeb | |||
04a7ec4bb8 | |||
8e0d38c257 | |||
b72635b887 | |||
84af72c222 | |||
2df4764557 | |||
39952f8bdf | |||
ab4c73f9f3 | |||
e52e537fd7 | |||
2900e8d197 | |||
d8e475467a | |||
fec3f109c9 | |||
f9f44fbd7d | |||
914599f16a |
16
.github/workflows/check-translations.yml
vendored
Normal file
@ -0,0 +1,16 @@
|
||||
name: Check translations
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
check-translations:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v3
|
||||
- run: python3 sync_translations.py
|
||||
- name: Check that strings files are uptodate, run python3 sync_translations.py otherwise
|
||||
run: git diff --exit-code
|
32
.github/workflows/make-apk.yml
vendored
@ -9,38 +9,25 @@ jobs:
|
||||
Build-Apk:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Cache fontforge and extra dependencies
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: /usr/local/bin
|
||||
key: usr-local-bin
|
||||
- name: Install latest FontForge version (using AppImage)
|
||||
run: |
|
||||
# Get most recent version of FontForge
|
||||
# Using AppImage there is no dependecy problem, it is the latest version and it's easier to cache
|
||||
cd /usr/local/bin
|
||||
sudo wget -c -N https://github.com/fontforge/fontforge/releases/download/20220308/FontForge-2022-03-08-582bd41-x86_64.AppImage
|
||||
sudo chmod +x ./FontForge-2022-03-08-582bd41-x86_64.AppImage
|
||||
sudo ln --symbolic --force /usr/local/bin/FontForge-2022-03-08-582bd41-x86_64.AppImage /usr/local/bin/fontforge
|
||||
- uses: actions/setup-java@v2
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'zulu' # See 'Supported distributions' for available options
|
||||
java-version: '11'
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
- name: Cache debug certificate
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: _build/debug.keystore
|
||||
key: debug-keystore
|
||||
- name: Restore debug keystore from github Secrets
|
||||
run: |
|
||||
mkdir -p _build
|
||||
cd "$GITHUB_WORKSPACE/_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
|
||||
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"
|
||||
@ -48,8 +35,13 @@ jobs:
|
||||
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@v2
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: debug apk
|
||||
name: "${{env.artifact}} debug_apk"
|
||||
path: _build/*.apk
|
||||
|
@ -1,18 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="juloo.keyboard2" android:versionCode="21" android:versionName="1.14.2" android:hardwareAccelerated="false">
|
||||
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="30"/>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="juloo.keyboard2" android:versionCode="29" android:versionName="1.20.0" android:hardwareAccelerated="false">
|
||||
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="31"/>
|
||||
<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">
|
||||
<service android:name="juloo.keyboard2.Keyboard2" android:label="@string/app_name" android:permission="android.permission.BIND_INPUT_METHOD" android:exported="true" android:directBootAware="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.view.InputMethod"/>
|
||||
</intent-filter>
|
||||
<meta-data android:name="android.view.im" android:resource="@xml/method"/>
|
||||
</service>
|
||||
<activity android:name="juloo.keyboard2.SettingsActivity" android:icon="@drawable/ic_launcher" android:label="@string/settings_activity_label" android:theme="@style/android:Theme.Material">
|
||||
<activity android:name="juloo.keyboard2.SettingsActivity" android:icon="@drawable/ic_launcher" android:label="@string/settings_activity_label" android:theme="@style/android:Theme.DeviceDefault" android:exported="true" android:directBootAware="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
||||
</manifest>
|
||||
|
@ -12,7 +12,8 @@ Fortunately, there's not many dependencies:
|
||||
- Android SDK: build tools (minimum `28.0.1`), platform `30`
|
||||
- Make sure to have the `$ANDROID_HOME` environment variable set.
|
||||
|
||||
For Nix users, there's a `shell.nix` for setting-up the right environment.
|
||||
For Nix users, the right environment can be obtained with `nix-shell ./shell.nix`.
|
||||
Instructions to install Nix are [here](https://nixos.wiki/wiki/Nix_Installation_Guide).
|
||||
|
||||
Building the debug apk:
|
||||
|
||||
@ -20,8 +21,7 @@ Building the debug apk:
|
||||
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
|
||||
|
||||
@ -78,26 +78,59 @@ make installd
|
||||
|
||||
## Guidelines
|
||||
|
||||
### Add a localized layout
|
||||
### Adding a layout
|
||||
|
||||
Localized layouts (a layout specific to a language) are generally accepted.
|
||||
Layouts are defined in XML, see `res/xml/qwerty.xml`.
|
||||
|
||||
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).
|
||||
|
||||
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.
|
||||
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.
|
||||
They don't need to contain every ASCII characters (although it's useful in
|
||||
passwords) and dead-keys.
|
||||
|
||||
### Add a programming layout
|
||||
### Adding support for a language
|
||||
|
||||
A programming layout must contains every ASCII characters as well as every dead-keys.
|
||||
Currently, the only example is QWERTY.
|
||||
Supported locales are defined in `res/xml/method.xml`.
|
||||
|
||||
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 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).
|
||||
Translations are always welcome !
|
||||
|
||||
The store description is found in `metadata/android/<locale>/`, `short_description.txt` and `full_description.txt`.
|
||||
The full description changes very infrequently (it was changed once in 6 years). But if it changes too much, outdated translation might be removed.
|
||||
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).
|
||||
|
||||
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.
|
||||
The store description is found in `metadata/android/<locale>/`,
|
||||
`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.
|
||||
|
19
Makefile
@ -22,7 +22,10 @@ clean:
|
||||
rm -rf _build/*.dex _build/class _build/gen _build/*.apk _build/*.unsigned-apk \
|
||||
_build/*.idsig _build/assets
|
||||
|
||||
.PHONY: release debug installd clean
|
||||
rebuild_special_font:
|
||||
cd srcs/special_font && fontforge -lang=ff -script build.pe *.svg
|
||||
|
||||
.PHONY: release debug installd clean rebuild_special_font
|
||||
|
||||
$(shell mkdir -p _build)
|
||||
|
||||
@ -85,6 +88,11 @@ _build/%.unaligned-apk: $(addprefix _build/,$(APK_EXTRA_FILES)) $(MANIFEST_FILE)
|
||||
-I $(ANDROID_PLATFORM)/android.jar -F "$@" $(AAPT_PACKAGE_FLAGS)
|
||||
cd $(@D) && $(ANDROID_BUILD_TOOLS)/aapt add $(@F) $(APK_EXTRA_FILES)
|
||||
|
||||
# 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
|
||||
|
||||
GEN_DIR = _build/gen
|
||||
@ -95,15 +103,6 @@ $(R_FILE): $(RES_FILES) $(MANIFEST_FILE)
|
||||
$(ANDROID_BUILD_TOOLS)/aapt package -f -m -S $(RES_DIR) -J $(GEN_DIR) \
|
||||
-M $(MANIFEST_FILE) -I $(ANDROID_PLATFORM)/android.jar
|
||||
|
||||
# Special font
|
||||
|
||||
SPECIAL_FONT_GLYPHS = $(wildcard $(CURDIR)/srcs/special_font/*.svg)
|
||||
SPECIAL_FONT_SCRIPT = $(CURDIR)/srcs/special_font/build.pe
|
||||
|
||||
_build/assets/special_font.ttf: $(SPECIAL_FONT_SCRIPT) $(SPECIAL_FONT_GLYPHS)
|
||||
mkdir -p $(@D)
|
||||
fontforge -lang=ff -script $(SPECIAL_FONT_SCRIPT) $(CURDIR)/$@ $(SPECIAL_FONT_GLYPHS)
|
||||
|
||||
# Compile java classes and build classes.dex
|
||||
|
||||
OBJ_DIR = _build/class
|
||||
|
@ -1,8 +1,9 @@
|
||||
# Unexpected Keyboard
|
||||
|
||||
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"/> |
|
||||
| --- | --- | --- |
|
||||
| <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..).
|
||||
|
||||
@ -18,7 +19,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.
|
||||
|
||||
- Multiple layouts: QWERTY, QWERTZ, AZERTY. Themes: White, Dark, OLED Black. And many other options.
|
||||
- Personalizable with many options, layouts and themes.
|
||||
|
||||
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.
|
||||
|
908
emoji_gen.py
@ -1,908 +0,0 @@
|
||||
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))
|
18
metadata/android/cs-CZ/full_description.txt
Normal file
@ -0,0 +1,18 @@
|
||||
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.
|
1
metadata/android/cs-CZ/short_description.txt
Normal file
@ -0,0 +1 @@
|
||||
Nenáročná virtuální klávesnice pro vývojáře.
|
1
metadata/android/cs-CZ/title.txt
Normal file
@ -0,0 +1 @@
|
||||
Klávesnice Unexpected
|
7
metadata/android/en-US/changelogs/22.txt
Normal file
@ -0,0 +1,7 @@
|
||||
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
|
9
metadata/android/en-US/changelogs/23.txt
Normal file
@ -0,0 +1,9 @@
|
||||
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
|
5
metadata/android/en-US/changelogs/24.txt
Normal file
@ -0,0 +1,5 @@
|
||||
Add back the vibration option.
|
||||
Fix localized keys not in predefined positions.
|
||||
Improvements to layouts.
|
||||
|
||||
Thanks to the contributors: @Thunder-Squirrel
|
12
metadata/android/en-US/changelogs/25.txt
Normal file
@ -0,0 +1,12 @@
|
||||
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
|
7
metadata/android/en-US/changelogs/26.txt
Normal file
@ -0,0 +1,7 @@
|
||||
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
|
11
metadata/android/en-US/changelogs/27.txt
Normal file
@ -0,0 +1,11 @@
|
||||
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
|
6
metadata/android/en-US/changelogs/28.txt
Normal file
@ -0,0 +1,6 @@
|
||||
Updated translations: Latvian
|
||||
|
||||
Fix crash when typing device password
|
||||
Increase target SDK version to 31
|
||||
|
||||
Thanks to the contributors: @eandersons
|
10
metadata/android/en-US/changelogs/29.txt
Normal file
@ -0,0 +1,10 @@
|
||||
New layouts: QWERTY (Polski)
|
||||
|
||||
Allow switching quickly between two layouts.
|
||||
Allow choosing opacity of the keyboard.
|
||||
Improved themes and rendering.
|
||||
Updated translations.
|
||||
Fixed key repeat bug when holding 3 keys.
|
||||
Tweaked the swipe gesture. Added some options.
|
||||
|
||||
Thanks to the contributors: @9-2-1, @ChasmSolacer
|
1
metadata/android/it-IT/short_description.txt
Normal file
@ -0,0 +1 @@
|
||||
Una Tastiera Virtuale Leggera Per La Programmazione
|
1
metadata/android/it-IT/title.txt
Normal file
@ -0,0 +1 @@
|
||||
Unexpected Keyboard
|
18
metadata/android/pl-PL/full_description.txt
Normal file
@ -0,0 +1,18 @@
|
||||
Ta aplikacja to klawiatura wirtualna dla Androida. Jej główne funkcjonalności obejmują łatwe wprowadzanie każdego znaku ASCII przy użyciu gestu przesunięcia, martwe klawisze dla znaków diakrytycznych i klawisze modyfikujące oraz obecność klawiszy specjalnych (tab, esc, strzałki, itp.).
|
||||
|
||||
Klawiatura mieści do czterech dodatkowych znaków w rogach każdego klawisza. Są one wprowadzane poprzez przesuwanie palcem po klawiszu.
|
||||
|
||||
Wyróźnione funkcjonalności:
|
||||
|
||||
- Wszystkie znaki i klawisze specjalne, które są również dostępne na klawiaturze komputerowej. Doskonałe do korzystania z aplikacji takich jak Termux.
|
||||
|
||||
- Obejmują one Tab, Esc, strzałki, klawisze funkcyjne oraz Ctrl i Alt !
|
||||
|
||||
- Znaki akcentowane uzyskuje się za pomocą martwych klawiszy. Najpierw naciśnij akcent, a następnie wpisz akcentowaną literę.
|
||||
|
||||
- Bardzo lekka i szybka. Zajmuje 500x mniej miejsca niż klawiatura Google i 15x mniej niż klawiatura domyślna. Bez reklam, bez śledzenia.
|
||||
|
||||
- Wiele układów: QWERTY, QWERTZ, AZERTY. Motywy: Biały, Ciemny, Czarny (OLED). Oraz wiele innych możliwości.
|
||||
|
||||
Tak jak każda inna klawiatura ekranowa, należy ją włączyć w ustawieniach systemowych. Otwórz Ustawienia i przejdź kolejno do:
|
||||
System > Języki i metody wprowadzania > Klawiatura ekranowa > Zarządzaj klawiaturami ekranowymi.
|
1
metadata/android/pl-PL/short_description.txt
Normal file
@ -0,0 +1 @@
|
||||
Lekka klawiatura wirtualna dla programistów.
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:hardwareAccelerated="false">
|
||||
<juloo.keyboard2.EmojiGroupButtonsBar android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
|
||||
<juloo.keyboard2.EmojiGridView android:id="@+id/emoji_grid" android:background="?attr/colorKeyboard" android:layout_width="fill_parent" android:layout_height="@dimen/emoji_grid_height"/>
|
||||
<juloo.keyboard2.EmojiGridView android:id="@+id/emoji_grid" android:layout_width="fill_parent" android:layout_height="@dimen/emoji_grid_height" android:orientation="vertical" android:numColumns="auto_fit" android:columnWidth="45sp" android:background="?attr/colorKeyboard"/>
|
||||
<LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
|
||||
<juloo.keyboard2.EmojiKeyButton style="@style/emojiKeyButton" key="switch_back_emoji"/>
|
||||
<juloo.keyboard2.EmojiKeyButton style="@style/emojiKeyButton" android:layout_weight="4" key="space"/>
|
||||
|
70
res/values-cs/strings.xml
Normal file
@ -0,0 +1,70 @@
|
||||
<?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_label_brightness">Adjust label brightness</string> -->
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</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_layout_e_custom">Custom layout</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_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_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</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_extra_keys_title">Add keys to the keyboard</string> -->
|
||||
<!-- <string name="pref_second_layout_title">Secondary layout</string> -->
|
||||
<string name="pref_second_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_theme_e_white">White</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="pref_category_advanced">Advanced</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_summary">See the source code. This option is not meant to be used.</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>
|
@ -1,28 +1,47 @@
|
||||
<?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 - Einstellungen</string>
|
||||
<string name="pref_category_layout">Layout</string>
|
||||
<!-- <string name="pref_label_brightness">Adjust label brightness</string> -->
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
|
||||
<string name="pref_layout_title">Tastaturlayout ändern</string>
|
||||
<string name="pref_layout_e_system">Systemeinstellung</string>
|
||||
<!-- <string name="pref_layout_e_custom">Custom layout</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_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_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_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</string> -->
|
||||
<string name="pref_autocapitalisation_title">Automatische Großschreibung</string>
|
||||
<string name="pref_autocapitalisation_summary">Shift-Taste am Satzanfang aktivieren</string>
|
||||
<string name="pref_extra_keys_title">Zusätzliche Zeichen zur Tastatur hinzufügen</string>
|
||||
<!-- <string name="pref_second_layout_title">Secondary layout</string> -->
|
||||
<string name="pref_second_layout_none">Keines</string>
|
||||
<string name="pref_category_typing">Tippen</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_long_timeout_title">Zeitüberschreitung bei 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_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_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_margin_bottom_title">Unterer Abstand</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_character_size_title">Größe der Beschriftung</string>
|
||||
<string name="pref_character_size_summary">Größe der Buchstaben auf den Tasten (%.2fx)</string>
|
||||
@ -31,6 +50,7 @@
|
||||
<string name="pref_theme_e_dark">Dunkel</string>
|
||||
<string name="pref_theme_e_light">Hell</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_short">Kurz</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@ -38,6 +58,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Sehr weit</string>
|
||||
<string name="pref_key_horizontal_space">Horizontaler Abstand zwischen den Tasten</string>
|
||||
<string name="pref_key_vertical_space">Vertikaler Abstand zwischen den Tasten</string>
|
||||
<!-- <string name="pref_category_advanced">Advanced</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_summary">See the source code. This option is not meant to be used.</string> -->
|
||||
<string name="key_action_next">Nächstes</string>
|
||||
<string name="key_action_done">Fertig</string>
|
||||
<string name="key_action_go">Los</string>
|
||||
|
@ -1,30 +1,47 @@
|
||||
<?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">Ajustes de Unexpected Keyboard</string>
|
||||
<string name="pref_category_layout">Formato</string>
|
||||
<!-- <string name="pref_label_brightness">Adjust label brightness</string> -->
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
|
||||
<string name="pref_layout_title">Cambiar formato de teclado</string>
|
||||
<string name="pref_layout_e_system">Ajustes del sistema</string>
|
||||
<!-- <string name="pref_layout_e_custom">Custom layout</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_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_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_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</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_second_layout_title">Secondary layout</string> -->
|
||||
<!-- <string name="pref_second_layout_none">None</string> -->
|
||||
<string name="pref_category_typing">Escribiendo</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_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_category_vibrate">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_duration_title">Duración</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_lockable_keys_title">Bloqueo de teclas modificadoras</string>
|
||||
<string name="pref_lockable_keys_summary">Teclas modificadoras que se pueden bloquear pulsándolas dos veces</string>
|
||||
<!-- <string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string> -->
|
||||
<!-- <string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</string> -->
|
||||
<string name="pref_category_style">Estilo</string>
|
||||
<string name="pref_margin_bottom_title">Margen del pie</string>
|
||||
<string name="pref_keyboard_height_title">Altura del teclado</string>
|
||||
<!-- <string name="pref_keyboard_height_landscape_title">Keyboard height in landscape mode</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_summary">Tamaño de caracteres mostrados en el teclado (%.2fx)</string>
|
||||
@ -33,6 +50,7 @@
|
||||
<string name="pref_theme_e_dark">Oscuro</string>
|
||||
<string name="pref_theme_e_light">Claro</string>
|
||||
<string name="pref_theme_e_black">Negro</string>
|
||||
<!-- <string name="pref_theme_e_white">White</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Muy corto</string>
|
||||
<string name="pref_swipe_dist_e_short">Corto</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@ -40,6 +58,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Muy lejano</string>
|
||||
<string name="pref_key_horizontal_space">Espaciado horizontal entre las teclas</string>
|
||||
<string name="pref_key_vertical_space">Espaciado vertical entre las teclas</string>
|
||||
<!-- <string name="pref_category_advanced">Advanced</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_summary">See the source code. This option is not meant to be used.</string> -->
|
||||
<string name="key_action_next">Siguiente</string>
|
||||
<string name="key_action_done">Hecho</string>
|
||||
<string name="key_action_go">Ir</string>
|
||||
|
@ -1,36 +1,56 @@
|
||||
<?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 Paramètres</string>
|
||||
<string name="pref_category_layout">Disposition</string>
|
||||
<string name="pref_label_brightness">Luminosité des symboles</string>
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
|
||||
<string name="pref_layout_title">Disposition des touches</string>
|
||||
<string name="pref_layout_e_system">Paramètre système</string>
|
||||
<string name="pref_layout_e_custom">Disposition personnalisée</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_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_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_numpad_layout">Disposition du pavé numérique</string>
|
||||
<string name="pref_numpad_layout_e_high_first">Du plus haut au plus bas</string>
|
||||
<string name="pref_numpad_layout_e_low_first">Du plus bas au plus haut</string>
|
||||
<string name="pref_autocapitalisation_title">Majuscule automatique</string>
|
||||
<string name="pref_autocapitalisation_summary">Activer Shift au début des phrases</string>
|
||||
<string name="pref_extra_keys_title">Ajouter des touches au clavier</string>
|
||||
<string name="pref_second_layout_title">Disposition secondaire</string>
|
||||
<string name="pref_second_layout_none">Aucune</string>
|
||||
<string name="pref_category_typing">Saisie</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_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_category_vibrate">Vibration</string>
|
||||
<string name="pref_long_interval_title">Écart entre les répétitions</string>
|
||||
<string name="pref_vibrate_title">Vibreur</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_summary">Modifier la vitesse de répétition en bougeant le doigt</string>
|
||||
<string name="pref_lock_double_tap_title">Appuyer deux fois pour bloquer la majuscule</string>
|
||||
<string name="pref_lock_double_tap_summary">Un appui long bloque la majuscule</string>
|
||||
<string name="pref_category_style">Style</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_landscape_title">Hauteur du clavier en mode paysage</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 symboles</string>
|
||||
<string name="pref_character_size_summary">Taille des caractères affichés sur les touches (%.2fx)</string>
|
||||
<string name="pref_theme">Thème</string>
|
||||
<string name="pref_theme_e_system">Paramètre système</string>
|
||||
<string name="pref_theme_e_dark">Sombre</string>
|
||||
<string name="pref_theme_e_light">Clair</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_short">Courte</string>
|
||||
<string name="pref_swipe_dist_e_default">Normale</string>
|
||||
@ -38,6 +58,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Très longue</string>
|
||||
<string name="pref_key_horizontal_space">Espacement horizontal entre les touches</string>
|
||||
<string name="pref_key_vertical_space">Espacement vertical entre les touches</string>
|
||||
<string name="pref_category_advanced">Avancé</string>
|
||||
<string name="pref_custom_layout_title">Disposition personnalisée</string>
|
||||
<string name="pref_custom_layout_summary">Cette option n\'est pas faite pour être utilisée.</string>
|
||||
<string name="key_action_next">Suiv.</string>
|
||||
<string name="key_action_done">Fin</string>
|
||||
<string name="key_action_go">Aller</string>
|
||||
|
70
res/values-it/strings.xml
Normal file
@ -0,0 +1,70 @@
|
||||
<?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_label_brightness">Adjust label brightness</string> -->
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
|
||||
<string name="pref_layout_title">Cambia layout tastiera</string>
|
||||
<string name="pref_layout_e_system">Impostazioni di sistema</string>
|
||||
<!-- <string name="pref_layout_e_custom">Custom layout</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_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_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</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_extra_keys_title">Add keys to the keyboard</string> -->
|
||||
<!-- <string name="pref_second_layout_title">Secondary layout</string> -->
|
||||
<string name="pref_second_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_theme_e_white">White</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="pref_category_advanced">Advanced</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_summary">See the source code. This option is not meant to be used.</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>
|
@ -1,28 +1,47 @@
|
||||
<?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_label_brightness">Adjust label brightness</string> -->
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
|
||||
<string name="pref_layout_title">키보드 레이아웃 변경</string>
|
||||
<string name="pref_layout_e_system">시스템 세팅</string>
|
||||
<!-- <string name="pref_layout_e_custom">Custom layout</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_all">모든 언어의 악센트 표시</string>
|
||||
<string name="pref_accents_e_none">모든 언어의 악센트 숨기기</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_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</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_second_layout_title">Secondary layout</string> -->
|
||||
<!-- <string name="pref_second_layout_none">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_category_vibrate">진동</string>
|
||||
<string name="pref_vibrate_title">진동</string>
|
||||
<string name="pref_vibrate_summary">키 누를 때 진동 키거/끄기</string>
|
||||
<string name="pref_vibrate_duration_title">지속 시간</string>
|
||||
<string name="pref_precise_repeat_title">정확한 커서 움직임</string>
|
||||
<string name="pref_precise_repeat_summary">더 많거나 적은 스와이프로 키 반복 조절</string>
|
||||
<!-- <string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string> -->
|
||||
<!-- <string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</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">Keyboard height in landscape mode</string> -->
|
||||
<string name="pref_horizontal_margin_title">양 옆 넓이</string>
|
||||
<string name="pref_character_size_title">폰트 크기</string>
|
||||
<string name="pref_character_size_summary">키보드의 표시되는 폰트 크기 (%.2fx)</string>
|
||||
@ -31,6 +50,7 @@
|
||||
<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_theme_e_white">White</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>
|
||||
@ -38,6 +58,9 @@
|
||||
<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="pref_category_advanced">Advanced</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_summary">See the source code. This option is not meant to be used.</string> -->
|
||||
<string name="key_action_next">다음</string>
|
||||
<string name="key_action_done">확인</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
|
@ -1,11 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<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="extra_horizontal_margin">20dp</dimen>
|
||||
<dimen name="extra_horizontal_margin">25dp</dimen>
|
||||
</resources>
|
||||
|
@ -1,28 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<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="pref_category_layout">Izkārtojums</string>
|
||||
<!-- <string name="pref_label_brightness">Adjust label brightness</string> -->
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
|
||||
<string name="pref_layout_title">Mainīt tastatūras izkārtojumu</string>
|
||||
<string name="pref_layout_e_system">Ierīces iestatījumi</string>
|
||||
<!-- <string name="pref_layout_e_custom">Custom layout</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_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_show_numpad_title">Rādīt ciparnīcu</string>
|
||||
<string name="pref_show_numpad_never">Nekad</string>
|
||||
<string name="pref_show_numpad_landscape">Tikai guleniskajā skatā</string>
|
||||
<string name="pref_show_numpad_always">Vienmēr</string>
|
||||
<!-- <string name="pref_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</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_second_layout_title">Secondary layout</string> -->
|
||||
<string name="pref_second_layout_none">Neviens</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_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_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_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_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_margin_bottom_title">Apakšējā apmale</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_character_size_title">Iezīmes izmērs</string>
|
||||
<string name="pref_character_size_summary">Tastatūrā attēloto rakstzīmju izmērs (%.2fx)</string>
|
||||
@ -31,11 +50,17 @@
|
||||
<string name="pref_theme_e_dark">Tumšs</string>
|
||||
<string name="pref_theme_e_light">Gaišs</string>
|
||||
<string name="pref_theme_e_black">Melns</string>
|
||||
<string name="pref_theme_e_white">Balts</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Ļoti tuvs</string>
|
||||
<string name="pref_swipe_dist_e_short">Tuvs</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_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="pref_category_advanced">Advanced</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_summary">See the source code. This option is not meant to be used.</string> -->
|
||||
<string name="key_action_next">Nākamais</string>
|
||||
<string name="key_action_done">Darīts</string>
|
||||
<string name="key_action_go">Aiziet</string>
|
||||
|
70
res/values-pl/strings.xml
Normal file
@ -0,0 +1,70 @@
|
||||
<?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">Ustawienia Unexpected Keyboard</string>
|
||||
<string name="pref_category_layout">Układ</string>
|
||||
<string name="pref_label_brightness">Dostosuj jasność znaków</string>
|
||||
<string name="pref_keyboard_opacity">Nieprzezroczystość tła klawiatury</string>
|
||||
<string name="pref_key_opacity">Nieprzezroczystość klawisza</string>
|
||||
<string name="pref_key_activated_opacity">Nieprzezroczystość naciśniętego klawisza</string>
|
||||
<string name="pref_layout_title">Zmień układ klawiatury</string>
|
||||
<string name="pref_layout_e_system">Systemowy</string>
|
||||
<string name="pref_layout_e_custom">Własny układ</string>
|
||||
<string name="pref_accents_title">Znaki diakrytyczne</string>
|
||||
<string name="pref_accents_e_all_installed">Pokaż znaki diakryt. dla wszystkich zainstalowanych języków</string>
|
||||
<string name="pref_accents_e_selected">Pokaż znaki diakryt. tylko dla wybranego języka</string>
|
||||
<string name="pref_accents_e_none">Ukryj znaki diakrytyczne</string>
|
||||
<string name="pref_show_numpad_title">Pokaż klawiaturę numeryczną</string>
|
||||
<string name="pref_show_numpad_never">Nigdy</string>
|
||||
<string name="pref_show_numpad_landscape">Tylko w orientacji poziomej</string>
|
||||
<string name="pref_show_numpad_always">Zawsze</string>
|
||||
<string name="pref_numpad_layout">Układ klawiatury numerycznej</string>
|
||||
<string name="pref_numpad_layout_e_high_first">Od największej cyfry</string>
|
||||
<string name="pref_numpad_layout_e_low_first">Od najmniejszej cyfry</string>
|
||||
<string name="pref_autocapitalisation_title">Automatyczne wielkie litery</string>
|
||||
<string name="pref_autocapitalisation_summary">Naciśnij Shift na początku zdania</string>
|
||||
<string name="pref_extra_keys_title">Dodaj klawisze do klawiatury</string>
|
||||
<string name="pref_second_layout_title">Drugi układ</string>
|
||||
<string name="pref_second_layout_none">Żaden</string>
|
||||
<string name="pref_category_typing">Pisanie</string>
|
||||
<string name="pref_swipe_dist_title">Odległość przesuwania</string>
|
||||
<string name="pref_swipe_dist_summary">Odległość znaków od rogów klawiszy (%s)</string>
|
||||
<string name="pref_long_timeout_title">Opóźnienie powtarzania naciśnięć klawisza</string>
|
||||
<string name="pref_long_interval_title">Czas pomiędzy powtórzeniami</string>
|
||||
<string name="pref_vibrate_title">Wibracja</string>
|
||||
<string name="pref_vibrate_summary">Wł./wył. wibrację przy naciśnięciu klawisza</string>
|
||||
<string name="pref_precise_repeat_title">Dokładne poruszanie kursorem</string>
|
||||
<string name="pref_precise_repeat_summary">Reguluj prędkość powtarzania naciśnięć klawisza poprzez przesunięcie dalej lub bliżej</string>
|
||||
<string name="pref_lock_double_tap_title">Naciśnij Shift podwójnie, aby włączyć caps lock</string>
|
||||
<string name="pref_lock_double_tap_summary">Możesz zablokować modyfikator poprzez jego długie naciśnięcie</string>
|
||||
<string name="pref_category_style">Styl</string>
|
||||
<string name="pref_margin_bottom_title">Margines dolny</string>
|
||||
<string name="pref_keyboard_height_title">Wysokość klawiatury</string>
|
||||
<string name="pref_keyboard_height_landscape_title">Wysokość klawiatury w orientacji poziomej</string>
|
||||
<string name="pref_horizontal_margin_title">Margines poziomy</string>
|
||||
<string name="pref_character_size_title">Wielkość znaku</string>
|
||||
<string name="pref_character_size_summary">Wielkość znaków widocznych na klawiaturze (%.2fx)</string>
|
||||
<string name="pref_theme">Motyw</string>
|
||||
<string name="pref_theme_e_system">Systemowy</string>
|
||||
<string name="pref_theme_e_dark">Ciemny</string>
|
||||
<string name="pref_theme_e_light">Jasny</string>
|
||||
<string name="pref_theme_e_black">Czarny</string>
|
||||
<string name="pref_theme_e_white">Biały</string>
|
||||
<string name="pref_swipe_dist_e_very_short">Bardzo mała</string>
|
||||
<string name="pref_swipe_dist_e_short">Mała</string>
|
||||
<string name="pref_swipe_dist_e_default">Normalna</string>
|
||||
<string name="pref_swipe_dist_e_far">Duża</string>
|
||||
<string name="pref_swipe_dist_e_very_far">Bardzo duża</string>
|
||||
<string name="pref_key_horizontal_space">Odległość pomiędzy klawiszami w poziomie</string>
|
||||
<string name="pref_key_vertical_space">Odległość pomiędzy klawiszami w pionie</string>
|
||||
<string name="pref_category_advanced">Zaawansowane</string>
|
||||
<string name="pref_custom_layout_title">Własny układ</string>
|
||||
<string name="pref_custom_layout_summary">Zobacz kod źródłowy. Ta opcja nie jest przeznaczona do użycia.</string>
|
||||
<string name="key_action_next">Dalej</string>
|
||||
<string name="key_action_done">OK</string>
|
||||
<string name="key_action_go">Przejdź</string>
|
||||
<string name="key_action_prev">Wstecz</string>
|
||||
<string name="key_action_search">Szukaj</string>
|
||||
<string name="key_action_send">Wyślij</string>
|
||||
</resources>
|
@ -1,34 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" product="debug">Unexpected Keyboard</string>
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="settings_activity_label">Configurações Unexpected Keyboard</string>
|
||||
<string name="app_name" product="debug">Teclado Unexpected</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_label_brightness">Adjust label brightness</string> -->
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</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_custom">Custom layout</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_selected">Mostrar acentos só para o idioma selecionado</string>
|
||||
<string name="pref_accents_e_all">Mostrar todos acentos</string>
|
||||
<string name="pref_accents_e_none">Ocultar acentos</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_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_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</string> -->
|
||||
<string name="pref_autocapitalisation_title">Maiusculização automática</string>
|
||||
<string name="pref_autocapitalisation_summary">Aciona o shift no início de cada frase</string>
|
||||
<!-- <string name="pref_extra_keys_title">Add keys to the keyboard</string> -->
|
||||
<!-- <string name="pref_second_layout_title">Secondary layout</string> -->
|
||||
<string name="pref_second_layout_none">Nenhum</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_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_interval_title">Intervalo de repetição de tecla</string>
|
||||
<string name="pref_category_vibrate">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_duration_title">Duração</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_lockable_keys_title">Teclas traváveis</string>
|
||||
<string name="pref_lockable_keys_summary">Teclas que podem ficar seguradas ao teclar duas vezes</string>
|
||||
<string name="pref_lock_double_tap_title">Tecle duas vezes no shift para caixa alta</string>
|
||||
<string name="pref_lock_double_tap_summary">Ao invés de apertar e segurar por um tempo</string>
|
||||
<string name="pref_category_style">Estilo</string>
|
||||
<string name="pref_margin_bottom_title">Margem inferior</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_character_size_title">Tamanho dos indicadores</string>
|
||||
<string name="pref_character_size_summary">Tamanho dos caracteres visíveis no teclado (%.2fx)</string>
|
||||
@ -37,6 +50,7 @@
|
||||
<string name="pref_theme_e_dark">Escuro</string>
|
||||
<string name="pref_theme_e_light">Claro</string>
|
||||
<string name="pref_theme_e_black">Preto</string>
|
||||
<!-- <string name="pref_theme_e_white">White</string> -->
|
||||
<string name="pref_swipe_dist_e_very_short">Muito curto</string>
|
||||
<string name="pref_swipe_dist_e_short">Curto</string>
|
||||
<string name="pref_swipe_dist_e_default">Normal</string>
|
||||
@ -44,6 +58,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Muito longo</string>
|
||||
<string name="pref_key_horizontal_space">Distância horizontal entre teclas</string>
|
||||
<string name="pref_key_vertical_space">Distância vertical entre teclas</string>
|
||||
<!-- <string name="pref_category_advanced">Advanced</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_summary">See the source code. This option is not meant to be used.</string> -->
|
||||
<string name="key_action_next">Próximo</string>
|
||||
<string name="key_action_done">Pronto</string>
|
||||
<string name="key_action_go">Ir</string>
|
||||
|
70
res/values-ru/strings.xml
Normal file
@ -0,0 +1,70 @@
|
||||
<?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_label_brightness">Adjust label brightness</string> -->
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
|
||||
<string name="pref_layout_title">Изменить раскладку клавиатуры</string>
|
||||
<string name="pref_layout_e_system">Системные настройки</string>
|
||||
<!-- <string name="pref_layout_e_custom">Custom layout</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_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_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</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_second_layout_title">Secondary layout</string> -->
|
||||
<string name="pref_second_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_lock_double_tap_title">Double tap on shift for caps lock</string> -->
|
||||
<!-- <string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</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_theme_e_white">White</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="pref_category_advanced">Advanced</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_summary">See the source code. This option is not meant to be used.</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>
|
70
res/values-tr/strings.xml
Normal file
@ -0,0 +1,70 @@
|
||||
<?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_label_brightness">Adjust label brightness</string> -->
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</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_layout_e_custom">Custom layout</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_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_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</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_second_layout_title">Secondary layout</string> -->
|
||||
<string name="pref_second_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_lock_double_tap_title">Double tap on shift for caps lock</string> -->
|
||||
<!-- <string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</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_keyboard_height_landscape_title">Keyboard height in landscape mode</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">Açık</string>
|
||||
<string name="pref_theme_e_black">Siyah</string>
|
||||
<!-- <string name="pref_theme_e_white">White</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="pref_category_advanced">Advanced</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_summary">See the source code. This option is not meant to be used.</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>
|
@ -4,29 +4,44 @@
|
||||
<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_label_brightness">调整字母亮度</string>
|
||||
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->
|
||||
<!-- <string name="pref_key_opacity">Adjust key opacity</string> -->
|
||||
<!-- <string name="pref_key_activated_opacity">Adjust pressed key opacity</string> -->
|
||||
<string name="pref_layout_title">改变键盘布局</string>
|
||||
<string name="pref_layout_e_system">系统设置</string>
|
||||
<!-- <string name="pref_layout_e_custom">Custom layout</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_all">显示所有声调符号</string>
|
||||
<string name="pref_accents_e_none">隐藏声调符号</string>
|
||||
<string name="pref_show_numpad_title">显示数字小键盘</string>
|
||||
<string name="pref_show_numpad_never">从不</string>
|
||||
<string name="pref_show_numpad_landscape">只在横屏显示</string>
|
||||
<string name="pref_show_numpad_always">一直显示</string>
|
||||
<!-- <string name="pref_numpad_layout">NumPad layout</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_high_first">High digits first</string> -->
|
||||
<!-- <string name="pref_numpad_layout_e_low_first">Low digits first</string> -->
|
||||
<string name="pref_autocapitalisation_title">句首自动大写</string>
|
||||
<string name="pref_autocapitalisation_summary">在句子的开头自动按下Shift</string>
|
||||
<string name="pref_extra_keys_title">选择要显示的按键</string>
|
||||
<string name="pref_second_layout_title">第二键盘布局</string>
|
||||
<string name="pref_second_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_category_vibrate">振动</string>
|
||||
<string name="pref_vibrate_title">振动</string>
|
||||
<string name="pref_vibrate_summary">启用或者禁用按下按键时振动</string>
|
||||
<string name="pref_vibrate_duration_title">每次振动持续的时间</string>
|
||||
<string name="pref_precise_repeat_title">精确控制光标移速</string>
|
||||
<string name="pref_precise_repeat_summary">按键重复按下速度由手指滑动的距离决定</string>
|
||||
<string name="pref_lockable_keys_title">组合键锁定</string>
|
||||
<string name="pref_lockable_keys_summary">可以通过输入两次锁定任何组合键(Ctrl, Alt, Fn, 声调符号等)</string>
|
||||
<string name="pref_lock_double_tap_title">双击Shift键锁定大写</string>
|
||||
<string name="pref_lock_double_tap_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>
|
||||
@ -35,6 +50,7 @@
|
||||
<string name="pref_theme_e_dark">暗色</string>
|
||||
<string name="pref_theme_e_light">亮色</string>
|
||||
<string name="pref_theme_e_black">黑色</string>
|
||||
<string name="pref_theme_e_white">白色</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>
|
||||
@ -42,6 +58,9 @@
|
||||
<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="pref_category_advanced">Advanced</string> -->
|
||||
<!-- <string name="pref_custom_layout_title">Custom layout</string> -->
|
||||
<!-- <string name="pref_custom_layout_summary">See the source code. This option is not meant to be used.</string> -->
|
||||
<string name="key_action_next">下一项</string>
|
||||
<string name="key_action_done">完成</string>
|
||||
<string name="key_action_go">前往</string>
|
||||
|
@ -1,53 +1,89 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string-array name="pref_layout_values">
|
||||
<item>system</item>
|
||||
<item>none</item>
|
||||
<item>azerty</item>
|
||||
<item>qwerty</item>
|
||||
<item>qwerty_pt</item>
|
||||
<item>qwerty_es</item>
|
||||
<item>qwerty_el</item>
|
||||
<item>qwerty_ko</item>
|
||||
<item>qwerty_lv</item>
|
||||
<item>qwerty_no</item>
|
||||
<item>qwerty_sv_se</item>
|
||||
<item>qwerty_hu</item>
|
||||
<item>qwerty_tr</item>
|
||||
<item>qwerty_pl</item>
|
||||
<item>ru_jcuken</item>
|
||||
<item>qwertz</item>
|
||||
<item>qwertz_cs</item>
|
||||
<item>qwertz_de</item>
|
||||
<item>qwertz_hu</item>
|
||||
<item>bgph1</item>
|
||||
<item>dvorak</item>
|
||||
<item>colemak</item>
|
||||
<item>neo2</item>
|
||||
<item>bone</item>
|
||||
<item>jcuken_ua</item>
|
||||
<item>bangla</item>
|
||||
<item>hindi</item>
|
||||
<item>custom</item>
|
||||
</string-array>
|
||||
<string-array name="pref_layout_entries">
|
||||
<item>@string/pref_layout_e_system</item>
|
||||
<item>None</item>
|
||||
<item>AZERTY</item>
|
||||
<item>QWERTY</item>
|
||||
<item>QWERTY (Brasileiro)</item>
|
||||
<item>QWERTY (Español)</item>
|
||||
<item>QWERTY (Greek)</item>
|
||||
<item>QWERTY (Korean)</item>
|
||||
<item>QWERTY (Latvian)</item>
|
||||
<item>QWERTY (Norwegian)</item>
|
||||
<item>QWERTY (Swedish)</item>
|
||||
<item>QWERTY (Hungarian)</item>
|
||||
<item>QWERTY (Türkçe)</item>
|
||||
<item>QWERTY (Polski)</item>
|
||||
<item>ЙЦУКЕН (Русский)</item>
|
||||
<item>QWERTZ</item>
|
||||
<item>QWERTZ (Czech)</item>
|
||||
<item>QWERTZ (Deutsch)</item>
|
||||
<item>QWERTZ (Hungarian)</item>
|
||||
<item>Bulgarian (Phonetic Traditional)</item>
|
||||
<item>Dvorak</item>
|
||||
</string-array>
|
||||
<string-array name="pref_programming_layout_values">
|
||||
<item>none</item>
|
||||
<item>qwerty</item>
|
||||
<item>dvorak</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>
|
||||
<item>Neo 2</item>
|
||||
<item>Bone</item>
|
||||
<item>ЙЦУКЕН (Українська)</item>
|
||||
<item>বাংলা</item>
|
||||
<item>हिन्दी</item>
|
||||
<item>@string/pref_layout_e_custom</item>
|
||||
</string-array>
|
||||
<string-array name="pref_accents_entries">
|
||||
<item>@string/pref_accents_e_all_installed</item>
|
||||
<item>@string/pref_accents_e_selected</item>
|
||||
<item>@string/pref_accents_e_all</item>
|
||||
<item>@string/pref_accents_e_none</item>
|
||||
</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_numpad_layout_values">
|
||||
<item>high_first</item>
|
||||
<item>low_first</item>
|
||||
</string-array>
|
||||
<string-array name="pref_numpad_layout_entries">
|
||||
<item>@string/pref_numpad_layout_e_high_first</item>
|
||||
<item>@string/pref_numpad_layout_e_low_first</item>
|
||||
</string-array>
|
||||
<string-array name="pref_accents_values">
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<item>3</item>
|
||||
<item>4</item>
|
||||
</string-array>
|
||||
<string-array name="pref_theme_entries">
|
||||
@ -55,12 +91,14 @@
|
||||
<item>@string/pref_theme_e_dark</item>
|
||||
<item>@string/pref_theme_e_light</item>
|
||||
<item>@string/pref_theme_e_black</item>
|
||||
<item>@string/pref_theme_e_white</item>
|
||||
</string-array>
|
||||
<string-array name="pref_theme_values">
|
||||
<item>system</item>
|
||||
<item>dark</item>
|
||||
<item>light</item>
|
||||
<item>black</item>
|
||||
<item>white</item>
|
||||
</string-array>
|
||||
<string-array name="pref_swipe_dist_entries">
|
||||
<item>@string/pref_swipe_dist_e_very_short</item>
|
||||
|
9
res/values/attrs.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<declare-styleable name="ExtraKeyCheckBoxPreference">
|
||||
<attr name="index" format="integer"/>
|
||||
</declare-styleable>
|
||||
<declare-styleable name="LayoutListPreference">
|
||||
<attr name="defaultString" format="string"/>
|
||||
</declare-styleable>
|
||||
</resources>
|
@ -4,31 +4,44 @@
|
||||
<string name="app_name" product="default">Unexpected Keyboard</string>
|
||||
<string name="settings_activity_label">Unexpected Keyboard Settings</string>
|
||||
<string name="pref_category_layout">Layout</string>
|
||||
<string name="pref_label_brightness">Adjust label brightness</string>
|
||||
<string name="pref_keyboard_opacity">Adjust keyboard background opacity</string>
|
||||
<string name="pref_key_opacity">Adjust key opacity</string>
|
||||
<string name="pref_key_activated_opacity">Adjust pressed key opacity</string>
|
||||
<string name="pref_layout_title">Change keyboard layout</string>
|
||||
<string name="pref_layout_e_system">System settings</string>
|
||||
<string name="pref_layout_e_custom">Custom layout</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_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_programming_layout_title">Keyboard layout for programming</string>
|
||||
<string name="pref_programming_layout_none">None</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_numpad_layout">NumPad layout</string>
|
||||
<string name="pref_numpad_layout_e_high_first">High digits first</string>
|
||||
<string name="pref_numpad_layout_e_low_first">Low digits first</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_second_layout_title">Secondary layout</string>
|
||||
<string name="pref_second_layout_none">None</string>
|
||||
<string name="pref_category_typing">Typing</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_long_timeout_title">Key repeat timeout</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_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_summary">Modulate key repeat speed by swiping more or less</string>
|
||||
<string name="pref_lockable_keys_title">Lockable modifiers</string>
|
||||
<string name="pref_lockable_keys_summary">Modifiers that can be locked by typing them twice</string>
|
||||
<string name="pref_lock_double_tap_title">Double tap on shift for caps lock</string>
|
||||
<string name="pref_lock_double_tap_summary">You can lock any modifier by holding it</string>
|
||||
<string name="pref_category_style">Style</string>
|
||||
<string name="pref_margin_bottom_title">Margin bottom</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_character_size_title">Label size</string>
|
||||
<string name="pref_character_size_summary">Size of characters displayed on the keyboard (%.2fx)</string>
|
||||
@ -37,6 +50,7 @@
|
||||
<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_theme_e_white">White</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_default">Normal</string>
|
||||
@ -44,6 +58,9 @@
|
||||
<string name="pref_swipe_dist_e_very_far">Very far</string>
|
||||
<string name="pref_key_horizontal_space">Horizontal spacing between the keys</string>
|
||||
<string name="pref_key_vertical_space">Vertical spacing between the keys</string>
|
||||
<string name="pref_category_advanced">Advanced</string>
|
||||
<string name="pref_custom_layout_title">Custom layout</string>
|
||||
<string name="pref_custom_layout_summary">See the source code. This option is not meant to be used.</string>
|
||||
<string name="key_action_next">Next</string>
|
||||
<string name="key_action_done">Done</string>
|
||||
<string name="key_action_go">Go</string>
|
||||
|
@ -17,8 +17,10 @@
|
||||
<item name="android:textColor">?attr/emoji_key_text</item>
|
||||
<item name="android:textSize">18dp</item>
|
||||
</style>
|
||||
<!-- Passed to TextView.setTextAppearance -->
|
||||
<style name="emojiGridButton">
|
||||
<item name="android:layout_width">fill_parent</item>
|
||||
<item name="android:layout_height">fill_parent</item>
|
||||
<item name="android:gravity">center</item>
|
||||
<item name="android:textSize">@dimen/emoji_text_size</item>
|
||||
<item name="android:textColor">?attr/emoji_color</item>
|
||||
</style>
|
||||
|
@ -11,62 +11,108 @@
|
||||
<attr name="colorLabel" format="color"/>
|
||||
<attr name="colorLabelActivated" format="color"/>
|
||||
<attr name="colorLabelLocked" format="color"/>
|
||||
<attr name="secondaryLightOffset" format="float"/>
|
||||
<!-- Corner labels -->
|
||||
<attr name="colorSubLabel" format="color"/>
|
||||
<!-- Dimens -->
|
||||
<!-- Borders -->
|
||||
<attr name="keyBorderRadius" format="dimension"/>
|
||||
<attr name="keyBorderWidth" format="dimension"/>
|
||||
<attr name="keyBorderWidthActivated" format="dimension"/>
|
||||
<attr name="keyBorderColorLeft" format="color"/>
|
||||
<attr name="keyBorderColorTop" format="color"/>
|
||||
<attr name="keyBorderColorRight" format="color"/>
|
||||
<attr name="keyBorderColorBottom" format="color"/>
|
||||
<!-- Emoji panel -->
|
||||
<attr name="emoji_button_bg" 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_text" type="color" format="color"/>
|
||||
<!-- System integration -->
|
||||
<attr name="navigationBarColor" format="color"/>
|
||||
<attr name="windowLightNavigationBar" format="boolean"/>
|
||||
</declare-styleable>
|
||||
<style name="Dark">
|
||||
<item name="android:isLightTheme">false</item>
|
||||
<style name="BaseTheme">
|
||||
<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="keyBorderWidth">0dp</item>
|
||||
<item name="keyBorderWidthActivated">0dp</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="colorKeyboard">#1b1b1b</item>
|
||||
<item name="colorKey">#333333</item>
|
||||
<item name="colorKeyActivated">#1b1b1b</item>
|
||||
<item name="keyBorderWidth">1.2dp</item>
|
||||
<item name="keyBorderWidthActivated">0dp</item>
|
||||
<item name="keyBorderColorBottom">#404040</item>
|
||||
<item name="colorLabel">#ffffff</item>
|
||||
<item name="colorLabelActivated">#3399ff</item>
|
||||
<item name="colorLabelLocked">#33cc33</item>
|
||||
<item name="colorSubLabel">#cccccc</item>
|
||||
<item name="keyBorderRadius">5dp</item>
|
||||
<item name="secondaryLightOffset">-0.2</item>
|
||||
<item name="emoji_button_bg" type="color">#202020</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 name="Light">
|
||||
<style name="Light" parent="BaseTheme">
|
||||
<item name="android:isLightTheme">true</item>
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="colorKeyboard">#e3e3e3</item>
|
||||
<item name="colorKey">#cccccc</item>
|
||||
<item name="colorKeyActivated">#e3e3e3</item>
|
||||
<item name="keyBorderWidth">0.6dp</item>
|
||||
<item name="keyBorderWidthActivated">0dp</item>
|
||||
<item name="keyBorderColorLeft">#cccccc</item>
|
||||
<item name="keyBorderColorTop">#eeeeee</item>
|
||||
<item name="keyBorderColorRight">#cccccc</item>
|
||||
<item name="keyBorderColorBottom">#aaaaaa</item>
|
||||
<item name="colorLabel">#000000</item>
|
||||
<item name="colorLabelActivated">#0066cc</item>
|
||||
<item name="colorLabelLocked">#33cc33</item>
|
||||
<item name="colorSubLabel">#333333</item>
|
||||
<item name="keyBorderRadius">5dp</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>
|
||||
<item name="secondaryLightOffset">+0.3</item>
|
||||
<item name="emoji_button_bg">#dedede</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
</style>
|
||||
<style name="Black">
|
||||
<style name="Black" parent="BaseTheme">
|
||||
<item name="android:isLightTheme">false</item>
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="colorKeyboard">#000000</item>
|
||||
<item name="colorKey">#000000</item>
|
||||
<item name="colorKeyActivated">#333333</item>
|
||||
<item name="keyBorderWidth">1dp</item>
|
||||
<item name="keyBorderWidthActivated">1dp</item>
|
||||
<item name="keyBorderColorLeft">#2a2a2a</item>
|
||||
<item name="keyBorderColorTop">#2a2a2a</item>
|
||||
<item name="keyBorderColorRight">#2a2a2a</item>
|
||||
<item name="keyBorderColorBottom">#2a2a2a</item>
|
||||
<item name="colorLabel">#eeeeee</item>
|
||||
<item name="colorLabelActivated">#009dff</item>
|
||||
<item name="colorLabelLocked">#00ff26</item>
|
||||
<item name="colorSubLabel">#bbbbbb</item>
|
||||
<item name="secondaryLightOffset">-0.25</item>
|
||||
<item name="keyBorderRadius">1dp</item>
|
||||
<item name="emoji_button_bg" type="color">#000000</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>
|
||||
<item name="emoji_button_bg">#000000</item>
|
||||
<item name="emoji_color">#ffffff</item>
|
||||
</style>
|
||||
<style name="White" parent="BaseTheme">
|
||||
<item name="android:isLightTheme">true</item>
|
||||
<item name="colorKeyboard">#ffffff</item>
|
||||
<item name="colorKey">#ffffff</item>
|
||||
<item name="keyBorderWidth">1dp</item>
|
||||
<item name="keyBorderWidthActivated">1dp</item>
|
||||
<item name="keyBorderColorLeft">#f0f0f0</item>
|
||||
<item name="keyBorderColorTop">#f0f0f0</item>
|
||||
<item name="keyBorderColorRight">#eeeeee</item>
|
||||
<item name="keyBorderColorBottom">#eeeeee</item>
|
||||
<item name="colorKeyActivated">#ffffff</item>
|
||||
<item name="colorLabel">#000000</item>
|
||||
<item name="colorLabelActivated">#0066cc</item>
|
||||
<item name="colorLabelLocked">#33cc33</item>
|
||||
<item name="colorSubLabel">#333333</item>
|
||||
<item name="secondaryLightOffset">+0.35</item>
|
||||
<item name="emoji_button_bg">#ffffff</item>
|
||||
<item name="emoji_color">#000000</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
@ -7,8 +7,6 @@
|
||||
<dimen name="key_vertical_interval">2dp</dimen>
|
||||
<dimen name="key_horizontal_interval">2dp</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_grid_height">250dp</dimen>
|
||||
<dimen name="emoji_text_size">28dp</dimen>
|
||||
|
@ -10,28 +10,28 @@
|
||||
<key key0="u" key2="7" key4="`"/>
|
||||
<key key0="i" key2="8" key3="_" key4="\\"/>
|
||||
<key key0="o" key2="9" key3="\@" key4="f11_placeholder"/>
|
||||
<key key0="p" key1="0" key3="f12_placeholder"/>
|
||||
<key key0="p" key2="0" key3="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="q" key2="tab"/>
|
||||
<key key0="s" key1="accent_ring" key3="ß"/>
|
||||
<key key0="s" key3="loc ß"/>
|
||||
<key key0="d" key1="accent_grave" key3="accent_aigu"/>
|
||||
<key key0="f" key3="{" key4="}"/>
|
||||
<key key0="g" key3="[" key4="]"/>
|
||||
<key key0="h" key3="=" key4="+"/>
|
||||
<key key0="j" key1="accent_trema" key2="accent_circonflexe" key3="^"/>
|
||||
<key key0="k" key2="€" key3="$" key4="£"/>
|
||||
<key key0="k" key2="€" key3="$"/>
|
||||
<key key0="l" key2="%"/>
|
||||
<key key0="m" key3="*"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="2.0" key0="shift"/>
|
||||
<key width="2.0" key0="shift" key2="loc capslock"/>
|
||||
<key key0="w" key3="<" key4=">"/>
|
||||
<key key0="x"/>
|
||||
<key key0="c" key1="accent_cedille" key3="," key4="\?"/>
|
||||
<key key0="v" key3=";" key4="."/>
|
||||
<key key0="b" key3=":" key4="/"/>
|
||||
<key key0="n" key1="accent_tilde" key2="§" key4="!"/>
|
||||
<key key0="n" key1="loc accent_tilde" key2="§" key4="!"/>
|
||||
<key width="2.0" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
37
res/xml/bangla.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?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="<" key4=">"/>
|
||||
<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="&"/>
|
||||
<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>
|
45
res/xml/bone.xml
Normal file
@ -0,0 +1,45 @@
|
||||
<?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="<" key4="8"/>
|
||||
<key key0="l" key1="ℓ" key3=">" key4="9"/>
|
||||
<key key0="m" key1="≠" key3="=" key4="f11_placeholder"/>
|
||||
<key key0="w" key3="&" 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=""" key3="+" key4="2"/>
|
||||
<key key0="q" key1="'" 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_second" 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>
|
@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<row height="0.95">
|
||||
<key width="1.8" key0="ctrl" key2="meta" key4="switch_numeric"/>
|
||||
<key width="1.2" key0="fn" key1="alt" key2="change_method" key3="switch_emoji" key4="config"/>
|
||||
<key width="4.0" key0="space" key1="switch_programming" edgekeys="true"/>
|
||||
<key width="1.8" key0="ctrl" key1="loc switch_greekmath" 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_second" edgekeys="true"/>
|
||||
<key width="1.2" key1="up" key2="right" key3="left" key4="down" edgekeys="true"/>
|
||||
<key width="1.8" key0="enter" key2="action"/>
|
||||
</row>
|
||||
|
40
res/xml/colemak.xml
Normal file
@ -0,0 +1,40 @@
|
||||
<?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=""" 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="&" 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=">" key2="<"/>
|
||||
<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>
|
@ -2,32 +2,32 @@
|
||||
<keyboard>
|
||||
<row>
|
||||
<key key0="shift" width="1.5" key2="esc" key4="tab"/>
|
||||
<key key0="p" key1="accent_ring" key2="." key3="<" key4="f11_placeholder"/>
|
||||
<key key0="y" key1="accent_grave" key2="," key3=">" key4="f12_placeholder"/>
|
||||
<key key0="f" key4="€"/>
|
||||
<key key0="p" key1="loc accent_ring" key2="." key3="<" key4="f11_placeholder"/>
|
||||
<key key0="y" key1="loc accent_grave" key2="," key3=">" key4="f12_placeholder"/>
|
||||
<key key0="f" key4="loc €"/>
|
||||
<key key0="g" key2="\\" key3="|"/>
|
||||
<key key0="c" key1="accent_trema" key2="accent_circonflexe" key3="{" key4="}"/>
|
||||
<key key0="c" key1="loc accent_trema" key2="loc accent_circonflexe" key3="{" key4="}"/>
|
||||
<key key0="r" key3="[" key4="]"/>
|
||||
<key key0="l" key2="=" key3="+" key4="£"/>
|
||||
<key key0="l" key2="=" key3="+" key4="loc £"/>
|
||||
<key key0="backspace" key2="delete" width="1.5"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="a" key2="1" key4="!"/>
|
||||
<key key0="o" key1="accent_macron" key2="2" key3="\@"/>
|
||||
<key key0="e" key1="accent_caron" key2="3" key3="\#"/>
|
||||
<key key0="u" key2="4" key3="$"/>
|
||||
<key key0="o" key1="loc accent_macron" key2="2" key3="\@" key4="loc accent_ogonek"/>
|
||||
<key key0="e" key1="loc accent_caron" key2="3" key3="\#" key4="loc accent_dot_above"/>
|
||||
<key key0="u" key2="4" key3="$" key4="loc accent_double_aigu"/>
|
||||
<key key0="i" key2="5" key3="%"/>
|
||||
<key key0="d" key2="6" key3="^"/>
|
||||
<key key0="h" key2="7" key3="&"/>
|
||||
<key key0="t" key2="8" key3="*"/>
|
||||
<key key0="n" key2="9" key3="(" key4=")"/>
|
||||
<key key0="s" key1="0" key3="ß"/>
|
||||
<key key0="s" key2="0" key3="loc ß"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="q" shift="0.5" key1="accent_tilde" key2="`" key3="~"/>
|
||||
<key key0="j" key1="accent_aigu" key2="'" key3="""/>
|
||||
<key key0="q" shift="0.5" key1="loc accent_tilde" key2="`" key3="~"/>
|
||||
<key key0="j" key1="loc accent_aigu" key2="'" key3="""/>
|
||||
<key key0="k" key2=";" key3=":"/>
|
||||
<key key0="x" key1="accent_cedille"/>
|
||||
<key key0="x" key1="loc accent_cedille"/>
|
||||
<key key0="b"/>
|
||||
<key key0="m" key2="/" key3="\?"/>
|
||||
<key key0="w"/>
|
||||
|
47
res/xml/greekmath.xml
Normal file
@ -0,0 +1,47 @@
|
||||
<?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>
|
37
res/xml/hindi.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?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="<" key4=">"/>
|
||||
<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="&"/>
|
||||
<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>
|
42
res/xml/jcuken_ua.xml
Normal file
@ -0,0 +1,42 @@
|
||||
<?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="&"/>
|
||||
<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="<" key3="."/>
|
||||
<key key0="и" key2=">" key3=","/>
|
||||
<key key0="т" key2="\?" key3="/"/>
|
||||
<key key0="ь" key2=":" key3=";"/>
|
||||
<key key0="б" key2=""" key3="'"/>
|
||||
<key key0="ю" key1="«" key2="»"/>
|
||||
<key width="1.1" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
@ -9,28 +9,28 @@
|
||||
<key key0="ъ" key2="6" key3="^" key4="€"/>
|
||||
<key key0="у" key2="7" key3="&" key4="§"/>
|
||||
<key key0="и" key2="8" key3="*"/>
|
||||
<key key0="о" key1="accent_macron" key2="9" key3="(" key4=")"/>
|
||||
<key key0="п" key1="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
<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="с" key2="£"/>
|
||||
<key key0="д" key1="accent_grave" key3="accent_aigu"/>
|
||||
<key key0="с"/>
|
||||
<key key0="д"/>
|
||||
<key key0="ф"/>
|
||||
<key key0="г" key1="accent_caron" key2="-" key3="_"/>
|
||||
<key key0="г" key2="-" key3="_"/>
|
||||
<key key0="х" key2="=" key3="+"/>
|
||||
<key key0="й" key1="accent_trema" key2="accent_circonflexe" key4="}" key3="{"/>
|
||||
<key key0="й" key4="}" key3="{"/>
|
||||
<key key0="к" key2="ш" key3="[" key4="]"/>
|
||||
<key key0="л" key1="щ" key2="|" key3="\\" key4="ю"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="з"/>
|
||||
<key key0="ь" key1="accent_ring" key3="ѝ"/>
|
||||
<key key0="ц" key1="accent_cedille" key2="<" key3="."/>
|
||||
<key key0="ь" key3="ѝ"/>
|
||||
<key key0="ц" key2="<" key3="."/>
|
||||
<key key0="ж" key2=">" key3=","/>
|
||||
<key key0="б" key2="\?" key3="/"/>
|
||||
<key key0="н" key1="accent_tilde" key2=":" key3=";"/>
|
||||
<key key0="н" key2=":" key3=";"/>
|
||||
<key key0="м" key2=""" key3="'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
|
@ -10,12 +10,12 @@
|
||||
<key key0="г" key2="7" key3="&"/>
|
||||
<key key0="ш" key2="8" key3="*"/>
|
||||
<key key0="щ" key2="9" key3="(" key4=")"/>
|
||||
<key key0="з" key2="0"/>
|
||||
<key key0="х" key1="{" key2="}" key4="f11_placeholder"/>
|
||||
<key key0="ъ" key1="[" key2="]" key4="f12_placeholder"/>
|
||||
<key key0="з" key2="0" key3="{" key4="}" />
|
||||
<key key0="х" key3="[" key4="]" key1="f11_placeholder" key2="f12_placeholder"/>
|
||||
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="ф" key1="tab" key2="`"/>
|
||||
<key key0="ф" key1="tab" key2="`"/>
|
||||
<key key0="ы"/>
|
||||
<key key0="в"/>
|
||||
<key key0="а"/>
|
||||
@ -28,16 +28,16 @@
|
||||
<key key0="э" key2="|" key3="\\"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key key0="я"/>
|
||||
<key key0="ч"/>
|
||||
<key key0="с"/>
|
||||
<key key0="м"/>
|
||||
<key key0="и" key2="<" key3="."/>
|
||||
<key key0="т" key2=">" key3=","/>
|
||||
<key key0="ь" key2="\?" key3="/"/>
|
||||
<key key0="б" key2=":" key3=";"/>
|
||||
<key key0="ю" key2=""" key3="'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
<key width="1.18" key0="shift" key2="loc capslock"/>
|
||||
<key width="0.96" key0="я"/>
|
||||
<key width="0.96" key0="ч"/>
|
||||
<key width="0.96" key0="с"/>
|
||||
<key width="0.96" key0="м"/>
|
||||
<key width="0.96" key0="и" key2="<" key3="."/>
|
||||
<key width="0.96" key0="т" key2=">" key3=","/>
|
||||
<key width="0.96" key0="ь" key1="ъ" key2="\?" key3="/"/>
|
||||
<key width="0.96" key0="б" key2=":" key3=";"/>
|
||||
<key width="0.96" key0="ю" key2=""" key3="'"/>
|
||||
<key width="1.18" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
||||
|
@ -1,15 +1,26 @@
|
||||
<?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">
|
||||
<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="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="bn" android:imeSubtypeLocale="bn_BD" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="default_layout=qwerty,extra_keys=৳"/>
|
||||
<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-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="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="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="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="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="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>
|
||||
|
49
res/xml/neo2.xml
Normal file
@ -0,0 +1,49 @@
|
||||
<?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="<"/>
|
||||
<key key0="g" key2="8" key4=">"/>
|
||||
<key key0="f" key2="9" key3="f11_placeholder" key4="="/>
|
||||
<key key0="q" key2="0" key3="f12_placeholder" key4="&"/>
|
||||
<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=""" 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_second" 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>
|
@ -1,12 +1,12 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard bottom_row="false">
|
||||
<keyboard bottom_row="false" extra_keys="false" num_pad="false">
|
||||
<row>
|
||||
<key width="0.75" key0="esc" key2="~" key4="!"/>
|
||||
<key width="0.75" key0="(" key2="[" key4="{"/>
|
||||
<key key0="7" key1="<" key2=">"/>
|
||||
<key key0="8" key2="∞"/>
|
||||
<key key0="9" key2="π"/>
|
||||
<key width="0.75" key0="*" key1="√" key2="×"/>
|
||||
<key width="0.75" key0="*" key1="√" key2="×" key3="\#"/>
|
||||
<key width="0.75" key0="/" key1="%" key3="÷"/>
|
||||
</row>
|
||||
<row>
|
||||
@ -19,11 +19,12 @@
|
||||
<key width="0.75" key0="-" key1="^"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.35" width="1.15" key0="shift" key2="fn" key4="alt"/>
|
||||
<key width="0.75" key0="switch_greekmath"/>
|
||||
<key width="0.75" key0="shift" key2="fn" key4="loc alt"/>
|
||||
<key key0="1" key1="superscript" key2="ordinal" key3="subscript"/>
|
||||
<key key0="2"/>
|
||||
<key key0="3"/>
|
||||
<key width="1.15" key0="backspace" key2="delete"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
<row height="0.95">
|
||||
<key width="1.5" key0="switch_text" key2="ctrl"/>
|
||||
|
27
res/xml/numpad.xml
Normal file
@ -0,0 +1,27 @@
|
||||
<?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>
|
27
res/xml/pin.xml
Normal file
@ -0,0 +1,27 @@
|
||||
<?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>
|
@ -3,34 +3,34 @@
|
||||
<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="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="&"/>
|
||||
<key key0="i" key2="8" key3="*"/>
|
||||
<key key0="o" key1="accent_macron" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key1="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
<key key0="o" key1="loc accent_macron" 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="`"/>
|
||||
<key key0="s" key1="accent_ring" key3="ß"/>
|
||||
<key key0="d" key1="accent_grave" key2="£" key3="accent_aigu"/>
|
||||
<key key0="f"/>
|
||||
<key key0="g" key1="accent_caron" key2="-" key3="_"/>
|
||||
<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="accent_trema" key2="accent_circonflexe" key4="}" key3="{"/>
|
||||
<key key0="k" key3="[" key4="]"/>
|
||||
<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"/>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z"/>
|
||||
<key key0="x"/>
|
||||
<key key0="c" key1="accent_cedille" key2="<" key3="."/>
|
||||
<key key0="c" key1="loc accent_cedille" key2="<" key3="."/>
|
||||
<key key0="v" key2=">" key3=","/>
|
||||
<key key0="b" key2="\?" key3="/"/>
|
||||
<key key0="n" key1="accent_tilde" key2=":" key3=";"/>
|
||||
<key key0="n" key1="loc accent_tilde" key2=":" key3=";"/>
|
||||
<key key0="m" key2=""" key3="'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
|
37
res/xml/qwerty_el.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?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="&"/>
|
||||
<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="<" key3="."/>
|
||||
<key key0="ω" key2=">" key3=","/>
|
||||
<key key0="β" key2="\?" key3="/"/>
|
||||
<key key0="ν" key2=":" key3=";"/>
|
||||
<key key0="μ" key2=""" key3="'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
@ -9,26 +9,26 @@
|
||||
<key key0="y" key2="6" key3="^"/>
|
||||
<key key0="u" key2="7" key3="&"/>
|
||||
<key key0="i" key2="8" key3="*"/>
|
||||
<key key0="o" key1="accent_macron" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key1="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
<key key0="o" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="a" key2="tab" key4="`"/>
|
||||
<key key0="s" key1="accent_ring" key2="¡" key3="ß"/>
|
||||
<key key0="d" key1="accent_grave" key2="£" key3="accent_aigu"/>
|
||||
<key key0="s" key2="¡" key3="loc ß"/>
|
||||
<key key0="d" key1="accent_grave" key3="accent_aigu"/>
|
||||
<key key0="f"/>
|
||||
<key key0="g" key1="accent_caron" key2="-" key3="_"/>
|
||||
<key key0="g" key2="-" key3="_"/>
|
||||
<key key0="h" key2="=" key3="+"/>
|
||||
<key key0="j" key1="accent_trema" key2="accent_circonflexe" key4="}" key3="{"/>
|
||||
<key key0="j" key1="accent_trema" key4="}" key3="{"/>
|
||||
<key key0="k" key3="[" key4="]"/>
|
||||
<key key0="l" key2="|" key3="\\"/>
|
||||
<key key0="ñ" key1="·" key3="ç" />
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z"/>
|
||||
<key key0="x"/>
|
||||
<key key0="c" key1="accent_cedille" key2="<" key3="."/>
|
||||
<key key0="c" key1="loc accent_cedille" key2="<" key3="."/>
|
||||
<key key0="v" key2=">" key3=","/>
|
||||
<key key0="b" key2="\?" key3="/" key4="¿"/>
|
||||
<key key0="n" key1="accent_tilde" key2=":" key3=";"/>
|
||||
|
37
res/xml/qwerty_hu.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?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=""" 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="<" key4=">"/>
|
||||
<key key0="x" key4="\#"/>
|
||||
<key key0="c" key4="&"/>
|
||||
<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>
|
@ -3,19 +3,19 @@
|
||||
<row>
|
||||
<key key0="ㅂ" key2="1" key4="esc"/>
|
||||
<key key0="ㅈ" key1="~" key2="2" key3="\@"/>
|
||||
<key key0="ㄷ" key1="!" key2="3" key3="\#" key4="€"/>
|
||||
<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="&"/>
|
||||
<key key0="ㅑ" key2="8" key3="*"/>
|
||||
<key key0="ㅐ" key2="9" key3="(" key4=")"/>
|
||||
<key key0="ㅔ" key1="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
<key key0="ㅔ" key2="0" key3="f11_placeholder" key4="f12_placeholder"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="ㅁ" key1="tab" key2="`"/>
|
||||
<key key0="ㄴ" key3="ß"/>
|
||||
<key key0="ㅇ" key2="£"/>
|
||||
<key key0="ㄴ"/>
|
||||
<key key0="ㅇ"/>
|
||||
<key key0="ㄹ"/>
|
||||
<key key0="ㅎ" key2="-" key3="_"/>
|
||||
<key key0="ㅗ" key2="=" key3="+"/>
|
||||
@ -24,7 +24,7 @@
|
||||
<key key0="ㅣ" key2="|" key3="\\"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="ㅋ"/>
|
||||
<key key0="ㅌ"/>
|
||||
<key key0="ㅊ" key2="<" key3="."/>
|
||||
|
@ -10,13 +10,13 @@
|
||||
<key key0="u" key1="ū" key2="7" key3="&" key4="*"/>
|
||||
<key key0="i" key1="ī" key2="8" key3="(" key4=")"/>
|
||||
<key key0="o" key1="ō" key2="9" key3="{" key4="}"/>
|
||||
<key key0="p" key1="0"/>
|
||||
<key key0="p" key2="0"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="ā" key2="tab"/>
|
||||
<key key0="s" key1="š" key3="ß"/>
|
||||
<key key0="d" key2="£"/>
|
||||
<key key0="f"/>
|
||||
<key key0="s" key1="š" key3="loc ß" key4="loc accent_ogonek"/>
|
||||
<key key0="d"/>
|
||||
<key key0="f" key1="loc accent_dot_above"/>
|
||||
<key key0="g" key1="ģ"/>
|
||||
<key key0="h" key2="accent_macron" key3="accent_caron" key4="accent_cedille"/>
|
||||
<key key0="j" key1="+" key2="=" key3="-" key4="_"/>
|
||||
@ -24,7 +24,7 @@
|
||||
<key key0="l" key1="ļ" key2="|" key3="/" key4="\\"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z" key1="ž"/>
|
||||
<key key0="x"/>
|
||||
<key key0="c" key1="č"/>
|
||||
|
37
res/xml/qwerty_no.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?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="&"/>
|
||||
<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="<" key3="."/>
|
||||
<key key0="v" key2=">" key3=","/>
|
||||
<key key0="b" key2="\?" key3="/"/>
|
||||
<key key0="n" key1="loc accent_tilde" key2=":" key3=";"/>
|
||||
<key key0="m" key2=""" key3="'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
37
res/xml/qwerty_pl.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?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="%"/>
|
||||
<key key0="y" key2="6" key3="^"/>
|
||||
<key key0="u" key2="7" key3="&" key4="loc €"/>
|
||||
<key key0="i" key1="loc accent_macron" 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="`" key4="ą"/>
|
||||
<key key0="s" key1="loc accent_ring" key3="loc ß" key4="ś"/>
|
||||
<key key0="d" key1="loc accent_grave" key2="loc £" key3="loc accent_aigu"/>
|
||||
<key key0="f" key1="loc accent_dot_above" key4="loc accent_ogonek"/>
|
||||
<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" key3="{" key4="}"/>
|
||||
<key key0="k" key1="loc accent_double_aigu" key3="[" key4="]"/>
|
||||
<key key0="l" key2="|" key3="\\" key4="ł"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z" key4="ż"/>
|
||||
<key key0="x" key4="ź"/>
|
||||
<key key0="c" key1="loc accent_cedille" key2="<" key3="." key4="ć"/>
|
||||
<key key0="v" key2=">" key3=","/>
|
||||
<key key0="b" key2="\?" key3="/"/>
|
||||
<key key0="n" key1="loc accent_tilde" key2=":" key3=";" key4="ń"/>
|
||||
<key key0="m" key2=""" key3="'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
@ -3,20 +3,20 @@
|
||||
<row>
|
||||
<key key0="q" key2="1" key4="esc"/>
|
||||
<key key0="w" key1="~" key2="2" key3="\@" key4="!"/>
|
||||
<key key0="e" key1="£" key2="3" key3="\#" key4="€"/>
|
||||
<key key0="e" key2="3" key3="\#" key4="€"/>
|
||||
<key key0="r" key2="4" key3="$" key4="f11_placeholder"/>
|
||||
<key key0="t" key2="5" key3="%" key4="f12_placeholder"/>
|
||||
<key key0="y" key1="accent_caron" key2="6" key3="^" key4="accent_trema"/>
|
||||
<key key0="y" key2="6" key3="^" key4="loc accent_trema"/>
|
||||
<key key0="u" key2="7" key3="&"/>
|
||||
<key key0="i" key2="8" key3="*"/>
|
||||
<key key0="o" key2="9" key3="(" key4=")"/>
|
||||
<key key0="p" key1="0" key3="\\"/>
|
||||
<key key0="p" key2="0" key3="\\"/>
|
||||
</row>
|
||||
<row>
|
||||
<key key0="a" key2="tab" key4="`"/>
|
||||
<key key0="s" key1="'" key3="ß" key4="accent_cedille"/>
|
||||
<key key0="d" key1=""" key2="accent_ring"/>
|
||||
<key key0="f" key2="accent_caron"/>
|
||||
<key key0="s" key1="'" key3="loc ß" key4="accent_cedille"/>
|
||||
<key key0="d" key1="""/>
|
||||
<key key0="f"/>
|
||||
<key key0="g"/>
|
||||
<key key0="h"/>
|
||||
<key key0="j" key1="-" key2="=" key4="+" key3="_"/>
|
||||
@ -25,7 +25,7 @@
|
||||
<key key0="ç" key1="|"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z"/>
|
||||
<key key0="x"/>
|
||||
<key key0="c"/>
|
||||
|
@ -15,9 +15,9 @@
|
||||
</row>
|
||||
<row>
|
||||
<key key0="a" key2="tab"/>
|
||||
<key key0="s" key1="accent_ring" key2="accent_cedille" key3="ß" key4="accent_tilde"/>
|
||||
<key key0="d" key1="accent_grave" key2="accent_caron" key3="accent_aigu"/>
|
||||
<key key0="f" key1="accent_trema" key2="accent_circonflexe"/>
|
||||
<key key0="s" key1="accent_ring" key3="loc ß"/>
|
||||
<key key0="d" key3="accent_aigu"/>
|
||||
<key key0="f" key1="accent_trema"/>
|
||||
<key key0="g"/>
|
||||
<key key0="h"/>
|
||||
<key key0="j" key1="{" key4="}"/>
|
||||
@ -27,7 +27,7 @@
|
||||
<key key0="ä" key1="'" key3="""/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="z"/>
|
||||
<key key0="x"/>
|
||||
<key key0="c"/>
|
||||
|
37
res/xml/qwerty_tr.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?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="&"/>
|
||||
<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="<" key3="."/>
|
||||
<key key0="v" key2=">" key3=","/>
|
||||
<key key0="b" key2="\?" key3="/"/>
|
||||
<key key0="n" key2=":" key3=";"/>
|
||||
<key key0="m" key2=""" key3="'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
@ -10,12 +10,12 @@
|
||||
<key key0="u" key2="7" key3="ü" key4="}"/>
|
||||
<key key0="i" key1="(" key2="8" key3="[" key4="]"/>
|
||||
<key key0="o" key1=")" key2="9" key3="ö" key4="="/>
|
||||
<key key0="p" key1="0" key3="\?"/>
|
||||
<key key0="p" key2="0" key3="\?"/>
|
||||
</row>
|
||||
<row>
|
||||
<key shift="0.5" key0="a" key1="tab" key2="`" key3="ä"/>
|
||||
<key key0="s" key3="ß"/>
|
||||
<key key0="d" key2="£"/>
|
||||
<key key0="d"/>
|
||||
<key key0="f" key1="~"/>
|
||||
<key key0="g" key3="-"/>
|
||||
<key key0="h" key3="+"/>
|
||||
@ -24,7 +24,7 @@
|
||||
<key key0="l" key1="'" key3="\#"/>
|
||||
</row>
|
||||
<row>
|
||||
<key width="1.5" key0="shift"/>
|
||||
<key width="1.5" key0="shift" key2="loc capslock"/>
|
||||
<key key0="y" key1=">" key2="|" key3="<"/>
|
||||
<key key0="x"/>
|
||||
<key key0="c"/>
|
||||
|
37
res/xml/qwertz_cs.xml
Normal file
@ -0,0 +1,37 @@
|
||||
<?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="<" key3="§" key4="š"/>
|
||||
<key key0="d" key1="$" key2="δ" key3="Δ" key4="ď"/>
|
||||
<key key0="f" key1=">" 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="&" key4="č"/>
|
||||
<key key0="v" key1="|" key3="\@"/>
|
||||
<key key0="b" key1=";" key2="♭" key3=":" key4="β"/>
|
||||
<key key0="n" key1="," key3="." key4="ň"/>
|
||||
<key key0="m" key1=""" key3="\'"/>
|
||||
<key width="1.5" key0="backspace" key2="delete"/>
|
||||
</row>
|
||||
</keyboard>
|
40
res/xml/qwertz_de.xml
Normal file
@ -0,0 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<keyboard>
|
||||
<row>
|
||||
<key key0="q" key2="1" key4="esc"/>
|
||||
<key key0="w" key1="^" key2="2" key3=""" 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="&"/>
|
||||
<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=">" key2="|" key3="<"/>
|
||||
<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>
|
38
res/xml/qwertz_hu.xml
Normal file
@ -0,0 +1,38 @@
|
||||
<?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=""" 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="<" key4=">"/>
|
||||
<key key0="x" key4="\#"/>
|
||||
<key key0="c" key4="&"/>
|
||||
<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>
|
||||
|
@ -1,37 +1,64 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<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"/>
|
||||
<juloo.keyboard2.LayoutListPreference android:key="layout" android:title="@string/pref_layout_title" app:defaultString="@string/pref_layout_e_system"/>
|
||||
<juloo.keyboard2.LayoutListPreference android:key="second_layout" android:title="@string/pref_second_layout_title" app:defaultString="@string/pref_second_layout_none"/>
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
<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"/>
|
||||
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="22"/>
|
||||
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="23"/>
|
||||
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="24"/>
|
||||
<juloo.keyboard2.ExtraKeyCheckBoxPreference app:index="25"/>
|
||||
</PreferenceScreen>
|
||||
<ListPreference android:key="numpad_layout" android:title="@string/pref_numpad_layout" android:summary="%s" android:defaultValue="high_first" android:entries="@array/pref_numpad_layout_entries" android:entryValues="@array/pref_numpad_layout_values"/>
|
||||
</PreferenceCategory>
|
||||
<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"/>
|
||||
<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"/>
|
||||
<CheckBoxPreference android:key="precise_repeat" android:title="@string/pref_precise_repeat_title" android:summary="@string/pref_precise_repeat_summary" android:defaultValue="true"/>
|
||||
<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"/>
|
||||
<CheckBoxPreference android:key="lockable_box" android:title="Box" android:defaultValue="false"/>
|
||||
</PreferenceScreen>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/pref_category_vibrate">
|
||||
<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"/>
|
||||
<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="100"/>
|
||||
</PreferenceCategory>
|
||||
<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"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="label_brightness" android:title="@string/pref_label_brightness" android:summary="%s%%" android:defaultValue="100" min="50" max="100"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="keyboard_opacity" android:title="@string/pref_keyboard_opacity" android:summary="%s%%" android:defaultValue="100" min="30" max="100"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="key_opacity" android:title="@string/pref_key_opacity" android:summary="%s%%" android:defaultValue="100" min="30" max="100"/>
|
||||
<juloo.common.IntSlideBarPreference android:key="key_activated_opacity" android:title="@string/pref_key_activated_opacity" android:summary="%s%%" android:defaultValue="100" min="30" 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="10" 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="20" 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.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_horizontal_space" android:title="@string/pref_key_horizontal_space" android:summary="%sdp" android:defaultValue="2" min="0" max="8"/>
|
||||
</PreferenceCategory>
|
||||
<PreferenceCategory android:title="@string/pref_category_advanced">
|
||||
<EditTextPreference android:key="custom_layout" android:title="@string/pref_custom_layout_title" android:summary="@string/pref_custom_layout_summary" android:inputType="text|textMultiLine|textLongMessage"/>
|
||||
</PreferenceCategory>
|
||||
</PreferenceScreen>
|
||||
|
142
srcs/juloo.keyboard2/Autocapitalisation.java
Normal file
@ -0,0 +1,142 @@
|
||||
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 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;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,19 +1,19 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Build;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.TypedValue;
|
||||
import android.view.KeyEvent;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
final class Config
|
||||
{
|
||||
private final SharedPreferences _prefs;
|
||||
|
||||
// From resources
|
||||
public final float marginTop;
|
||||
public final float keyPadding;
|
||||
@ -22,11 +22,14 @@ final class Config
|
||||
public final float sublabelTextSize;
|
||||
|
||||
// From preferences
|
||||
public int layout; // Or '-1' for the system defaults
|
||||
public int programming_layout; // Or '-1' for none
|
||||
public KeyboardData layout; // Or 'null' for the system defaults
|
||||
public KeyboardData second_layout; // Or 'null' for none
|
||||
public KeyboardData custom_layout; // Might be 'null'
|
||||
public boolean show_numpad = false;
|
||||
// From the 'numpad_layout' option, also apply to the numeric pane.
|
||||
public boolean inverse_numpad = false;
|
||||
public float swipe_dist_px;
|
||||
public boolean vibrateEnabled;
|
||||
public long vibrateDuration;
|
||||
public long longPressTimeout;
|
||||
public long longPressInterval;
|
||||
public float marginBottom;
|
||||
@ -34,35 +37,41 @@ final class Config
|
||||
public float horizontalMargin;
|
||||
public float keyVerticalInterval;
|
||||
public float keyHorizontalInterval;
|
||||
public int labelBrightness; // 0 - 255
|
||||
public int keyboardOpacity; // 0 - 255
|
||||
public int keyOpacity; // 0 - 255
|
||||
public int keyActivatedOpacity; // 0 - 255
|
||||
public boolean preciseRepeat;
|
||||
public int lockable_modifiers;
|
||||
public boolean double_tap_lock_shift;
|
||||
public float characterSize; // Ratio
|
||||
public int accents; // Values are R.values.pref_accents_v_*
|
||||
public int theme; // Values are R.style.*
|
||||
public boolean autocapitalisation;
|
||||
|
||||
// Dynamically set
|
||||
public boolean shouldOfferSwitchingToNextInputMethod;
|
||||
public boolean shouldOfferSwitchingToProgramming;
|
||||
public boolean shouldOfferSwitchingToSecond;
|
||||
public String actionLabel; // Might be 'null'
|
||||
public int actionId; // Meaningful only when 'actionLabel' isn't 'null'
|
||||
public boolean swapEnterActionKey; // Swap the "enter" and "action" keys
|
||||
public Set<String> extra_keys; // 'null' means all the keys
|
||||
public Set<KeyValue> extra_keys_subtype;
|
||||
public Set<KeyValue> extra_keys_param;
|
||||
|
||||
public final IKeyEventHandler handler;
|
||||
|
||||
private Config(Context context, IKeyEventHandler h)
|
||||
private Config(SharedPreferences prefs, Resources res, IKeyEventHandler h)
|
||||
{
|
||||
Resources res = context.getResources();
|
||||
_prefs = prefs;
|
||||
// static values
|
||||
marginTop = res.getDimension(R.dimen.margin_top);
|
||||
keyPadding = res.getDimension(R.dimen.key_padding);
|
||||
labelTextSize = Float.valueOf(res.getString(R.integer.label_text_size));
|
||||
sublabelTextSize = Float.valueOf(res.getString(R.integer.sublabel_text_size));
|
||||
labelTextSize = 0.33f;
|
||||
sublabelTextSize = 0.22f;
|
||||
// default values
|
||||
layout = -1;
|
||||
programming_layout = -1;
|
||||
layout = null;
|
||||
second_layout = null;
|
||||
custom_layout = null;
|
||||
vibrateEnabled = true;
|
||||
vibrateDuration = 20;
|
||||
longPressTimeout = 600;
|
||||
longPressInterval = 65;
|
||||
marginBottom = res.getDimension(R.dimen.margin_bottom);
|
||||
@ -74,75 +83,89 @@ final class Config
|
||||
characterSize = 1.f;
|
||||
accents = 1;
|
||||
// from prefs
|
||||
refresh(context);
|
||||
refresh(res);
|
||||
// initialized later
|
||||
shouldOfferSwitchingToNextInputMethod = false;
|
||||
shouldOfferSwitchingToProgramming = false;
|
||||
shouldOfferSwitchingToSecond = false;
|
||||
actionLabel = null;
|
||||
actionId = 0;
|
||||
swapEnterActionKey = false;
|
||||
extra_keys = null;
|
||||
extra_keys_subtype = null;
|
||||
handler = h;
|
||||
}
|
||||
|
||||
/*
|
||||
** Reload prefs
|
||||
*/
|
||||
public void refresh(Context context)
|
||||
public void refresh(Resources res)
|
||||
{
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
Resources res = context.getResources();
|
||||
DisplayMetrics dm = res.getDisplayMetrics();
|
||||
// The height of the keyboard is relative to the height of the screen. This
|
||||
// is not the actual size of the keyboard, which will be bigger if the
|
||||
// layout has a fifth row.
|
||||
// The height of the keyboard is relative to the height of the screen.
|
||||
// This is the height of the keyboard if it have 4 rows.
|
||||
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
|
||||
{
|
||||
keyboardHeightPercent = 55;
|
||||
if ("landscape".equals(show_numpad_s))
|
||||
show_numpad = true;
|
||||
keyboardHeightPercent = _prefs.getInt("keyboard_height_landscape", 50);
|
||||
horizontalIntervalScale = 2.f;
|
||||
characterSizeScale = 1.25f;
|
||||
}
|
||||
else
|
||||
{
|
||||
keyboardHeightPercent = prefs.getInt("keyboard_height", 35);
|
||||
keyboardHeightPercent = _prefs.getInt("keyboard_height", 35);
|
||||
}
|
||||
String layout_s = prefs.getString("layout", "system");
|
||||
layout = layout_s.equals("system") ? -1 : layoutId_of_string(layout_s);
|
||||
String prog_layout_s = prefs.getString("programming_layout", "none");
|
||||
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);
|
||||
vibrateDuration = prefs.getInt("vibrate_duration", (int)vibrateDuration);
|
||||
longPressTimeout = prefs.getInt("longpress_timeout", (int)longPressTimeout);
|
||||
longPressInterval = prefs.getInt("longpress_interval", (int)longPressInterval);
|
||||
marginBottom = getDipPref(dm, prefs, "margin_bottom", marginBottom);
|
||||
keyVerticalInterval = getDipPref(dm, prefs, "key_vertical_space", keyVerticalInterval);
|
||||
keyHorizontalInterval = getDipPref(dm, prefs, "key_horizontal_space", keyHorizontalInterval);
|
||||
layout = layout_of_string(res, _prefs.getString("layout", "none"));
|
||||
second_layout = layout_of_string(res, _prefs.getString("second_layout", "none"));
|
||||
custom_layout = KeyboardData.load_string(_prefs.getString("custom_layout", ""));
|
||||
inverse_numpad = _prefs.getString("numpad_layout", "default").equals("low_first");
|
||||
// The baseline for the swipe distance correspond to approximately the
|
||||
// width of a key in portrait mode, as most layouts have 10 columns.
|
||||
// Multipled by the DPI ratio because most swipes are made in the diagonals.
|
||||
// The option value uses an unnamed scale where the baseline is around 25.
|
||||
float dpi_ratio = Math.max(dm.xdpi, dm.ydpi) / Math.min(dm.xdpi, dm.ydpi);
|
||||
float swipe_scaling = Math.min(dm.widthPixels, dm.heightPixels) / 10.f * dpi_ratio;
|
||||
float swipe_dist_value = Float.valueOf(_prefs.getString("swipe_dist", "15"));
|
||||
swipe_dist_px = swipe_dist_value / 25.f * swipe_scaling;
|
||||
vibrateEnabled = _prefs.getBoolean("vibrate_enabled", vibrateEnabled);
|
||||
longPressTimeout = _prefs.getInt("longpress_timeout", (int)longPressTimeout);
|
||||
longPressInterval = _prefs.getInt("longpress_interval", (int)longPressInterval);
|
||||
marginBottom = getDipPref(dm, _prefs, "margin_bottom", marginBottom);
|
||||
keyVerticalInterval = getDipPref(dm, _prefs, "key_vertical_space", keyVerticalInterval);
|
||||
keyHorizontalInterval =
|
||||
getDipPref(dm, _prefs, "key_horizontal_space", keyHorizontalInterval)
|
||||
* horizontalIntervalScale;
|
||||
// Label brightness is used as the alpha channel
|
||||
labelBrightness = _prefs.getInt("label_brightness", 100) * 255 / 100;
|
||||
// Keyboard opacity
|
||||
keyboardOpacity = _prefs.getInt("keyboard_opacity", 100) * 255 / 100;
|
||||
keyOpacity = _prefs.getInt("key_opacity", 100) * 255 / 100;
|
||||
keyActivatedOpacity = _prefs.getInt("key_activated_opacity", 100) * 255 / 100;
|
||||
// Do not substract keyVerticalInterval from keyHeight because this is done
|
||||
// during rendered.
|
||||
keyHeight = dm.heightPixels * keyboardHeightPercent / 100 / 4;
|
||||
horizontalMargin = getDipPref(dm, prefs, "horizontal_margin", horizontalMargin) + res.getDimension(R.dimen.extra_horizontal_margin);
|
||||
preciseRepeat = prefs.getBoolean("precise_repeat", preciseRepeat);
|
||||
lockable_modifiers =
|
||||
(prefs.getBoolean("lockable_shift", true) ? KeyValue.FLAG_SHIFT : 0)
|
||||
| (prefs.getBoolean("lockable_ctrl", false) ? KeyValue.FLAG_CTRL : 0)
|
||||
| (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)
|
||||
| (prefs.getBoolean("lockable_box", false) ? KeyValue.FLAG_ACCENT_BOX : 0);
|
||||
characterSize = prefs.getFloat("character_size", characterSize);
|
||||
accents = Integer.valueOf(prefs.getString("accents", "1"));
|
||||
theme = getThemeId(res, prefs.getString("theme", ""));
|
||||
horizontalMargin =
|
||||
getDipPref(dm, _prefs, "horizontal_margin", horizontalMargin)
|
||||
+ res.getDimension(R.dimen.extra_horizontal_margin);
|
||||
preciseRepeat = _prefs.getBoolean("precise_repeat", preciseRepeat);
|
||||
double_tap_lock_shift = _prefs.getBoolean("lock_double_tap", false);
|
||||
characterSize =
|
||||
_prefs.getFloat("character_size", characterSize)
|
||||
* characterSizeScale;
|
||||
accents = Integer.valueOf(_prefs.getString("accents", "1"));
|
||||
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.
|
||||
* - Remove the switching key if it isn't needed
|
||||
* - Remove keys from other locales (not in 'extra_keys')
|
||||
* - Remove "localized" keys from other locales (not in 'extra_keys')
|
||||
* - Replace the action key to show the right label
|
||||
* - Swap the enter and action keys
|
||||
*/
|
||||
@ -150,37 +173,77 @@ final class Config
|
||||
{
|
||||
// Update the name to avoid caching in KeyModifier
|
||||
final KeyValue action_key = (actionLabel == null) ? null :
|
||||
KeyValue.getKeyByName("action").withNameAndSymbol(actionLabel, actionLabel);
|
||||
return kw.replaceKeys(new KeyboardData.MapKeys() {
|
||||
public KeyValue apply(KeyValue key)
|
||||
KeyValue.getKeyByName("action").withSymbol(actionLabel);
|
||||
// Extra keys are removed from the set as they are encountered during the
|
||||
// first iteration then automatically added.
|
||||
final Set<KeyValue> extra_keys = new HashSet<KeyValue>();
|
||||
extra_keys.addAll(extra_keys_subtype);
|
||||
extra_keys.addAll(extra_keys_param);
|
||||
if (kw.num_pad && show_numpad)
|
||||
kw = kw.addNumPad();
|
||||
kw = kw.mapKeys(new KeyboardData.MapKeyValues() {
|
||||
/** Apply to the center value only. Partial match, fallback to [apply]. */
|
||||
public KeyboardData.Corner apply_key0(KeyboardData.Corner corner)
|
||||
{
|
||||
if (key == null)
|
||||
if (corner == null)
|
||||
return null;
|
||||
switch (key.eventCode)
|
||||
KeyValue kv = corner.kv;
|
||||
switch (kv.getKind())
|
||||
{
|
||||
case KeyValue.EVENT_CHANGE_METHOD:
|
||||
case Char:
|
||||
char c = kv.getChar();
|
||||
if (inverse_numpad)
|
||||
c = inverse_numpad_char(c);
|
||||
if (c != kv.getChar())
|
||||
return KeyboardData.Corner.of_kv(kv.withChar(c));
|
||||
break;
|
||||
}
|
||||
return super.apply(corner);
|
||||
}
|
||||
|
||||
public KeyValue apply(KeyValue key, boolean localized)
|
||||
{
|
||||
boolean is_extra_key = extra_keys.contains(key);
|
||||
if (is_extra_key)
|
||||
extra_keys.remove(key);
|
||||
if (localized && !is_extra_key)
|
||||
return null;
|
||||
switch (key.getKind())
|
||||
{
|
||||
case Event:
|
||||
switch (key.getEvent())
|
||||
{
|
||||
case CHANGE_METHOD:
|
||||
return shouldOfferSwitchingToNextInputMethod ? key : null;
|
||||
case KeyEvent.KEYCODE_ENTER:
|
||||
return (swapEnterActionKey && action_key != null) ? action_key : key;
|
||||
case KeyValue.EVENT_ACTION:
|
||||
case ACTION:
|
||||
return (swapEnterActionKey && action_key != null) ?
|
||||
KeyValue.getKeyByName("enter") : action_key;
|
||||
case KeyValue.EVENT_SWITCH_PROGRAMMING:
|
||||
return shouldOfferSwitchingToProgramming ? key : null;
|
||||
default:
|
||||
if (key.flags != 0)
|
||||
case SWITCH_SECOND:
|
||||
return shouldOfferSwitchingToSecond ? key : null;
|
||||
}
|
||||
break;
|
||||
case Keyevent:
|
||||
switch (key.getKeyevent())
|
||||
{
|
||||
if ((key.flags & KeyValue.FLAG_LOCALIZED) != 0 &&
|
||||
extra_keys != null &&
|
||||
!extra_keys.contains(key.name))
|
||||
return null;
|
||||
if ((key.flags & lockable_modifiers) != 0)
|
||||
return key.withFlags(key.flags | KeyValue.FLAG_LOCK);
|
||||
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());
|
||||
return kw;
|
||||
}
|
||||
|
||||
private float getDipPref(DisplayMetrics dm, SharedPreferences prefs, String pref_name, float def)
|
||||
@ -200,6 +263,7 @@ final class Config
|
||||
case "light": return R.style.Light;
|
||||
case "black": return R.style.Black;
|
||||
case "dark": return R.style.Dark;
|
||||
case "white": return R.style.White;
|
||||
default:
|
||||
case "system":
|
||||
if (Build.VERSION.SDK_INT >= 8)
|
||||
@ -212,40 +276,62 @@ final class Config
|
||||
}
|
||||
}
|
||||
|
||||
public static int layoutId_of_string(String name)
|
||||
public KeyboardData layout_of_string(Resources res, String name)
|
||||
{
|
||||
int id = R.xml.qwerty; // The config might store an invalid layout, don't crash
|
||||
switch (name)
|
||||
{
|
||||
case "azerty": return R.xml.azerty;
|
||||
case "bgph1": return R.xml.local_bgph1;
|
||||
case "dvorak": return R.xml.dvorak;
|
||||
case "qwerty_es": return R.xml.qwerty_es;
|
||||
case "qwerty_ko": return R.xml.qwerty_ko;
|
||||
case "qwerty_lv": return R.xml.qwerty_lv;
|
||||
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 "qwertz": return R.xml.qwertz;
|
||||
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": case "none": return null;
|
||||
case "custom": if (custom_layout != null) return custom_layout; break;
|
||||
case "azerty": id = R.xml.azerty; break;
|
||||
case "bangla": id = R.xml.bangla; break;
|
||||
case "bgph1": id = R.xml.local_bgph1; break;
|
||||
case "bone": id = R.xml.bone; break;
|
||||
case "colemak": id = R.xml.colemak; break;
|
||||
case "dvorak": id = R.xml.dvorak; break;
|
||||
case "hindi": id = R.xml.hindi; break;
|
||||
case "jcuken_ua": id = R.xml.jcuken_ua; break;
|
||||
case "neo2": id = R.xml.neo2; break;
|
||||
case "qwerty": id = R.xml.qwerty; break;
|
||||
case "qwerty_el": id = R.xml.qwerty_el; break;
|
||||
case "qwerty_es": id = R.xml.qwerty_es; break;
|
||||
case "qwerty_hu": id = R.xml.qwerty_hu; break;
|
||||
case "qwerty_ko": id = R.xml.qwerty_ko; break;
|
||||
case "qwerty_lv": id = R.xml.qwerty_lv; break;
|
||||
case "qwerty_no": id = R.xml.qwerty_no; break;
|
||||
case "qwerty_pt": id = R.xml.qwerty_pt; break;
|
||||
case "qwerty_sv_se": id = R.xml.qwerty_sv_se; break;
|
||||
case "qwerty_tr": id = R.xml.qwerty_tr; break;
|
||||
case "qwerty_pl": id = R.xml.qwerty_pl; break;
|
||||
case "qwertz": id = R.xml.qwertz; break;
|
||||
case "qwertz_cs": id = R.xml.qwertz_cs; break;
|
||||
case "qwertz_de": id = R.xml.qwertz_de; break;
|
||||
case "qwertz_hu": id = R.xml.qwertz_hu; break;
|
||||
case "ru_jcuken": id = R.xml.local_ru_jcuken; break;
|
||||
}
|
||||
return KeyboardData.load(res, id);
|
||||
}
|
||||
|
||||
public static int themeId_of_string(String name)
|
||||
char inverse_numpad_char(char c)
|
||||
{
|
||||
switch (name)
|
||||
switch (c)
|
||||
{
|
||||
case "light": return R.style.Light;
|
||||
case "black": return R.style.Black;
|
||||
default: case "dark": return R.style.Dark;
|
||||
case '7': return '1';
|
||||
case '8': return '2';
|
||||
case '9': return '3';
|
||||
case '1': return '7';
|
||||
case '2': return '8';
|
||||
case '3': return '9';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
|
||||
private static Config _globalConfig = null;
|
||||
|
||||
public static void initGlobalConfig(Context context, IKeyEventHandler handler)
|
||||
public static void initGlobalConfig(SharedPreferences prefs, Resources res,
|
||||
IKeyEventHandler handler)
|
||||
{
|
||||
_globalConfig = new Config(context, handler);
|
||||
_globalConfig = new Config(prefs, res, handler);
|
||||
}
|
||||
|
||||
public static Config globalConfig()
|
||||
@ -255,6 +341,6 @@ final class Config
|
||||
|
||||
public static interface IKeyEventHandler
|
||||
{
|
||||
public void handleKeyUp(KeyValue value, int flags);
|
||||
public void key_up(KeyValue value, Pointers.Modifiers flags);
|
||||
}
|
||||
}
|
||||
|
86
srcs/juloo.keyboard2/DirectBootAwarePreferences.java
Normal file
@ -0,0 +1,86 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Build.VERSION;
|
||||
import android.preference.PreferenceManager;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public final class DirectBootAwarePreferences
|
||||
{
|
||||
/* On API >= 24, preferences are read from the device protected storage. This
|
||||
* storage is less protected than the default, no personnal or sensitive
|
||||
* information is stored there (only the keyboard settings). This storage is
|
||||
* accessible during boot and allow the keyboard to read its settings and
|
||||
* allow typing the storage password. */
|
||||
public static SharedPreferences get_shared_preferences(Context context)
|
||||
{
|
||||
if (VERSION.SDK_INT < 24)
|
||||
return PreferenceManager.getDefaultSharedPreferences(context);
|
||||
SharedPreferences prefs = get_protected_prefs(context);
|
||||
check_need_migration(context, prefs);
|
||||
return prefs;
|
||||
}
|
||||
|
||||
/* Copy shared preferences to device protected storage. Not using
|
||||
* [Context.moveSharedPreferencesFrom] because the settings activity still
|
||||
* use [PreferenceActivity], which can't work on a non-default shared
|
||||
* preference file. */
|
||||
public static void copy_preferences_to_protected_storage(Context context,
|
||||
SharedPreferences src)
|
||||
{
|
||||
if (VERSION.SDK_INT >= 24)
|
||||
copy_shared_preferences(src, get_protected_prefs(context));
|
||||
}
|
||||
|
||||
static SharedPreferences get_protected_prefs(Context context)
|
||||
{
|
||||
String pref_name =
|
||||
PreferenceManager.getDefaultSharedPreferencesName(context);
|
||||
return context.createDeviceProtectedStorageContext()
|
||||
.getSharedPreferences(pref_name, Context.MODE_PRIVATE);
|
||||
}
|
||||
|
||||
static void check_need_migration(Context app_context,
|
||||
SharedPreferences protected_prefs)
|
||||
{
|
||||
if (!protected_prefs.getBoolean("need_migration", true))
|
||||
return;
|
||||
SharedPreferences prefs;
|
||||
try
|
||||
{
|
||||
prefs = PreferenceManager.getDefaultSharedPreferences(app_context);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
// Device is locked, migrate later.
|
||||
return;
|
||||
}
|
||||
prefs.edit().putBoolean("need_migration", false).commit();
|
||||
copy_shared_preferences(prefs, protected_prefs);
|
||||
}
|
||||
|
||||
static void copy_shared_preferences(SharedPreferences src, SharedPreferences dst)
|
||||
{
|
||||
SharedPreferences.Editor e = dst.edit();
|
||||
Map<String, ?> entries = src.getAll();
|
||||
for (String k : entries.keySet())
|
||||
{
|
||||
Object v = entries.get(k);
|
||||
if (v instanceof Boolean)
|
||||
e.putBoolean(k, (Boolean)v);
|
||||
else if (v instanceof Float)
|
||||
e.putFloat(k, (Float)v);
|
||||
else if (v instanceof Integer)
|
||||
e.putInt(k, (Integer)v);
|
||||
else if (v instanceof Long)
|
||||
e.putLong(k, (Long)v);
|
||||
else if (v instanceof String)
|
||||
e.putString(k, (String)v);
|
||||
else if (v instanceof Set)
|
||||
e.putStringSet(k, (Set<String>)v);
|
||||
}
|
||||
e.commit();
|
||||
}
|
||||
}
|
@ -8,19 +8,32 @@ import java.io.BufferedReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class Emoji extends KeyValue
|
||||
public class Emoji
|
||||
{
|
||||
private final String _name;
|
||||
private final KeyValue _kv;
|
||||
private final String _desc;
|
||||
|
||||
private static HashMap<String, Emoji> emojis_by_name = new HashMap<String, Emoji>();
|
||||
|
||||
protected Emoji(String name, String bytecode, String desc)
|
||||
{
|
||||
super(name, bytecode, CHAR_NONE, EVENT_NONE, 0);
|
||||
_name = name;
|
||||
_kv = new KeyValue(bytecode, KeyValue.Kind.String, 0, 0);
|
||||
_desc = desc;
|
||||
emojis_by_name.put(name, this);
|
||||
}
|
||||
|
||||
public String name()
|
||||
{
|
||||
return _name;
|
||||
}
|
||||
|
||||
public KeyValue kv()
|
||||
{
|
||||
return _kv;
|
||||
}
|
||||
|
||||
public String getDescription()
|
||||
{
|
||||
return (_desc);
|
||||
|
@ -2,10 +2,8 @@ package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Typeface;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.Gravity;
|
||||
import android.view.ContextThemeWrapper;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
@ -15,16 +13,14 @@ import android.widget.TextView;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class EmojiGridView extends GridView
|
||||
implements GridView.OnItemClickListener
|
||||
{
|
||||
public static final int GROUP_LAST_USE = -1;
|
||||
|
||||
public static final int COLUMN_WIDTH = 192;
|
||||
|
||||
private static final String LAST_USE_PREF = "emoji_last_use";
|
||||
|
||||
private Emoji[] _emojiArray;
|
||||
@ -39,7 +35,6 @@ public class EmojiGridView extends GridView
|
||||
super(context, attrs);
|
||||
Emoji.init(context.getResources());
|
||||
setOnItemClickListener(this);
|
||||
setColumnWidth(COLUMN_WIDTH);
|
||||
loadLastUsed();
|
||||
setEmojiGroup((_lastUsed.size() == 0) ? 0 : GROUP_LAST_USE);
|
||||
}
|
||||
@ -55,17 +50,10 @@ public class EmojiGridView extends GridView
|
||||
Config config = Config.globalConfig();
|
||||
Integer used = _lastUsed.get(_emojiArray[pos]);
|
||||
_lastUsed.put(_emojiArray[pos], (used == null) ? 1 : used.intValue() + 1);
|
||||
config.handler.handleKeyUp(_emojiArray[pos], 0);
|
||||
config.handler.key_up(_emojiArray[pos].kv(), Pointers.Modifiers.EMPTY);
|
||||
saveLastUsed(); // TODO: opti
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMeasure(int wSpec, int hSpec)
|
||||
{
|
||||
super.onMeasure(wSpec, hSpec);
|
||||
setNumColumns(getMeasuredWidth() / COLUMN_WIDTH);
|
||||
}
|
||||
|
||||
private Emoji[] getLastEmojis()
|
||||
{
|
||||
final HashMap<Emoji, Integer> map = _lastUsed;
|
||||
@ -84,27 +72,30 @@ public class EmojiGridView extends GridView
|
||||
|
||||
private void saveLastUsed()
|
||||
{
|
||||
SharedPreferences.Editor edit = PreferenceManager.getDefaultSharedPreferences(getContext()).edit();
|
||||
SharedPreferences.Editor edit;
|
||||
try { edit = emojiSharedPreferences().edit(); }
|
||||
catch (Exception _e) { return; }
|
||||
HashSet<String> set = new HashSet<String>();
|
||||
|
||||
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.apply();
|
||||
}
|
||||
|
||||
private void loadLastUsed()
|
||||
{
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||||
Set<String> lastUseSet = prefs.getStringSet(LAST_USE_PREF, null);
|
||||
|
||||
_lastUsed = new HashMap<Emoji, Integer>();
|
||||
SharedPreferences prefs;
|
||||
// Storage might not be available (eg. the device is locked), avoid
|
||||
// crashing.
|
||||
try { prefs = emojiSharedPreferences(); }
|
||||
catch (Exception _e) { return; }
|
||||
Set<String> lastUseSet = prefs.getStringSet(LAST_USE_PREF, null);
|
||||
if (lastUseSet != null)
|
||||
for (String emojiData : lastUseSet)
|
||||
{
|
||||
String[] data = emojiData.split("-", 2);
|
||||
Emoji emoji;
|
||||
|
||||
if (data.length != 2)
|
||||
continue ;
|
||||
emoji = Emoji.getEmojiByName(data[1]);
|
||||
@ -114,31 +105,33 @@ public class EmojiGridView extends GridView
|
||||
}
|
||||
}
|
||||
|
||||
private static class EmojiView extends TextView
|
||||
SharedPreferences emojiSharedPreferences()
|
||||
{
|
||||
return getContext().getSharedPreferences("emoji_last_use", Context.MODE_PRIVATE);
|
||||
}
|
||||
|
||||
static class EmojiView extends TextView
|
||||
{
|
||||
public EmojiView(Context context)
|
||||
{
|
||||
super(context);
|
||||
setTextAppearance(context, R.style.emojiGridButton);
|
||||
setGravity(Gravity.CENTER);
|
||||
setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.WRAP_CONTENT, GridView.LayoutParams.WRAP_CONTENT));
|
||||
}
|
||||
|
||||
public void setEmoji(Emoji emoji)
|
||||
{
|
||||
setText(emoji.symbol);
|
||||
setText(emoji.kv().getString());
|
||||
}
|
||||
}
|
||||
|
||||
private static class EmojiViewAdpater extends BaseAdapter
|
||||
static class EmojiViewAdpater extends BaseAdapter
|
||||
{
|
||||
private Context _context;
|
||||
Context _button_context;
|
||||
|
||||
private Emoji[] _emojiArray;
|
||||
Emoji[] _emojiArray;
|
||||
|
||||
public EmojiViewAdpater(Context context, Emoji[] emojiArray)
|
||||
{
|
||||
_context = context;
|
||||
_button_context = new ContextThemeWrapper(context, R.style.emojiGridButton);
|
||||
_emojiArray = emojiArray;
|
||||
}
|
||||
|
||||
@ -164,9 +157,9 @@ public class EmojiGridView extends GridView
|
||||
EmojiView view = (EmojiView)convertView;
|
||||
|
||||
if (view == null)
|
||||
view = new EmojiView(_context);
|
||||
view = new EmojiView(_button_context);
|
||||
view.setEmoji(_emojiArray[pos]);
|
||||
return (view);
|
||||
return view;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,11 +2,18 @@ package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.LinearLayout;
|
||||
import android.view.ContextThemeWrapper;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout.LayoutParams;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
public class EmojiGroupButtonsBar extends LinearLayout
|
||||
{
|
||||
private EmojiGridView _emoji_grid = null;
|
||||
|
||||
public EmojiGroupButtonsBar(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
@ -15,12 +22,41 @@ public class EmojiGroupButtonsBar extends LinearLayout
|
||||
for (int i = 0; i < Emoji.num_groups; i++)
|
||||
{
|
||||
Emoji first = Emoji.getEmojisByGroup(i)[0];
|
||||
add_group(i, first.symbol);
|
||||
add_group(i, first.kv().getString());
|
||||
}
|
||||
}
|
||||
|
||||
private void add_group(int id, String symbol)
|
||||
void add_group(int id, String symbol)
|
||||
{
|
||||
addView(new EmojiTypeButton(getContext(), id, symbol), new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1.f));
|
||||
addView(this.new EmojiGroupButton(getContext(), id, symbol),
|
||||
new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1.f));
|
||||
}
|
||||
|
||||
EmojiGridView get_emoji_grid()
|
||||
{
|
||||
if (_emoji_grid == null)
|
||||
_emoji_grid = (EmojiGridView)((ViewGroup)(getParent())).findViewById(R.id.emoji_grid);
|
||||
return _emoji_grid;
|
||||
}
|
||||
|
||||
class EmojiGroupButton extends Button implements View.OnTouchListener
|
||||
{
|
||||
int _group_id;
|
||||
|
||||
public EmojiGroupButton(Context context, int group_id, String symbol)
|
||||
{
|
||||
super(new ContextThemeWrapper(context, R.style.emojiTypeButton), null, 0);
|
||||
_group_id = group_id;
|
||||
setText(symbol);
|
||||
setOnTouchListener(this);
|
||||
}
|
||||
|
||||
public boolean onTouch(View view, MotionEvent event)
|
||||
{
|
||||
if (event.getAction() != MotionEvent.ACTION_DOWN)
|
||||
return false;
|
||||
get_emoji_grid().setEmojiGroup(_group_id);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,15 +14,16 @@ public class EmojiKeyButton extends Button
|
||||
{
|
||||
super(context, attrs);
|
||||
setOnClickListener(this);
|
||||
_key = KeyValue.getKeyByName(attrs.getAttributeValue(null, "key"));
|
||||
setText(_key.symbol);
|
||||
if ((_key.flags & KeyValue.FLAG_KEY_FONT) != 0)
|
||||
setTypeface(Theme.getSpecialKeyFont(context));
|
||||
String key_name = attrs.getAttributeValue(null, "key");
|
||||
_key = (key_name == null) ? null : KeyValue.getKeyByName(key_name);
|
||||
setText(_key.getString());
|
||||
if (_key.hasFlags(KeyValue.FLAG_KEY_FONT))
|
||||
setTypeface(Theme.getKeyFont(context));
|
||||
}
|
||||
|
||||
public void onClick(View v)
|
||||
{
|
||||
Config config = Config.globalConfig();
|
||||
config.handler.handleKeyUp(_key, 0);
|
||||
config.handler.key_up(_key, Pointers.Modifiers.EMPTY);
|
||||
}
|
||||
}
|
||||
|
@ -1,37 +0,0 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.ContextThemeWrapper;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
|
||||
/* Emoji "types" are groups. This class is misnamed. */
|
||||
|
||||
public class EmojiTypeButton extends Button
|
||||
implements View.OnTouchListener
|
||||
{
|
||||
private int _emojiType;
|
||||
|
||||
static private final int DEFAULT_GROUP = 0;
|
||||
|
||||
public EmojiTypeButton(Context context, int group_id, String symbol)
|
||||
{
|
||||
super(new ContextThemeWrapper(context, R.style.emojiTypeButton), null, 0);
|
||||
_emojiType = group_id;
|
||||
setText(symbol);
|
||||
setOnTouchListener(this);
|
||||
}
|
||||
|
||||
public boolean onTouch(View view, MotionEvent event)
|
||||
{
|
||||
EmojiGridView emojiGrid;
|
||||
|
||||
if (event.getAction() != MotionEvent.ACTION_DOWN)
|
||||
return (false);
|
||||
emojiGrid = (EmojiGridView)((ViewGroup)(getParent().getParent())).findViewById(R.id.emoji_grid);
|
||||
emojiGrid.setEmojiGroup(_emojiType);
|
||||
return (true);
|
||||
}
|
||||
}
|
97
srcs/juloo.keyboard2/ExtraKeyCheckBoxPreference.java
Normal file
@ -0,0 +1,97 @@
|
||||
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",
|
||||
"copy",
|
||||
"paste",
|
||||
"cut",
|
||||
"select_all",
|
||||
};
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
@ -1,39 +1,79 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.os.Looper;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.view.inputmethod.InputConnection;
|
||||
|
||||
class KeyEventHandler implements Config.IKeyEventHandler
|
||||
{
|
||||
private IReceiver _recv;
|
||||
IReceiver _recv;
|
||||
Autocapitalisation _autocap;
|
||||
|
||||
public KeyEventHandler(IReceiver recv)
|
||||
public int actionId; // Action performed by the Action key.
|
||||
|
||||
public KeyEventHandler(Looper looper, IReceiver recv)
|
||||
{
|
||||
_recv = recv;
|
||||
_autocap = new Autocapitalisation(looper,
|
||||
this.new Autocapitalisation_callback());
|
||||
}
|
||||
|
||||
public void handleKeyUp(KeyValue key, int flags)
|
||||
/** Editing just started. */
|
||||
public void started(EditorInfo info)
|
||||
{
|
||||
if (key == null || (key.flags & KeyValue.FLAG_NOCHAR) != 0)
|
||||
_autocap.started(info, _recv.getCurrentInputConnection());
|
||||
}
|
||||
|
||||
/** Selection has been updated. */
|
||||
public void selection_updated(int oldSelStart, int newSelStart)
|
||||
{
|
||||
_autocap.selection_updated(oldSelStart, newSelStart);
|
||||
}
|
||||
|
||||
/** A key has been released. */
|
||||
public void key_up(KeyValue key, Pointers.Modifiers mods)
|
||||
{
|
||||
if (key == null)
|
||||
return;
|
||||
switch (key.eventCode)
|
||||
switch (key.getKind())
|
||||
{
|
||||
case KeyValue.EVENT_CONFIG: _recv.showKeyboardConfig(); return;
|
||||
case KeyValue.EVENT_SWITCH_TEXT: _recv.switchMain(); return;
|
||||
case KeyValue.EVENT_SWITCH_NUMERIC: _recv.switchNumeric(); return;
|
||||
case KeyValue.EVENT_SWITCH_EMOJI: _recv.setPane_emoji(); return;
|
||||
case KeyValue.EVENT_SWITCH_BACK_EMOJI: _recv.setPane_normal(); return;
|
||||
case KeyValue.EVENT_CHANGE_METHOD: _recv.switchToNextInputMethod(); return;
|
||||
case KeyValue.EVENT_ACTION: _recv.performAction(); return;
|
||||
case KeyValue.EVENT_SWITCH_PROGRAMMING: _recv.switchProgramming(); return;
|
||||
default:
|
||||
if ((flags & (KeyValue.FLAG_CTRL | KeyValue.FLAG_ALT | KeyValue.FLAG_META)) != 0)
|
||||
handleKeyUpWithModifier(key, flags);
|
||||
else if (key.char_ != KeyValue.CHAR_NONE)
|
||||
_recv.commitChar(key.char_);
|
||||
else if (key.eventCode != KeyValue.EVENT_NONE)
|
||||
handleKeyUpWithModifier(key, flags);
|
||||
else
|
||||
_recv.commitText(key.symbol);
|
||||
case Char: send_text(String.valueOf(key.getChar())); break;
|
||||
case String: send_text(key.getString()); break;
|
||||
case Event:
|
||||
switch (key.getEvent())
|
||||
{
|
||||
case CONFIG: _recv.showKeyboardConfig(); break;
|
||||
case SWITCH_TEXT:
|
||||
case SWITCH_SECOND_BACK: _recv.switch_main(); break;
|
||||
case SWITCH_NUMERIC: _recv.switch_layout(R.xml.numeric); break;
|
||||
case SWITCH_EMOJI: _recv.setPane_emoji(); break;
|
||||
case SWITCH_BACK_EMOJI: _recv.setPane_normal(); break;
|
||||
case CHANGE_METHOD: _recv.switchToNextInputMethod(); break;
|
||||
case ACTION:
|
||||
InputConnection conn = _recv.getCurrentInputConnection();
|
||||
if (conn != null)
|
||||
conn.performEditorAction(actionId);
|
||||
break;
|
||||
case SWITCH_SECOND: _recv.switch_second(); break;
|
||||
case SWITCH_GREEKMATH: _recv.switch_layout(R.xml.greekmath); break;
|
||||
case CAPS_LOCK: _recv.set_shift_state(true, true); break;
|
||||
}
|
||||
break;
|
||||
case Keyevent:
|
||||
handleKeyUpWithModifier(key.getKeyevent(), mods);
|
||||
break;
|
||||
case Modifier:
|
||||
break;
|
||||
case Editing:
|
||||
switch (key.getEditing())
|
||||
{
|
||||
case COPY: send_context_menu_action(android.R.id.copy); break;
|
||||
case PASTE: send_context_menu_action(android.R.id.paste); break;
|
||||
case CUT: send_context_menu_action(android.R.id.cut); break;
|
||||
case SELECT_ALL: send_context_menu_action(android.R.id.selectAll); break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -47,41 +87,72 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
// getCurrentInputConnection().deleteSurroundingText(before, after);
|
||||
// }
|
||||
|
||||
private int sendMetaKey(int eventCode, int metaFlags, int metaState, boolean down)
|
||||
int sendMetaKey(int eventCode, int metaFlags, int metaState, boolean down)
|
||||
{
|
||||
int action;
|
||||
int updatedMetaState;
|
||||
if (down) { action = KeyEvent.ACTION_DOWN; updatedMetaState = metaState | metaFlags; }
|
||||
else { action = KeyEvent.ACTION_UP; updatedMetaState = metaState & ~metaFlags; }
|
||||
_recv.sendKeyEvent(action, eventCode, metaState);
|
||||
send_keyevent(action, eventCode, metaState);
|
||||
return updatedMetaState;
|
||||
}
|
||||
|
||||
/* Send key events corresponding to pressed modifier keys. */
|
||||
private int sendMetaKeys(int flags, int metaState, boolean down)
|
||||
int sendMetaKeyForModifier(KeyValue.Modifier mod, int metaState, boolean down)
|
||||
{
|
||||
if ((flags & KeyValue.FLAG_CTRL) != 0)
|
||||
metaState = sendMetaKey(KeyEvent.KEYCODE_CTRL_LEFT, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON, metaState, down);
|
||||
if ((flags & KeyValue.FLAG_ALT) != 0)
|
||||
metaState = sendMetaKey(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON, metaState, down);
|
||||
if ((flags & KeyValue.FLAG_SHIFT) != 0)
|
||||
metaState = sendMetaKey(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON, metaState, down);
|
||||
if ((flags & KeyValue.FLAG_META) != 0)
|
||||
metaState = sendMetaKey(KeyEvent.KEYCODE_META_LEFT, KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_ON, metaState, down);
|
||||
return metaState;
|
||||
switch (mod)
|
||||
{
|
||||
case CTRL:
|
||||
return sendMetaKey(KeyEvent.KEYCODE_CTRL_LEFT, KeyEvent.META_CTRL_LEFT_ON | KeyEvent.META_CTRL_ON, metaState, down);
|
||||
case ALT:
|
||||
return sendMetaKey(KeyEvent.KEYCODE_ALT_LEFT, KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_ON, metaState, down);
|
||||
case SHIFT:
|
||||
return sendMetaKey(KeyEvent.KEYCODE_SHIFT_LEFT, KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_ON, metaState, down);
|
||||
case META:
|
||||
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.
|
||||
*/
|
||||
private void handleKeyUpWithModifier(KeyValue key, int flags)
|
||||
void handleKeyUpWithModifier(int keyCode, Pointers.Modifiers mods)
|
||||
{
|
||||
if (key.eventCode == KeyValue.EVENT_NONE)
|
||||
return ;
|
||||
int metaState = sendMetaKeys(flags, 0, true);
|
||||
_recv.sendKeyEvent(KeyEvent.ACTION_DOWN, key.eventCode, metaState);
|
||||
_recv.sendKeyEvent(KeyEvent.ACTION_UP, key.eventCode, metaState);
|
||||
sendMetaKeys(flags, metaState, false);
|
||||
int metaState = 0;
|
||||
for (int i = 0; i < mods.size(); i++)
|
||||
metaState = sendMetaKeyForModifier(mods.get(i), metaState, true);
|
||||
send_keyevent(KeyEvent.ACTION_DOWN, keyCode, metaState);
|
||||
send_keyevent(KeyEvent.ACTION_UP, keyCode, metaState);
|
||||
for (int i = mods.size() - 1; i >= 0; i--)
|
||||
metaState = sendMetaKeyForModifier(mods.get(i), metaState, false);
|
||||
}
|
||||
|
||||
void send_keyevent(int eventAction, int eventCode, int meta)
|
||||
{
|
||||
InputConnection conn = _recv.getCurrentInputConnection();
|
||||
if (conn == null)
|
||||
return;
|
||||
conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0, meta));
|
||||
if (eventAction == KeyEvent.ACTION_UP)
|
||||
_autocap.event_sent(eventCode, meta);
|
||||
}
|
||||
|
||||
void send_text(CharSequence text)
|
||||
{
|
||||
InputConnection conn = _recv.getCurrentInputConnection();
|
||||
if (conn == null)
|
||||
return;
|
||||
conn.commitText(text, 1);
|
||||
_autocap.typed(text);
|
||||
}
|
||||
|
||||
/** See {!InputConnection.performContextMenuAction}. */
|
||||
void send_context_menu_action(int id)
|
||||
{
|
||||
InputConnection conn = _recv.getCurrentInputConnection();
|
||||
if (conn == null)
|
||||
return;
|
||||
conn.performContextMenuAction(id);
|
||||
}
|
||||
|
||||
public static interface IReceiver
|
||||
@ -90,15 +161,25 @@ class KeyEventHandler implements Config.IKeyEventHandler
|
||||
public void setPane_emoji();
|
||||
public void setPane_normal();
|
||||
public void showKeyboardConfig();
|
||||
public void performAction();
|
||||
|
||||
public void switchMain();
|
||||
public void switchNumeric();
|
||||
public void switchProgramming();
|
||||
public void switch_main();
|
||||
public void switch_second();
|
||||
public void switch_layout(int layout_id);
|
||||
|
||||
public void sendKeyEvent(int eventAction, int eventCode, int meta);
|
||||
public void set_shift_state(boolean state, boolean lock);
|
||||
|
||||
public void commitText(String text);
|
||||
public void commitChar(char c);
|
||||
public InputConnection getCurrentInputConnection();
|
||||
}
|
||||
|
||||
class Autocapitalisation_callback implements Autocapitalisation.Callback
|
||||
{
|
||||
@Override
|
||||
public void update_shift_state(boolean should_enable, boolean should_disable)
|
||||
{
|
||||
if (should_enable)
|
||||
_recv.set_shift_state(true, false);
|
||||
else if (should_disable)
|
||||
_recv.set_shift_state(false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.util.SparseArray;
|
||||
import android.view.KeyCharacterMap;
|
||||
import android.view.KeyEvent;
|
||||
import java.util.HashMap;
|
||||
@ -8,75 +7,383 @@ import java.util.HashMap;
|
||||
class KeyModifier
|
||||
{
|
||||
/** Cache key is KeyValue's name */
|
||||
private static HashMap<String, SparseArray<KeyValue>> _cache =
|
||||
new HashMap<String, SparseArray<KeyValue>>();
|
||||
|
||||
/** Represents a removed key, because a cache entry can't be [null]. */
|
||||
private static final KeyValue removed_key = KeyValue.getKeyByName("removed");
|
||||
private static HashMap<KeyValue, HashMap<Pointers.Modifiers, KeyValue>> _cache =
|
||||
new HashMap<KeyValue, HashMap<Pointers.Modifiers, KeyValue>>();
|
||||
|
||||
/** Modify a key according to modifiers. */
|
||||
public static KeyValue handleFlags(KeyValue k, int flags)
|
||||
public static KeyValue modify(KeyValue k, Pointers.Modifiers mods)
|
||||
{
|
||||
if (k == null)
|
||||
return null;
|
||||
SparseArray<KeyValue> ks = cacheEntry(k);
|
||||
KeyValue r = ks.get(flags);
|
||||
if (r == null) // Cold cache
|
||||
int n_mods = mods.size();
|
||||
HashMap<Pointers.Modifiers, KeyValue> ks = cacheEntry(k);
|
||||
KeyValue r = ks.get(mods);
|
||||
if (r == null)
|
||||
{
|
||||
r = k;
|
||||
r = handleFn(r, flags);
|
||||
r = handleShift(r, flags);
|
||||
r = handleAccents(r, flags);
|
||||
ks.put(flags, r);
|
||||
/* Order: Fn, Shift, accents */
|
||||
for (int i = 0; i < n_mods; i++)
|
||||
r = modify(r, mods.get(i));
|
||||
ks.put(mods, r);
|
||||
}
|
||||
return (r == removed_key) ? null : r;
|
||||
/* Keys with an empty string are placeholder keys. */
|
||||
return (r.getString().length() == 0) ? null : r;
|
||||
}
|
||||
|
||||
private static KeyValue handleAccents(KeyValue k, int flags)
|
||||
public static KeyValue modify(KeyValue k, KeyValue.Modifier mod)
|
||||
{
|
||||
if (k.char_ == KeyValue.CHAR_NONE || (flags & KeyValue.FLAGS_ACCENTS) == 0)
|
||||
return k;
|
||||
char c = handleAccentChar(k.char_, flags);
|
||||
if (c == 0 || c == k.char_)
|
||||
return k;
|
||||
return k.withCharAndSymbol(c);
|
||||
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 handleShift(KeyValue k, int flags)
|
||||
private static KeyValue apply_map_char(KeyValue k, Map_char map)
|
||||
{
|
||||
if ((flags & KeyValue.FLAG_SHIFT) == 0)
|
||||
return k;
|
||||
char c = k.char_;
|
||||
if (k.char_ != KeyValue.CHAR_NONE)
|
||||
c = Character.toUpperCase(c);
|
||||
if (c == k.char_) // Used to have more rules if toUpperCase() did nothing
|
||||
return k;
|
||||
return k.withCharAndSymbol(c);
|
||||
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 char handleAccentChar(char c, int flags)
|
||||
private static KeyValue apply_dead_char(KeyValue k, char dead_char)
|
||||
{
|
||||
switch ((flags & KeyValue.FLAGS_ACCENTS))
|
||||
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;
|
||||
int e;
|
||||
switch (k.getChar())
|
||||
{
|
||||
case 'a': e = KeyEvent.KEYCODE_A; break;
|
||||
case 'b': e = KeyEvent.KEYCODE_B; break;
|
||||
case 'c': e = KeyEvent.KEYCODE_C; break;
|
||||
case 'd': e = KeyEvent.KEYCODE_D; break;
|
||||
case 'e': e = KeyEvent.KEYCODE_E; break;
|
||||
case 'f': e = KeyEvent.KEYCODE_F; break;
|
||||
case 'g': e = KeyEvent.KEYCODE_G; break;
|
||||
case 'h': e = KeyEvent.KEYCODE_H; break;
|
||||
case 'i': e = KeyEvent.KEYCODE_I; break;
|
||||
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 HashMap<Pointers.Modifiers, KeyValue> cacheEntry(KeyValue k)
|
||||
{
|
||||
HashMap<Pointers.Modifiers, KeyValue> ks = _cache.get(k);
|
||||
if (ks == null)
|
||||
{
|
||||
ks = new HashMap<Pointers.Modifiers, KeyValue>();
|
||||
_cache.put(k, ks);
|
||||
}
|
||||
return ks;
|
||||
}
|
||||
|
||||
private static abstract class Map_char
|
||||
{
|
||||
public abstract char apply(char c);
|
||||
}
|
||||
|
||||
private static char map_char_shift(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
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)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
// Composite characters: a̋ e̋ i̋ m̋ ӳ
|
||||
case 'o': return 'ő';
|
||||
case 'u': return 'ű';
|
||||
case ' ': return '˝';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_ordinal =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
case KeyValue.FLAG_ACCENT1:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u02CB', c);
|
||||
case KeyValue.FLAG_ACCENT2:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u00B4', c);
|
||||
case KeyValue.FLAG_ACCENT3:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u02C6', c);
|
||||
case KeyValue.FLAG_ACCENT4:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u02DC', c);
|
||||
case KeyValue.FLAG_ACCENT5:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u00B8', c);
|
||||
case KeyValue.FLAG_ACCENT6:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u00A8', c);
|
||||
case KeyValue.FLAG_ACCENT_CARON:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u02C7', c);
|
||||
case KeyValue.FLAG_ACCENT_RING:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u02DA', c);
|
||||
case KeyValue.FLAG_ACCENT_MACRON:
|
||||
return (char)KeyCharacterMap.getDeadChar('\u00AF', c);
|
||||
case KeyValue.FLAG_ACCENT_ORDINAL:
|
||||
switch (c)
|
||||
{
|
||||
case 'a': return 'ª';
|
||||
@ -93,7 +400,13 @@ class KeyModifier
|
||||
case '*': return '°';
|
||||
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)
|
||||
{
|
||||
case '1': return '¹';
|
||||
@ -115,7 +428,13 @@ class KeyModifier
|
||||
case 'n': return 'ⁿ';
|
||||
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)
|
||||
{
|
||||
case '1': return '₁';
|
||||
@ -139,8 +458,12 @@ class KeyModifier
|
||||
case 'o': return 'ₒ';
|
||||
default: return c;
|
||||
}
|
||||
case KeyValue.FLAG_ACCENT_ARROWS:
|
||||
if ((flags & KeyValue.FLAG_SHIFT) == 0)
|
||||
}
|
||||
};
|
||||
|
||||
private static final Map_char map_char_arrows =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
@ -155,23 +478,11 @@ class KeyModifier
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return '⇙';
|
||||
case '2': return '⇓';
|
||||
case '3': return '⇘';
|
||||
case '4': return '⇐';
|
||||
case '6': return '⇒';
|
||||
case '7': return '⇖';
|
||||
case '8': return '⇑';
|
||||
case '9': return '⇗';
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
case KeyValue.FLAG_ACCENT_BOX:
|
||||
if ((flags & KeyValue.FLAG_SHIFT) == 0)
|
||||
};
|
||||
|
||||
private static final Map_char map_char_box =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
@ -189,115 +500,55 @@ class KeyModifier
|
||||
default: return c;
|
||||
}
|
||||
}
|
||||
else
|
||||
};
|
||||
|
||||
private static final Map_char map_char_slash =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '1': return '╚';
|
||||
case '2': return '╩';
|
||||
case '3': return '╝';
|
||||
case '4': return '╠';
|
||||
case '5': return '╬';
|
||||
case '6': return '╣';
|
||||
case '7': return '╔';
|
||||
case '8': return '╦';
|
||||
case '9': return '╗';
|
||||
case '0': return '═';
|
||||
case '.': return '║';
|
||||
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;
|
||||
}
|
||||
}
|
||||
default: return c; // Can't happen
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static KeyValue handleFn(KeyValue k, int flags)
|
||||
private static final Map_char map_char_bar =
|
||||
new Map_char() {
|
||||
public char apply(char c)
|
||||
{
|
||||
if ((flags & KeyValue.FLAG_FN) == 0)
|
||||
switch (c)
|
||||
{
|
||||
switch (k.name)
|
||||
{
|
||||
// Remove some keys when Fn is *not* activated
|
||||
case "f11_placeholder":
|
||||
case "f12_placeholder": return removed_key;
|
||||
default: return k;
|
||||
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;
|
||||
}
|
||||
}
|
||||
String name;
|
||||
switch (k.name)
|
||||
{
|
||||
case "1": name = "f1"; break;
|
||||
case "2": name = "f2"; break;
|
||||
case "3": name = "f3"; break;
|
||||
case "4": name = "f4"; break;
|
||||
case "5": name = "f5"; break;
|
||||
case "6": name = "f6"; break;
|
||||
case "7": name = "f7"; break;
|
||||
case "8": name = "f8"; break;
|
||||
case "9": name = "f9"; break;
|
||||
case "0": name = "f10"; break;
|
||||
case "f11_placeholder": name = "f11"; break;
|
||||
case "f12_placeholder": name = "f12"; 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 "]": name = "’"; break;
|
||||
case "(": name = "“"; break;
|
||||
case ")": name = "”"; break;
|
||||
case "'": name = "‚"; break;
|
||||
case "\"": name = "„"; break;
|
||||
case "-": name = "–"; break;
|
||||
case "_": name = "—"; break;
|
||||
case "^": name = "¬"; break;
|
||||
case "%": name = "‰"; break;
|
||||
case "=": name = "≈"; break;
|
||||
case "u": name = "µ"; break;
|
||||
case "a": name = "æ"; break;
|
||||
case "o": name = "œ"; break;
|
||||
case "esc": name = "insert"; break;
|
||||
case "*": name = "°"; break;
|
||||
case ".": name = "…"; break;
|
||||
case ",": name = "·"; break;
|
||||
case "!": name = "¡"; break;
|
||||
case "?": name = "¿"; break;
|
||||
case "tab": name = "\\t"; break;
|
||||
case "space": name = "nbsp"; break;
|
||||
case "↖": name = "⇖"; break;
|
||||
case "↑": name = "⇑"; break;
|
||||
case "↗": name = "⇗"; break;
|
||||
case "←": name = "⇐"; break;
|
||||
case "→": name = "⇒"; break;
|
||||
case "↙": name = "⇙"; break;
|
||||
case "↓": name = "⇓"; break;
|
||||
case "↘": name = "⇘"; break;
|
||||
// Currency symbols
|
||||
case "e": name = "€"; break;
|
||||
case "l": name = "£"; break;
|
||||
case "r": name = "₹"; break;
|
||||
case "y": name = "¥"; break;
|
||||
case "c": name = "¢"; break;
|
||||
case "p": name = "₱"; break;
|
||||
case "€": case "£": return removed_key; // Avoid showing these twice
|
||||
default: return k;
|
||||
}
|
||||
return KeyValue.getKeyByName(name);
|
||||
}
|
||||
|
||||
/* Lookup the cache entry for a key. Create it needed. */
|
||||
private static SparseArray<KeyValue> cacheEntry(KeyValue k)
|
||||
{
|
||||
SparseArray<KeyValue> ks = _cache.get(k.name);
|
||||
if (ks == null)
|
||||
{
|
||||
ks = new SparseArray<KeyValue>();
|
||||
_cache.put(k.name, ks);
|
||||
}
|
||||
return ks;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -4,274 +4,384 @@ import android.view.KeyCharacterMap;
|
||||
import android.view.KeyEvent;
|
||||
import java.util.HashMap;
|
||||
|
||||
class KeyValue
|
||||
final class KeyValue
|
||||
{
|
||||
public static final int EVENT_NONE = -1;
|
||||
public static final int EVENT_CONFIG = -2;
|
||||
public static final int EVENT_SWITCH_TEXT = -3;
|
||||
public static final int EVENT_SWITCH_NUMERIC = -4;
|
||||
public static final int EVENT_SWITCH_EMOJI = -5;
|
||||
public static final int EVENT_SWITCH_BACK_EMOJI = -6;
|
||||
public static final int EVENT_CHANGE_METHOD = -7;
|
||||
public static final int EVENT_ACTION = -8;
|
||||
public static final int EVENT_SWITCH_PROGRAMMING = -9;
|
||||
public static final char CHAR_NONE = '\0';
|
||||
public static enum Event
|
||||
{
|
||||
CONFIG,
|
||||
SWITCH_TEXT,
|
||||
SWITCH_NUMERIC,
|
||||
SWITCH_EMOJI,
|
||||
SWITCH_BACK_EMOJI,
|
||||
CHANGE_METHOD,
|
||||
ACTION,
|
||||
SWITCH_SECOND,
|
||||
SWITCH_SECOND_BACK,
|
||||
SWITCH_GREEKMATH,
|
||||
CAPS_LOCK,
|
||||
}
|
||||
|
||||
// Behavior flags
|
||||
public static final int FLAG_LATCH = 1;
|
||||
public static final int FLAG_LOCK = (1 << 1);
|
||||
public static final int FLAG_NOREPEAT = (1 << 2);
|
||||
public static final int FLAG_NOCHAR = (1 << 3);
|
||||
public static final int FLAG_PRECISE_REPEAT = (1 << 4);
|
||||
// Must be evaluated in the reverse order of their values.
|
||||
public static enum Modifier
|
||||
{
|
||||
SHIFT,
|
||||
CTRL,
|
||||
ALT,
|
||||
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
|
||||
}
|
||||
|
||||
// Rendering flags
|
||||
public static final int FLAG_KEY_FONT = (1 << 5);
|
||||
public static final int FLAG_SMALLER_FONT = (1 << 6);
|
||||
public static enum Editing
|
||||
{
|
||||
COPY,
|
||||
PASTE,
|
||||
CUT,
|
||||
SELECT_ALL,
|
||||
}
|
||||
|
||||
// Internal flags
|
||||
public static final int FLAG_LOCKED = (1 << 8);
|
||||
public static enum Kind
|
||||
{
|
||||
Char, String, Keyevent, Event, Modifier, Editing
|
||||
}
|
||||
|
||||
// Modifier flags
|
||||
public static final int FLAG_CTRL = (1 << 10);
|
||||
public static final int FLAG_SHIFT = (1 << 11);
|
||||
public static final int FLAG_ALT = (1 << 12);
|
||||
public static final int FLAG_FN = (1 << 13);
|
||||
public static final int FLAG_META = (1 << 14);
|
||||
// Behavior flags.
|
||||
public static final int FLAG_LATCH = (1 << 20);
|
||||
public static final int FLAG_LOCK = (1 << 21);
|
||||
// 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); // special font file
|
||||
public static final int FLAG_SMALLER_FONT = (1 << 25); // 25% smaller symbols
|
||||
public static final int FLAG_SECONDARY = (1 << 26); // dimmer
|
||||
// Used by [Pointers].
|
||||
public static final int FLAG_LOCKED = (1 << 28);
|
||||
public static final int FLAG_FAKE_PTR = (1 << 29);
|
||||
|
||||
// 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);
|
||||
public static final int FLAG_ACCENT_ARROWS = (1 << 29);
|
||||
public static final int FLAG_ACCENT_BOX = (1 << 30);
|
||||
// Ranges for the different components
|
||||
private static final int FLAGS_BITS = (0b111111111 << 20); // 9 bits wide
|
||||
private static final int KIND_BITS = (0b111 << 29); // 3 bits wide
|
||||
private static final int VALUE_BITS = ~(FLAGS_BITS | KIND_BITS); // 20 bits wide
|
||||
static
|
||||
{
|
||||
check((FLAGS_BITS & KIND_BITS) == 0); // No overlap
|
||||
check((FLAGS_BITS | KIND_BITS | VALUE_BITS) == ~0); // No holes
|
||||
}
|
||||
|
||||
public static final int FLAGS_ACCENTS = FLAG_ACCENT1 | FLAG_ACCENT2 |
|
||||
FLAG_ACCENT3 | FLAG_ACCENT4 | FLAG_ACCENT5 | FLAG_ACCENT6 |
|
||||
FLAG_ACCENT_CARON | FLAG_ACCENT_MACRON | FLAG_ACCENT_SUPERSCRIPT |
|
||||
FLAG_ACCENT_SUBSCRIPT | FLAG_ACCENT_ORDINAL | FLAG_ACCENT_ARROWS |
|
||||
FLAG_ACCENT_BOX | FLAG_ACCENT_RING;
|
||||
private final String _symbol;
|
||||
|
||||
// Language specific keys that are removed from the keyboard by default
|
||||
public static final int FLAG_LOCALIZED = (1 << 25);
|
||||
/** This field encodes three things: Kind, flags and value. */
|
||||
private final int _code;
|
||||
|
||||
public final String name;
|
||||
public final String symbol;
|
||||
public final char char_;
|
||||
public final int eventCode;
|
||||
public final int flags;
|
||||
public Kind getKind()
|
||||
{
|
||||
return Kind.values()[(_code & KIND_BITS) >>> 29];
|
||||
}
|
||||
|
||||
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)];
|
||||
}
|
||||
|
||||
/** Defined only when [getKind() == Kind.Editing]. */
|
||||
public Editing getEditing()
|
||||
{
|
||||
return Editing.values()[(_code & VALUE_BITS)];
|
||||
}
|
||||
|
||||
/* Update the char and the symbol. */
|
||||
public KeyValue withCharAndSymbol(char c)
|
||||
public KeyValue withChar(char c)
|
||||
{
|
||||
return withCharAndSymbol(String.valueOf(c), c);
|
||||
return new KeyValue(String.valueOf(c), Kind.Char, c, getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withCharAndSymbol(String s, char c)
|
||||
public KeyValue withString(String s)
|
||||
{
|
||||
return new KeyValue(name, s, c, eventCode, flags);
|
||||
return new KeyValue(s, Kind.String, 0, getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withNameAndSymbol(String n, String s)
|
||||
public KeyValue withSymbol(String s)
|
||||
{
|
||||
return new KeyValue(n, s, char_, eventCode, flags);
|
||||
return new KeyValue(s, (_code & KIND_BITS), (_code & VALUE_BITS), getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withKeyevent(int code)
|
||||
{
|
||||
return new KeyValue(_symbol, Kind.Keyevent, code, getFlags());
|
||||
}
|
||||
|
||||
public KeyValue withFlags(int f)
|
||||
{
|
||||
return new KeyValue(name, symbol, char_, eventCode, f);
|
||||
return new KeyValue(_symbol, (_code & KIND_BITS), (_code & VALUE_BITS), 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>();
|
||||
|
||||
public KeyValue(String n, String s, char c, int e, int f)
|
||||
public KeyValue(String s, int kind, int value, int flags)
|
||||
{
|
||||
name = n;
|
||||
symbol = s;
|
||||
char_ = c;
|
||||
eventCode = e;
|
||||
flags = f;
|
||||
check((kind & ~KIND_BITS) == 0);
|
||||
check((flags & ~FLAGS_BITS) == 0);
|
||||
check((value & ~VALUE_BITS) == 0);
|
||||
_symbol = s;
|
||||
_code = kind | flags | value;
|
||||
}
|
||||
|
||||
public KeyValue(String s, Kind k, int v, int f)
|
||||
{
|
||||
this(s, (k.ordinal() << 29), v, f);
|
||||
}
|
||||
|
||||
public static KeyValue getKeyByName(String name)
|
||||
{
|
||||
if (name == null)
|
||||
return null;
|
||||
KeyValue kv = KeyValue.keys.get(name);
|
||||
KeyValue kv = keys.get(name);
|
||||
if (kv != null)
|
||||
return kv;
|
||||
char c = (name.length() == 1) ? name.charAt(0) : CHAR_NONE;
|
||||
return new KeyValue(name, name, c, EVENT_NONE, 0);
|
||||
if (name.length() == 1)
|
||||
return new KeyValue(name, Kind.Char, name.charAt(0), 0);
|
||||
else
|
||||
return new KeyValue(name, Kind.String, 0, 0);
|
||||
}
|
||||
|
||||
private static void addKey(String name, String symbol, char c, int event, int flags)
|
||||
private static void addKey(String name, String symbol, Kind kind, int code, int flags)
|
||||
{
|
||||
keys.put(name, new KeyValue(name, symbol, c, event, flags));
|
||||
keys.put(name, new KeyValue(symbol, kind, code, flags));
|
||||
}
|
||||
|
||||
private static void addCharKey(char c, int event, int flags)
|
||||
private static void addCharKey(String name, String symbol, char c, int flags)
|
||||
{
|
||||
String name = String.valueOf(c);
|
||||
addKey(name, name, c, event, flags);
|
||||
addKey(name, symbol, Kind.Char, c, flags);
|
||||
}
|
||||
|
||||
private static void addCharKey(char c, int event)
|
||||
private static void addModifierKey(String name, String symbol, Modifier m, int flags)
|
||||
{
|
||||
addCharKey(c, event, 0);
|
||||
if (symbol.length() > 1)
|
||||
flags |= FLAG_SMALLER_FONT;
|
||||
addKey(name, symbol, Kind.Modifier, m.ordinal(),
|
||||
FLAG_LATCH | FLAG_SPECIAL | FLAG_SECONDARY | flags);
|
||||
}
|
||||
|
||||
private static void addModifierKey(String name, String symbol, int extra_flags)
|
||||
private static void addModifierKey(String name, int symbol, Modifier m, int flags)
|
||||
{
|
||||
addKey(name, symbol, CHAR_NONE, EVENT_NONE,
|
||||
FLAG_LATCH | FLAG_NOCHAR | FLAG_NOREPEAT | extra_flags);
|
||||
addModifierKey(name, String.valueOf((char)symbol), m, flags | FLAG_KEY_FONT);
|
||||
}
|
||||
|
||||
private static void addSpecialKey(String name, String symbol, int event)
|
||||
private static void addDiacritic(String name, int symbol, Modifier m)
|
||||
{
|
||||
addSpecialKey(name, symbol, event, 0);
|
||||
addKey(name, String.valueOf((char)symbol), Kind.Modifier, m.ordinal(),
|
||||
FLAG_LATCH | FLAG_SPECIAL | FLAG_KEY_FONT);
|
||||
}
|
||||
|
||||
private static void addSpecialKey(String name, String symbol, int event, int flags)
|
||||
private static void addEventKey(String name, String symbol, Event e, int flags)
|
||||
{
|
||||
addKey(name, symbol, CHAR_NONE, event, flags | FLAG_NOREPEAT);
|
||||
addKey(name, symbol, Kind.Event, e.ordinal(), flags | FLAG_SPECIAL | FLAG_SECONDARY);
|
||||
}
|
||||
|
||||
private static void addEventKey(String name, String symbol, int event)
|
||||
private static void addEventKey(String name, int symbol, Event e, int flags)
|
||||
{
|
||||
addEventKey(name, symbol, event, 0);
|
||||
addEventKey(name, String.valueOf((char)symbol), e, flags | FLAG_KEY_FONT);
|
||||
}
|
||||
|
||||
private static void addEventKey(String name, String symbol, int event, int flags)
|
||||
private static void addKeyeventKey(String name, String symbol, int code, int flags)
|
||||
{
|
||||
addKey(name, symbol, CHAR_NONE, event, flags);
|
||||
addKey(name, symbol, Kind.Keyevent, code, flags | FLAG_SECONDARY);
|
||||
}
|
||||
|
||||
private static void addKeyeventKey(String name, int symbol, int code, int flags)
|
||||
{
|
||||
addKeyeventKey(name, String.valueOf((char)symbol), code, flags | FLAG_KEY_FONT);
|
||||
}
|
||||
|
||||
private static void addEditingKey(String name, String symbol, Editing action)
|
||||
{
|
||||
addKey(name, symbol, Kind.Editing, action.ordinal(),
|
||||
FLAG_SPECIAL | FLAG_SECONDARY | FLAG_SMALLER_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
|
||||
{
|
||||
addModifierKey("shift", "\n", // Can't write u000A because Java is stupid
|
||||
FLAG_SHIFT | FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addModifierKey("ctrl", "Ctrl", FLAG_CTRL | FLAG_SMALLER_FONT);
|
||||
addModifierKey("alt", "Alt", FLAG_ALT | FLAG_SMALLER_FONT);
|
||||
addModifierKey("accent_aigu", "\u0050", FLAG_ACCENT2 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_caron", "\u0051", FLAG_ACCENT_CARON | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_cedille", "\u0052", FLAG_ACCENT5 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_circonflexe", "\u0053", FLAG_ACCENT3 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_grave", "\u0054", FLAG_ACCENT1 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_macron", "\u0055", FLAG_ACCENT_MACRON | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_ring", "\u0056", FLAG_ACCENT_RING | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_tilde", "\u0057", FLAG_ACCENT4 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("accent_trema", "\u0058", FLAG_ACCENT6 | FLAG_KEY_FONT | FLAG_LOCALIZED);
|
||||
addModifierKey("superscript", "Sup", FLAG_ACCENT_SUPERSCRIPT | FLAG_SMALLER_FONT);
|
||||
addModifierKey("subscript", "Sub", FLAG_ACCENT_SUBSCRIPT | FLAG_SMALLER_FONT);
|
||||
addModifierKey("ordinal", "Ord", FLAG_ACCENT_ORDINAL | FLAG_SMALLER_FONT);
|
||||
addModifierKey("arrows", "Arr", FLAG_ACCENT_ARROWS | FLAG_SMALLER_FONT);
|
||||
addModifierKey("box", "Box", FLAG_ACCENT_BOX | FLAG_SMALLER_FONT);
|
||||
addModifierKey("fn", "Fn", FLAG_FN | FLAG_SMALLER_FONT);
|
||||
addModifierKey("meta", "Meta", FLAG_META | FLAG_SMALLER_FONT);
|
||||
addModifierKey("shift", 0x0A, Modifier.SHIFT, 0);
|
||||
addModifierKey("ctrl", "Ctrl", Modifier.CTRL, 0);
|
||||
addModifierKey("alt", "Alt", Modifier.ALT, 0);
|
||||
addDiacritic("accent_aigu", 0x50, Modifier.AIGU);
|
||||
addDiacritic("accent_caron", 0x51, Modifier.CARON);
|
||||
addDiacritic("accent_cedille", 0x52, Modifier.CEDILLE);
|
||||
addDiacritic("accent_circonflexe", 0x53, Modifier.CIRCONFLEXE);
|
||||
addDiacritic("accent_grave", 0x54, Modifier.GRAVE);
|
||||
addDiacritic("accent_macron", 0x55, Modifier.MACRON);
|
||||
addDiacritic("accent_ring", 0x56, Modifier.RING);
|
||||
addDiacritic("accent_tilde", 0x57, Modifier.TILDE);
|
||||
addDiacritic("accent_trema", 0x58, Modifier.TREMA);
|
||||
addDiacritic("accent_ogonek", 0x59, Modifier.OGONEK);
|
||||
addDiacritic("accent_dot_above", 0x5A, Modifier.DOT_ABOVE);
|
||||
addDiacritic("accent_double_aigu", 0x5B, Modifier.DOUBLE_AIGU);
|
||||
addDiacritic("accent_slash", 0x5C, Modifier.SLASH);
|
||||
addDiacritic("accent_arrow_right", 0x5D, Modifier.ARROW_RIGHT);
|
||||
addDiacritic("accent_breve", 0x5E, Modifier.BREVE);
|
||||
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);
|
||||
|
||||
addCharKey('a', KeyEvent.KEYCODE_A);
|
||||
addCharKey('b', KeyEvent.KEYCODE_B);
|
||||
addCharKey('c', KeyEvent.KEYCODE_C);
|
||||
addCharKey('d', KeyEvent.KEYCODE_D);
|
||||
addCharKey('e', KeyEvent.KEYCODE_E);
|
||||
addCharKey('f', KeyEvent.KEYCODE_F);
|
||||
addCharKey('g', KeyEvent.KEYCODE_G);
|
||||
addCharKey('h', KeyEvent.KEYCODE_H);
|
||||
addCharKey('i', KeyEvent.KEYCODE_I);
|
||||
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);
|
||||
addEventKey("config", 0x04, Event.CONFIG, FLAG_SMALLER_FONT);
|
||||
addEventKey("switch_text", "ABC", Event.SWITCH_TEXT, FLAG_SMALLER_FONT);
|
||||
addEventKey("switch_numeric", "123+", Event.SWITCH_NUMERIC, FLAG_SMALLER_FONT);
|
||||
addEventKey("switch_emoji", 0x01, Event.SWITCH_EMOJI, FLAG_SMALLER_FONT);
|
||||
addEventKey("switch_back_emoji", "ABC", Event.SWITCH_BACK_EMOJI, 0);
|
||||
addEventKey("switch_second", 0x13, Event.SWITCH_SECOND, FLAG_SMALLER_FONT);
|
||||
addEventKey("switch_second_back", 0x14, Event.SWITCH_SECOND_BACK, FLAG_SMALLER_FONT);
|
||||
addEventKey("switch_greekmath", "πλ∇¬", Event.SWITCH_GREEKMATH, FLAG_SMALLER_FONT);
|
||||
addEventKey("change_method", 0x09, Event.CHANGE_METHOD, FLAG_SMALLER_FONT);
|
||||
addEventKey("action", "Action", Event.ACTION, FLAG_SMALLER_FONT); // Will always be replaced
|
||||
addEventKey("capslock", 0x12, Event.CAPS_LOCK, 0);
|
||||
|
||||
addSpecialKey("config", "\u0004", EVENT_CONFIG, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addSpecialKey("switch_text", "ABC", EVENT_SWITCH_TEXT, FLAG_SMALLER_FONT);
|
||||
addSpecialKey("switch_numeric", "123+", EVENT_SWITCH_NUMERIC, FLAG_SMALLER_FONT);
|
||||
addSpecialKey("switch_emoji", "\u0001" , EVENT_SWITCH_EMOJI, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addSpecialKey("switch_back_emoji", "ABC", EVENT_SWITCH_BACK_EMOJI);
|
||||
addSpecialKey("switch_programming", "Prog", EVENT_SWITCH_PROGRAMMING, FLAG_SMALLER_FONT);
|
||||
addSpecialKey("change_method", "\u0009", EVENT_CHANGE_METHOD, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addSpecialKey("action", "Action", EVENT_ACTION, FLAG_SMALLER_FONT); // Will always be replaced
|
||||
addKeyeventKey("esc", "Esc", KeyEvent.KEYCODE_ESCAPE, FLAG_SMALLER_FONT);
|
||||
addKeyeventKey("enter", 0x0E, KeyEvent.KEYCODE_ENTER, 0);
|
||||
addKeyeventKey("up", 0x05, KeyEvent.KEYCODE_DPAD_UP, FLAG_PRECISE_REPEAT);
|
||||
addKeyeventKey("right", 0x06, KeyEvent.KEYCODE_DPAD_RIGHT, FLAG_PRECISE_REPEAT);
|
||||
addKeyeventKey("down", 0x07, KeyEvent.KEYCODE_DPAD_DOWN, FLAG_PRECISE_REPEAT);
|
||||
addKeyeventKey("left", 0x08, KeyEvent.KEYCODE_DPAD_LEFT, FLAG_PRECISE_REPEAT);
|
||||
addKeyeventKey("page_up", 0x02, KeyEvent.KEYCODE_PAGE_UP, 0);
|
||||
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);
|
||||
|
||||
addEventKey("esc", "Esc", KeyEvent.KEYCODE_ESCAPE, FLAG_SMALLER_FONT);
|
||||
addEventKey("enter", "\u000E", KeyEvent.KEYCODE_ENTER, FLAG_KEY_FONT);
|
||||
addEventKey("up", "\u0005", KeyEvent.KEYCODE_DPAD_UP, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addEventKey("right", "\u0006", KeyEvent.KEYCODE_DPAD_RIGHT, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addEventKey("down", "\u0007", KeyEvent.KEYCODE_DPAD_DOWN, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addEventKey("left", "\u0008", KeyEvent.KEYCODE_DPAD_LEFT, FLAG_KEY_FONT | FLAG_PRECISE_REPEAT);
|
||||
addEventKey("page_up", "\u0002", KeyEvent.KEYCODE_PAGE_UP, FLAG_KEY_FONT);
|
||||
addEventKey("page_down", "\u0003", KeyEvent.KEYCODE_PAGE_DOWN, FLAG_KEY_FONT);
|
||||
addEventKey("home", "\u000B", KeyEvent.KEYCODE_MOVE_HOME, FLAG_KEY_FONT);
|
||||
addEventKey("end", "\u000C", KeyEvent.KEYCODE_MOVE_END, FLAG_KEY_FONT);
|
||||
addEventKey("backspace", "\u0011", KeyEvent.KEYCODE_DEL, FLAG_KEY_FONT);
|
||||
addEventKey("delete", "\u0010", KeyEvent.KEYCODE_FORWARD_DEL, FLAG_KEY_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("f11", "F11", KeyEvent.KEYCODE_F11, FLAG_SMALLER_FONT);
|
||||
addEventKey("f12", "F12", KeyEvent.KEYCODE_F12, FLAG_SMALLER_FONT);
|
||||
addEventKey("tab", "\u000F", KeyEvent.KEYCODE_TAB, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addCharKey("\\t", "\\t", '\t', 0); // Send the tab character
|
||||
addCharKey("space", "\r", ' ', FLAG_KEY_FONT | FLAG_SECONDARY);
|
||||
addCharKey("nbsp", "\u237d", '\u00a0', FLAG_SMALLER_FONT);
|
||||
|
||||
addKey("\\t", "\\t", '\t', EVENT_NONE, 0); // Send the tab character
|
||||
addKey("space", "\r", ' ', KeyEvent.KEYCODE_SPACE, FLAG_KEY_FONT);
|
||||
addKey("nbsp", "\u237d", '\u00a0', EVENT_NONE, FLAG_KEY_FONT | FLAG_SMALLER_FONT);
|
||||
addPlaceholderKey("removed");
|
||||
addPlaceholderKey("f11_placeholder");
|
||||
addPlaceholderKey("f12_placeholder");
|
||||
|
||||
addEditingKey("copy", "copy", Editing.COPY);
|
||||
addEditingKey("paste", "paste", Editing.PASTE);
|
||||
addEditingKey("cut", "cut", Editing.CUT);
|
||||
addEditingKey("select_all", "s. all", Editing.SELECT_ALL);
|
||||
}
|
||||
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
@ -6,22 +6,22 @@ import android.content.SharedPreferences;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.os.Build.VERSION;
|
||||
import android.os.IBinder;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.text.InputType;
|
||||
import android.util.Log;
|
||||
import android.util.LogPrinter;
|
||||
import android.view.ContextThemeWrapper;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
import android.view.inputmethod.EditorInfo;
|
||||
import android.view.inputmethod.InputConnection;
|
||||
import android.view.inputmethod.InputMethodInfo;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.view.inputmethod.InputMethodSubtype;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
import android.util.Log;
|
||||
import android.util.LogPrinter;
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class Keyboard2 extends InputMethodService
|
||||
@ -30,29 +30,35 @@ public class Keyboard2 extends InputMethodService
|
||||
static private final String TAG = "Keyboard2";
|
||||
|
||||
private Keyboard2View _keyboardView;
|
||||
private int _currentTextLayout;
|
||||
private KeyEventHandler _keyeventhandler;
|
||||
// If not 'null', the layout to use instead of [_currentTextLayout].
|
||||
private KeyboardData _currentSpecialLayout;
|
||||
private KeyboardData _currentTextLayout;
|
||||
private KeyboardData _localeTextLayout;
|
||||
private ViewGroup _emojiPane = null;
|
||||
|
||||
private Config _config;
|
||||
|
||||
private boolean _debug_logs = false;
|
||||
|
||||
private KeyboardData getLayout(int resId)
|
||||
KeyboardData main_layout()
|
||||
{
|
||||
return KeyboardData.load(getResources(), resId);
|
||||
return (_currentSpecialLayout != null) ? _currentSpecialLayout : _currentTextLayout;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate()
|
||||
{
|
||||
super.onCreate();
|
||||
PreferenceManager.setDefaultValues(this, R.xml.settings, false);
|
||||
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
|
||||
Config.initGlobalConfig(this, new KeyEventHandler(this.new Receiver()));
|
||||
KeyboardData.init(getResources());
|
||||
SharedPreferences prefs = DirectBootAwarePreferences.get_shared_preferences(this);
|
||||
prefs.registerOnSharedPreferenceChangeListener(this);
|
||||
_keyeventhandler = new KeyEventHandler(getMainLooper(), this.new Receiver());
|
||||
Config.initGlobalConfig(prefs, getResources(), _keyeventhandler);
|
||||
_config = Config.globalConfig();
|
||||
_config.refresh(this);
|
||||
_keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard);
|
||||
_keyboardView.reset();
|
||||
setInputView(_keyboardView);
|
||||
_debug_logs = getResources().getBoolean(R.bool.debug_logs);
|
||||
}
|
||||
|
||||
@ -62,40 +68,36 @@ public class Keyboard2 extends InputMethodService
|
||||
for (InputMethodInfo imi : imm.getEnabledInputMethodList())
|
||||
if (imi.getPackageName().equals(pkg))
|
||||
return imm.getEnabledInputMethodSubtypeList(imi, true);
|
||||
return null;
|
||||
return Arrays.asList();
|
||||
}
|
||||
|
||||
private void refreshSubtypeLayout(InputMethodSubtype subtype)
|
||||
{
|
||||
int l = _config.layout;
|
||||
if (l == -1)
|
||||
{
|
||||
String s = subtype.getExtraValueOf("default_layout");
|
||||
if (s != null)
|
||||
l = Config.layoutId_of_string(s);
|
||||
_localeTextLayout = _config.layout_of_string(getResources(), s);
|
||||
else
|
||||
l = R.xml.qwerty;
|
||||
}
|
||||
_currentTextLayout = l;
|
||||
_localeTextLayout = KeyboardData.load(getResources(), R.xml.qwerty);
|
||||
}
|
||||
|
||||
private void extra_keys_of_subtype(Set<String> dst, InputMethodSubtype subtype)
|
||||
private void extra_keys_of_subtype(Set<KeyValue> dst, InputMethodSubtype subtype)
|
||||
{
|
||||
String extra_keys = subtype.getExtraValueOf("extra_keys");
|
||||
if (extra_keys == null)
|
||||
return;
|
||||
String[] ks = extra_keys.split("\\|");
|
||||
for (int i = 0; i < ks.length; i++)
|
||||
dst.add(ks[i]);
|
||||
dst.add(KeyValue.getKeyByName(ks[i]));
|
||||
}
|
||||
|
||||
private void refreshAccentsOption(InputMethodManager imm, InputMethodSubtype subtype)
|
||||
{
|
||||
HashSet<String> extra_keys = new HashSet<String>();
|
||||
HashSet<KeyValue> extra_keys = new HashSet<KeyValue>();
|
||||
List<InputMethodSubtype> enabled_subtypes = getEnabledSubtypes(imm);
|
||||
switch (_config.accents)
|
||||
{
|
||||
case 1:
|
||||
// '3' was "all accents", now unused
|
||||
case 1: case 3:
|
||||
extra_keys_of_subtype(extra_keys, subtype);
|
||||
for (InputMethodSubtype s : enabled_subtypes)
|
||||
extra_keys_of_subtype(extra_keys, s);
|
||||
@ -103,11 +105,10 @@ public class Keyboard2 extends InputMethodService
|
||||
case 2:
|
||||
extra_keys_of_subtype(extra_keys, subtype);
|
||||
break;
|
||||
case 3: extra_keys = null; break;
|
||||
case 4: break;
|
||||
default: throw new IllegalArgumentException();
|
||||
}
|
||||
_config.extra_keys = extra_keys;
|
||||
_config.extra_keys_subtype = extra_keys;
|
||||
if (enabled_subtypes.size() > 1)
|
||||
_config.shouldOfferSwitchingToNextInputMethod = true;
|
||||
}
|
||||
@ -117,17 +118,18 @@ public class Keyboard2 extends InputMethodService
|
||||
// Fallback for the accents option: Only respect the "None" case
|
||||
switch (_config.accents)
|
||||
{
|
||||
case 1: case 2: case 3: _config.extra_keys = null; break;
|
||||
case 4: _config.extra_keys = new HashSet<String>(); break;
|
||||
case 1: case 2: case 3: _config.extra_keys_subtype = null; break;
|
||||
case 4: _config.extra_keys_subtype = new HashSet<KeyValue>(); break;
|
||||
}
|
||||
// Fallback for the layout option: Use qwerty in the "system settings" case
|
||||
_currentTextLayout = (_config.layout == -1) ? R.xml.qwerty : _config.layout;
|
||||
}
|
||||
|
||||
private void refreshSubtypeImm()
|
||||
{
|
||||
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
_config.shouldOfferSwitchingToNextInputMethod = imm.shouldOfferSwitchingToNextInputMethod(getConnectionToken());
|
||||
if (VERSION.SDK_INT < 28)
|
||||
_config.shouldOfferSwitchingToNextInputMethod = true;
|
||||
else
|
||||
_config.shouldOfferSwitchingToNextInputMethod = shouldOfferSwitchingToNextInputMethod();
|
||||
if (VERSION.SDK_INT < 12)
|
||||
{
|
||||
// Subtypes won't work well under API level 12 (getExtraValueOf)
|
||||
@ -136,12 +138,21 @@ public class Keyboard2 extends InputMethodService
|
||||
else
|
||||
{
|
||||
InputMethodSubtype subtype = imm.getCurrentInputMethodSubtype();
|
||||
if (subtype == null)
|
||||
{
|
||||
// On some rare cases, [subtype] is null.
|
||||
refreshSubtypeLegacyFallback();
|
||||
}
|
||||
else
|
||||
{
|
||||
refreshSubtypeLayout(subtype);
|
||||
refreshAccentsOption(imm, subtype);
|
||||
}
|
||||
_config.shouldOfferSwitchingToProgramming =
|
||||
_config.programming_layout != -1 &&
|
||||
_currentTextLayout != _config.programming_layout;
|
||||
}
|
||||
_config.shouldOfferSwitchingToSecond =
|
||||
_config.second_layout != null &&
|
||||
_currentTextLayout != _config.second_layout;
|
||||
_currentTextLayout = (_config.layout == null) ? _localeTextLayout : _config.layout;
|
||||
}
|
||||
|
||||
private String actionLabel_of_imeAction(int action)
|
||||
@ -162,37 +173,41 @@ public class Keyboard2 extends InputMethodService
|
||||
return getResources().getString(res);
|
||||
}
|
||||
|
||||
private void refreshEditorInfo(EditorInfo info)
|
||||
private void refresh_action_label(EditorInfo info)
|
||||
{
|
||||
// First try to look at 'info.actionLabel', if it isn't set, look at
|
||||
// 'imeOptions'.
|
||||
if (info.actionLabel != null)
|
||||
{
|
||||
_config.actionLabel = info.actionLabel.toString();
|
||||
_config.actionId = info.actionId;
|
||||
_keyeventhandler.actionId = info.actionId;
|
||||
_config.swapEnterActionKey = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
int action = info.imeOptions & EditorInfo.IME_MASK_ACTION;
|
||||
_config.actionLabel = actionLabel_of_imeAction(action); // Might be null
|
||||
_config.actionId = action;
|
||||
_keyeventhandler.actionId = action;
|
||||
_config.swapEnterActionKey =
|
||||
(info.imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) == 0;
|
||||
}
|
||||
}
|
||||
|
||||
private void refreshConfig()
|
||||
/** Might re-create the keyboard view. [_keyboardView.setKeyboard()] must be
|
||||
called soon after. */
|
||||
private void refresh_config()
|
||||
{
|
||||
int prev_theme = _config.theme;
|
||||
_config.refresh(this);
|
||||
_config.refresh(getResources());
|
||||
refreshSubtypeImm();
|
||||
// Refreshing the theme config requires re-creating the views
|
||||
if (prev_theme != _config.theme)
|
||||
{
|
||||
_keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard);
|
||||
setInputView(_keyboardView);
|
||||
_emojiPane = null;
|
||||
}
|
||||
_keyboardView.reset();
|
||||
}
|
||||
|
||||
private void log_editor_info(EditorInfo info)
|
||||
@ -205,16 +220,27 @@ public class Keyboard2 extends InputMethodService
|
||||
Log.d(TAG, "actionLabel: "+_config.actionLabel);
|
||||
}
|
||||
|
||||
private void refresh_special_layout(EditorInfo info)
|
||||
{
|
||||
switch (info.inputType & InputType.TYPE_MASK_CLASS)
|
||||
{
|
||||
case InputType.TYPE_CLASS_NUMBER:
|
||||
case InputType.TYPE_CLASS_PHONE:
|
||||
case InputType.TYPE_CLASS_DATETIME:
|
||||
_currentSpecialLayout = KeyboardData.load_pin_entry(getResources());
|
||||
default:
|
||||
_currentSpecialLayout = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartInputView(EditorInfo info, boolean restarting)
|
||||
{
|
||||
refreshConfig();
|
||||
refreshEditorInfo(info);
|
||||
if ((info.inputType & InputType.TYPE_CLASS_NUMBER) != 0)
|
||||
_keyboardView.setKeyboard(getLayout(R.xml.numeric));
|
||||
else
|
||||
_keyboardView.setKeyboard(getLayout(_currentTextLayout));
|
||||
setInputView(_keyboardView);
|
||||
refresh_config();
|
||||
refresh_action_label(info);
|
||||
refresh_special_layout(info);
|
||||
_keyboardView.setKeyboard(main_layout());
|
||||
_keyeventhandler.started(info);
|
||||
if (_debug_logs)
|
||||
log_editor_info(info);
|
||||
}
|
||||
@ -232,7 +258,14 @@ public class Keyboard2 extends InputMethodService
|
||||
public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype)
|
||||
{
|
||||
refreshSubtypeImm();
|
||||
_keyboardView.setKeyboard(getLayout(_currentTextLayout));
|
||||
_keyboardView.setKeyboard(main_layout());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdateSelection(int oldSelStart, int oldSelEnd, int newSelStart, int newSelEnd, int candidatesStart, int candidatesEnd)
|
||||
{
|
||||
super.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd, candidatesStart, candidatesEnd);
|
||||
_keyeventhandler.selection_updated(oldSelStart, newSelStart);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -243,9 +276,17 @@ public class Keyboard2 extends InputMethodService
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
|
||||
public void onSharedPreferenceChanged(SharedPreferences _prefs, String _key)
|
||||
{
|
||||
refreshConfig();
|
||||
refresh_config();
|
||||
_keyboardView.setKeyboard(main_layout());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onEvaluateFullscreenMode()
|
||||
{
|
||||
/* Entirely disable fullscreen mode. */
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Not static */
|
||||
@ -271,48 +312,38 @@ public class Keyboard2 extends InputMethodService
|
||||
setInputView(_keyboardView);
|
||||
}
|
||||
|
||||
public void performAction()
|
||||
public void set_shift_state(boolean state, boolean lock)
|
||||
{
|
||||
InputConnection conn = getCurrentInputConnection();
|
||||
if (conn == null)
|
||||
return;
|
||||
conn.performEditorAction(_config.actionId);
|
||||
_keyboardView.set_shift_state(state, lock);
|
||||
}
|
||||
|
||||
public void switchMain()
|
||||
public void switch_main()
|
||||
{
|
||||
_keyboardView.setKeyboard(getLayout(_currentTextLayout));
|
||||
_keyboardView.setKeyboard(main_layout());
|
||||
}
|
||||
|
||||
public void switchNumeric()
|
||||
public void switch_layout(int layout_id)
|
||||
{
|
||||
_keyboardView.setKeyboard(getLayout(R.xml.numeric));
|
||||
_keyboardView.setKeyboard(KeyboardData.load(getResources(), layout_id));
|
||||
}
|
||||
|
||||
public void switchProgramming()
|
||||
public void switch_second()
|
||||
{
|
||||
if (_config.programming_layout == -1)
|
||||
if (_config.second_layout == null)
|
||||
return;
|
||||
KeyboardData layout =
|
||||
getLayout(_config.programming_layout).replaceKeys(new KeyboardData.MapKeys() {
|
||||
public KeyValue apply(KeyValue key)
|
||||
_config.second_layout.mapKeys(new KeyboardData.MapKeyValues() {
|
||||
public KeyValue apply(KeyValue key, boolean localized)
|
||||
{
|
||||
if (key != null && key.eventCode == KeyValue.EVENT_SWITCH_PROGRAMMING)
|
||||
return KeyValue.getKeyByName("switch_text");
|
||||
if (key.getKind() == KeyValue.Kind.Event
|
||||
&& key.getEvent() == KeyValue.Event.SWITCH_SECOND)
|
||||
return KeyValue.getKeyByName("switch_second_back");
|
||||
return key;
|
||||
}
|
||||
});
|
||||
_keyboardView.setKeyboard(layout);
|
||||
}
|
||||
|
||||
public void sendKeyEvent(int eventAction, int eventCode, int meta)
|
||||
{
|
||||
InputConnection conn = getCurrentInputConnection();
|
||||
if (conn == null)
|
||||
return;
|
||||
conn.sendKeyEvent(new KeyEvent(1, 1, eventAction, eventCode, 0, meta));
|
||||
}
|
||||
|
||||
public void showKeyboardConfig()
|
||||
{
|
||||
Intent intent = new Intent(Keyboard2.this, SettingsActivity.class);
|
||||
@ -320,14 +351,9 @@ public class Keyboard2 extends InputMethodService
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
public void commitText(String text)
|
||||
public InputConnection getCurrentInputConnection()
|
||||
{
|
||||
getCurrentInputConnection().commitText(text, 1);
|
||||
}
|
||||
|
||||
public void commitChar(char c)
|
||||
{
|
||||
sendKeyChar(c);
|
||||
return Keyboard2.this.getCurrentInputConnection();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,29 +1,31 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.ContextWrapper;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.os.Vibrator;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.os.Build.VERSION;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class Keyboard2View extends View
|
||||
implements View.OnTouchListener, Pointers.IPointerEventHandler
|
||||
{
|
||||
private static final long VIBRATE_MIN_INTERVAL = 100;
|
||||
|
||||
private KeyboardData _keyboard;
|
||||
private KeyValue _shift_kv;
|
||||
private KeyboardData.Key _shift_key;
|
||||
|
||||
private Pointers _pointers;
|
||||
|
||||
private int _flags = 0;
|
||||
|
||||
private Vibrator _vibratorService;
|
||||
private long _lastVibration = 0;
|
||||
private Pointers.Modifiers _mods;
|
||||
|
||||
private static int _currentWhat = 0;
|
||||
|
||||
@ -45,65 +47,103 @@ public class Keyboard2View extends View
|
||||
public Keyboard2View(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
_vibratorService = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
|
||||
_theme = new Theme(getContext(), attrs);
|
||||
_config = Config.globalConfig();
|
||||
_pointers = new Pointers(this, _config);
|
||||
refresh_navigation_bar(context);
|
||||
setOnTouchListener(this);
|
||||
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)
|
||||
{
|
||||
_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();
|
||||
}
|
||||
|
||||
public void reset()
|
||||
{
|
||||
_flags = 0;
|
||||
_mods = Pointers.Modifiers.EMPTY;
|
||||
_pointers.clear();
|
||||
requestLayout();
|
||||
invalidate();
|
||||
}
|
||||
|
||||
public KeyValue onPointerDown(KeyValue k)
|
||||
/** Called by auto-capitalisation. */
|
||||
public void set_shift_state(boolean state, boolean lock)
|
||||
{
|
||||
if (_keyboard == null || _shift_key == null)
|
||||
return;
|
||||
if (state)
|
||||
_pointers.add_fake_pointer(_shift_kv, _shift_key, lock);
|
||||
else
|
||||
_pointers.remove_fake_pointer(_shift_kv, _shift_key);
|
||||
invalidate();
|
||||
}
|
||||
|
||||
public KeyValue modifyKey(KeyValue k, Pointers.Modifiers mods)
|
||||
{
|
||||
return KeyModifier.modify(k, mods);
|
||||
}
|
||||
|
||||
public void onPointerDown(boolean isSwipe)
|
||||
{
|
||||
k = KeyModifier.handleFlags(k, _flags);
|
||||
invalidate();
|
||||
if (k != null)
|
||||
vibrate();
|
||||
return k;
|
||||
}
|
||||
|
||||
public KeyValue onPointerSwipe(KeyValue k)
|
||||
public void onPointerUp(KeyValue k, Pointers.Modifiers mods)
|
||||
{
|
||||
k = KeyModifier.handleFlags(k, _flags);
|
||||
_config.handler.key_up(k, mods);
|
||||
invalidate();
|
||||
if (k != null)
|
||||
}
|
||||
|
||||
public void onPointerHold(KeyValue k, Pointers.Modifiers mods)
|
||||
{
|
||||
_config.handler.key_up(k, mods);
|
||||
}
|
||||
|
||||
public void onPointerFlagsChanged(boolean shouldVibrate)
|
||||
{
|
||||
invalidate();
|
||||
if (shouldVibrate)
|
||||
vibrate();
|
||||
return k;
|
||||
}
|
||||
|
||||
public void onPointerUp(KeyValue k)
|
||||
{
|
||||
_config.handler.handleKeyUp(k, _flags);
|
||||
invalidate();
|
||||
}
|
||||
|
||||
public void onPointerHold(KeyValue k)
|
||||
{
|
||||
_config.handler.handleKeyUp(k, _flags);
|
||||
}
|
||||
|
||||
public void onPointerFlagsChanged()
|
||||
{
|
||||
invalidate();
|
||||
}
|
||||
|
||||
private void updateFlags()
|
||||
{
|
||||
_flags = _pointers.getFlags();
|
||||
_mods = _pointers.getModifiers();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -130,7 +170,7 @@ public class Keyboard2View extends View
|
||||
_pointers.onTouchMove(event.getX(p), event.getY(p), event.getPointerId(p));
|
||||
break;
|
||||
case MotionEvent.ACTION_CANCEL:
|
||||
_pointers.onTouchCancel(event.getPointerId(event.getActionIndex()));
|
||||
_pointers.onTouchCancel();
|
||||
break;
|
||||
default:
|
||||
return (false);
|
||||
@ -160,9 +200,13 @@ public class Keyboard2View extends View
|
||||
return null;
|
||||
for (KeyboardData.Key key : row.keys)
|
||||
{
|
||||
x += (key.shift + key.width) * _keyWidth;
|
||||
if (tx < x)
|
||||
float xLeft = x + key.shift * _keyWidth;
|
||||
float xRight = xLeft + key.width * _keyWidth;
|
||||
if (tx < xLeft)
|
||||
return null;
|
||||
if (tx < xRight)
|
||||
return key;
|
||||
x = xRight;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@ -171,18 +215,10 @@ public class Keyboard2View extends View
|
||||
{
|
||||
if (!_config.vibrateEnabled)
|
||||
return ;
|
||||
long now = System.currentTimeMillis();
|
||||
if ((now - _lastVibration) > VIBRATE_MIN_INTERVAL)
|
||||
if (VERSION.SDK_INT >= 5)
|
||||
{
|
||||
_lastVibration = now;
|
||||
try
|
||||
{
|
||||
_vibratorService.vibrate(_config.vibrateDuration);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY,
|
||||
HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);
|
||||
}
|
||||
}
|
||||
|
||||
@ -199,10 +235,33 @@ public class Keyboard2View extends View
|
||||
_keyWidth = (width - (_config.horizontalMargin * 2)) / _keyboard.keysWidth;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLayout(boolean changed, int left, int top, int right, int bottom)
|
||||
{
|
||||
if (!changed)
|
||||
return;
|
||||
if (VERSION.SDK_INT >= 29)
|
||||
{
|
||||
// Disable the back-gesture on the keyboard area
|
||||
Rect keyboard_area = new Rect(
|
||||
left + (int)_config.horizontalMargin,
|
||||
top + (int)_config.marginTop,
|
||||
right - (int)_config.horizontalMargin,
|
||||
bottom - (int)_config.marginBottom);
|
||||
setSystemGestureExclusionRects(Arrays.asList(keyboard_area));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas)
|
||||
{
|
||||
updateFlags();
|
||||
// Set keyboard background opacity
|
||||
getBackground().setAlpha(_config.keyboardOpacity);
|
||||
// Set keys opacity
|
||||
_theme.keyBgPaint.setAlpha(_config.keyOpacity);
|
||||
_theme.keyDownBgPaint.setAlpha(_config.keyActivatedOpacity);
|
||||
_theme.keyBorderPaint.setAlpha(_config.keyOpacity);
|
||||
float y = _config.marginTop + _config.keyVerticalInterval / 2;
|
||||
for (KeyboardData.Row row : _keyboard.rows)
|
||||
{
|
||||
@ -214,9 +273,7 @@ public class Keyboard2View extends View
|
||||
x += k.shift * _keyWidth;
|
||||
float keyW = _keyWidth * k.width - _config.keyHorizontalInterval;
|
||||
boolean isKeyDown = _pointers.isKeyDown(k);
|
||||
_tmpRect.set(x, y, x + keyW, y + keyH);
|
||||
canvas.drawRoundRect(_tmpRect, _theme.keyBorderRadius, _theme.keyBorderRadius,
|
||||
isKeyDown ? _theme.keyDownBgPaint : _theme.keyBgPaint);
|
||||
drawKeyFrame(canvas, x, y, keyW, keyH, isKeyDown);
|
||||
drawLabel(canvas, k.key0, keyW / 2f + x, y, keyH, isKeyDown);
|
||||
if (k.edgekeys)
|
||||
{
|
||||
@ -232,6 +289,10 @@ public class Keyboard2View extends View
|
||||
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);
|
||||
}
|
||||
if (k.indication != null)
|
||||
{
|
||||
drawIndication(canvas, k.indication, keyW / 2f + x, y, keyH);
|
||||
}
|
||||
x += _keyWidth * k.width;
|
||||
}
|
||||
y += row.height * _config.keyHeight;
|
||||
@ -244,42 +305,86 @@ public class Keyboard2View extends View
|
||||
super.onDetachedFromWindow();
|
||||
}
|
||||
|
||||
private int labelColor(KeyValue k, boolean isKeyDown, int defaultColor)
|
||||
/** Draw borders and background of the key. */
|
||||
void drawKeyFrame(Canvas canvas, float x, float y, float keyW, float keyH,
|
||||
boolean isKeyDown)
|
||||
{
|
||||
if (isKeyDown && (k.flags & KeyValue.FLAG_LATCH) != 0)
|
||||
float r = _theme.keyBorderRadius;
|
||||
float w = isKeyDown ? _theme.keyBorderWidthActivated : _theme.keyBorderWidth;
|
||||
float w2 = _theme.keyBorderWidth / 2.f;
|
||||
_tmpRect.set(x + w2, y + w2, x + keyW - w2, y + keyH - w2);
|
||||
canvas.drawRoundRect(_tmpRect, r, r,
|
||||
isKeyDown ? _theme.keyDownBgPaint : _theme.keyBgPaint);
|
||||
if (w > 0.f)
|
||||
{
|
||||
_theme.keyBorderPaint.setStrokeWidth(w);
|
||||
float overlap = r - r * 0.85f + w; // sin(45°)
|
||||
drawBorder(canvas, x, y, x + overlap, y + keyH, _theme.keyBorderColorLeft);
|
||||
drawBorder(canvas, x, y, x + keyW, y + overlap, _theme.keyBorderColorTop);
|
||||
drawBorder(canvas, x + keyW - overlap, y, x + keyW, y + keyH, _theme.keyBorderColorRight);
|
||||
drawBorder(canvas, x, y + keyH - overlap, x + keyW, y + keyH, _theme.keyBorderColorBottom);
|
||||
}
|
||||
}
|
||||
|
||||
/** Clip to draw a border at a time. This allows to call [drawRoundRect]
|
||||
several time with the same parameters but a different Paint. */
|
||||
void drawBorder(Canvas canvas, float clipl, float clipt, float clipr,
|
||||
float clipb, int color)
|
||||
{
|
||||
Paint p = _theme.keyBorderPaint;
|
||||
float r = _theme.keyBorderRadius;
|
||||
canvas.save();
|
||||
canvas.clipRect(clipl, clipt, clipr, clipb);
|
||||
p.setColor(color);
|
||||
canvas.drawRoundRect(_tmpRect, r, r, p);
|
||||
canvas.restore();
|
||||
}
|
||||
|
||||
private int labelColor(KeyValue k, boolean isKeyDown, boolean sublabel)
|
||||
{
|
||||
if (isKeyDown)
|
||||
{
|
||||
int flags = _pointers.getKeyFlags(k);
|
||||
if (flags != -1)
|
||||
{
|
||||
if ((flags & KeyValue.FLAG_LOCKED) != 0)
|
||||
return _theme.lockedColor;
|
||||
if ((flags & KeyValue.FLAG_LATCH) == 0)
|
||||
return _theme.activatedColor;
|
||||
}
|
||||
}
|
||||
return defaultColor;
|
||||
if (k.hasFlags(KeyValue.FLAG_SECONDARY))
|
||||
return _theme.secondaryLabelColor;
|
||||
return sublabel ? _theme.subLabelColor : _theme.labelColor;
|
||||
}
|
||||
|
||||
private void drawLabel(Canvas canvas, KeyValue k, float x, float y, float keyH, boolean isKeyDown)
|
||||
private void drawLabel(Canvas canvas, KeyboardData.Corner k, float x, float y, float keyH, boolean isKeyDown)
|
||||
{
|
||||
k = KeyModifier.handleFlags(k, _flags);
|
||||
if (k == null)
|
||||
return;
|
||||
float textSize = scaleTextSize(k, _config.labelTextSize, keyH);
|
||||
Paint p = _theme.labelPaint(((k.flags & KeyValue.FLAG_KEY_FONT) != 0));
|
||||
p.setColor(labelColor(k, isKeyDown, _theme.labelColor));
|
||||
KeyValue kv = KeyModifier.modify(k.kv, _mods);
|
||||
if (kv == null)
|
||||
return;
|
||||
float textSize = scaleTextSize(kv, _config.labelTextSize, keyH);
|
||||
Paint p = _theme.labelPaint(kv.hasFlags(KeyValue.FLAG_KEY_FONT));
|
||||
p.setColor(labelColor(kv, isKeyDown, false));
|
||||
p.setAlpha(_config.labelBrightness);
|
||||
p.setTextSize(textSize);
|
||||
canvas.drawText(k.symbol, x, (keyH - p.ascent() - p.descent()) / 2f + y, p);
|
||||
canvas.drawText(kv.getString(), x, (keyH - p.ascent() - p.descent()) / 2f + y, p);
|
||||
}
|
||||
|
||||
private void drawSubLabel(Canvas canvas, KeyValue k, float x, float y, float keyW, float keyH, Paint.Align a, Vertical v, boolean isKeyDown)
|
||||
private void drawSubLabel(Canvas canvas, KeyboardData.Corner k, float x,
|
||||
float y, float keyW, float keyH, Paint.Align a, Vertical v,
|
||||
boolean isKeyDown)
|
||||
{
|
||||
k = KeyModifier.handleFlags(k, _flags);
|
||||
if (k == null)
|
||||
return;
|
||||
float textSize = scaleTextSize(k, _config.sublabelTextSize, keyH);
|
||||
Paint p = _theme.subLabelPaint(((k.flags & KeyValue.FLAG_KEY_FONT) != 0), a);
|
||||
p.setColor(labelColor(k, isKeyDown, _theme.subLabelColor));
|
||||
KeyValue kv = KeyModifier.modify(k.kv, _mods);
|
||||
if (kv == null)
|
||||
return;
|
||||
float textSize = scaleTextSize(kv, _config.sublabelTextSize, keyH);
|
||||
Paint p = _theme.subLabelPaint(kv.hasFlags(KeyValue.FLAG_KEY_FONT), a);
|
||||
p.setColor(labelColor(kv, isKeyDown, true));
|
||||
p.setAlpha(_config.labelBrightness);
|
||||
p.setTextSize(textSize);
|
||||
float subPadding = _config.keyPadding;
|
||||
if (v == Vertical.CENTER)
|
||||
@ -290,12 +395,23 @@ public class Keyboard2View extends View
|
||||
x += keyW / 2f;
|
||||
else
|
||||
x += (a == Paint.Align.LEFT) ? subPadding : keyW - subPadding;
|
||||
canvas.drawText(k.symbol, x, y, p);
|
||||
canvas.drawText(kv.getString(), 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)
|
||||
{
|
||||
float smaller_font = ((k.flags & KeyValue.FLAG_SMALLER_FONT) == 0) ? 1.f : 0.75f;
|
||||
float smaller_font = k.hasFlags(KeyValue.FLAG_SMALLER_FONT) ? 0.75f : 1.f;
|
||||
return keyH * rel_size * smaller_font * _config.characterSize;
|
||||
}
|
||||
}
|
||||
|
@ -2,31 +2,134 @@ package juloo.keyboard2;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.XmlResourceParser;
|
||||
import android.util.Xml;
|
||||
import java.io.StringReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
|
||||
class KeyboardData
|
||||
{
|
||||
public final List<Row> rows;
|
||||
/* Total width of the keyboard. Unit is abstract. */
|
||||
/** Total width of the keyboard. */
|
||||
public final float keysWidth;
|
||||
/* Total height of the keyboard. Unit is abstract. */
|
||||
/** Total height of the keyboard. */
|
||||
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 replaceKeys(MapKeys f)
|
||||
public KeyboardData mapKeys(MapKey f)
|
||||
{
|
||||
ArrayList<Row> rows_ = new ArrayList<Row>();
|
||||
for (Row r : rows)
|
||||
rows_.add(r.replaceKeys(f));
|
||||
return new KeyboardData(rows_, keysWidth);
|
||||
rows_.add(r.mapKeys(f));
|
||||
return new KeyboardData(rows_, keysWidth, extra_keys, num_pad);
|
||||
}
|
||||
|
||||
private static Row _bottomRow = null;
|
||||
/** 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)
|
||||
return this;
|
||||
ArrayList<Row> extendedRows = new ArrayList<Row>();
|
||||
Iterator<Row> iterNumPadRows = _num_pad.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 _bottom_row;
|
||||
private static KeyboardData _num_pad;
|
||||
private static KeyboardData _pin_entry;
|
||||
private static Map<Integer, KeyboardData> _layoutCache = new HashMap<Integer, KeyboardData>();
|
||||
|
||||
public static void init(Resources res)
|
||||
{
|
||||
try
|
||||
{
|
||||
_bottom_row = parse_bottom_row(res.getXml(R.xml.bottom_row));
|
||||
_num_pad = parse_keyboard(res.getXml(R.xml.numpad));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static KeyboardData load_pin_entry(Resources res)
|
||||
{
|
||||
if (_pin_entry == null)
|
||||
_pin_entry = load(res, R.xml.pin);
|
||||
return _pin_entry;
|
||||
}
|
||||
|
||||
/** Load a layout from a resource ID. Returns [null] on error. */
|
||||
public static KeyboardData load(Resources res, int id)
|
||||
{
|
||||
KeyboardData l = _layoutCache.get(id);
|
||||
@ -34,9 +137,9 @@ class KeyboardData
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_bottomRow == null)
|
||||
_bottomRow = parse_bottom_row(res.getXml(R.xml.bottom_row));
|
||||
l = parse_keyboard(res.getXml(id));
|
||||
XmlResourceParser parser = res.getXml(id);
|
||||
l = parse_keyboard(parser);
|
||||
parser.close();
|
||||
_layoutCache.put(id, l);
|
||||
}
|
||||
catch (Exception e)
|
||||
@ -47,18 +150,36 @@ class KeyboardData
|
||||
return l;
|
||||
}
|
||||
|
||||
private static KeyboardData parse_keyboard(XmlResourceParser parser) throws Exception
|
||||
/** Load a layout from a string. Returns [null] on error. */
|
||||
public static KeyboardData load_string(String src)
|
||||
{
|
||||
try
|
||||
{
|
||||
XmlPullParser parser = Xml.newPullParser();
|
||||
parser.setInput(new StringReader(src));
|
||||
return parse_keyboard(parser);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static KeyboardData parse_keyboard(XmlPullParser parser) throws Exception
|
||||
{
|
||||
if (!expect_tag(parser, "keyboard"))
|
||||
throw new Exception("Empty layout file");
|
||||
boolean bottom_row = parser.getAttributeBooleanValue(null, "bottom_row", true);
|
||||
boolean bottom_row = attribute_bool(parser, "bottom_row", true);
|
||||
boolean extra_keys = attribute_bool(parser, "extra_keys", true);
|
||||
boolean num_pad = attribute_bool(parser, "num_pad", true);
|
||||
float specified_kw = attribute_float(parser, "width", 0f);
|
||||
ArrayList<Row> rows = new ArrayList<Row>();
|
||||
while (expect_tag(parser, "row"))
|
||||
rows.add(Row.parse(parser));
|
||||
float kw = compute_max_width(rows);
|
||||
float kw = (specified_kw != 0f) ? specified_kw : compute_max_width(rows);
|
||||
if (bottom_row)
|
||||
rows.add(_bottomRow.updateWidth(kw));
|
||||
return new KeyboardData(rows, kw);
|
||||
rows.add(_bottom_row.updateWidth(kw));
|
||||
return new KeyboardData(rows, kw, extra_keys, num_pad);
|
||||
}
|
||||
|
||||
private static float compute_max_width(List<Row> rows)
|
||||
@ -69,14 +190,14 @@ class KeyboardData
|
||||
return w;
|
||||
}
|
||||
|
||||
private static Row parse_bottom_row(XmlResourceParser parser) throws Exception
|
||||
private static Row parse_bottom_row(XmlPullParser parser) throws Exception
|
||||
{
|
||||
if (!expect_tag(parser, "row"))
|
||||
throw new Exception("Failed to parse bottom row");
|
||||
return Row.parse(parser);
|
||||
}
|
||||
|
||||
protected KeyboardData(List<Row> rows_, float kw)
|
||||
protected KeyboardData(List<Row> rows_, float kw, boolean xk, boolean np)
|
||||
{
|
||||
float kh = 0.f;
|
||||
for (Row r : rows_)
|
||||
@ -84,17 +205,19 @@ class KeyboardData
|
||||
rows = rows_;
|
||||
keysWidth = kw;
|
||||
keysHeight = kh;
|
||||
extra_keys = xk;
|
||||
num_pad = np;
|
||||
}
|
||||
|
||||
public static class Row
|
||||
{
|
||||
public final List<Key> keys;
|
||||
/* Height of the row, without 'shift'. Unit is abstract. */
|
||||
/** Height of the row, without 'shift'. */
|
||||
public final float height;
|
||||
/* Extra empty space on the top. */
|
||||
/** Extra empty space on the top. */
|
||||
public final float shift;
|
||||
/* Total width of the row. Unit is abstract. */
|
||||
private final float keysWidth;
|
||||
/** Total width of the row. */
|
||||
public final float keysWidth;
|
||||
|
||||
protected Row(List<Key> keys_, float h, float s)
|
||||
{
|
||||
@ -106,33 +229,40 @@ class KeyboardData
|
||||
keysWidth = kw;
|
||||
}
|
||||
|
||||
public static Row parse(XmlResourceParser parser) throws Exception
|
||||
public static Row parse(XmlPullParser parser) throws Exception
|
||||
{
|
||||
ArrayList<Key> keys = new ArrayList<Key>();
|
||||
int status;
|
||||
float h = parser.getAttributeFloatValue(null, "height", 1f);
|
||||
float shift = parser.getAttributeFloatValue(null, "shift", 0f);
|
||||
float h = attribute_float(parser, "height", 1f);
|
||||
float shift = attribute_float(parser, "shift", 0f);
|
||||
while (expect_tag(parser, "key"))
|
||||
keys.add(Key.parse(parser));
|
||||
return new Row(keys, h, shift);
|
||||
}
|
||||
|
||||
public Row replaceKeys(MapKeys f)
|
||||
public Row mapKeys(MapKey f)
|
||||
{
|
||||
ArrayList<Key> keys_ = new ArrayList<Key>();
|
||||
for (Key k : keys)
|
||||
keys_.add(k.replaceKeys(f));
|
||||
keys_.add(f.apply(k));
|
||||
return new Row(keys_, height, shift);
|
||||
}
|
||||
|
||||
/** Change the width of every keys so that the row is 's' units wide. */
|
||||
public Row updateWidth(float newWidth)
|
||||
{
|
||||
float s = newWidth / keysWidth;
|
||||
ArrayList<Key> keys_ = new ArrayList<Key>();
|
||||
final float s = newWidth / keysWidth;
|
||||
return mapKeys(new MapKey(){
|
||||
public Key apply(Key k) { return k.scaleWidth(s); }
|
||||
});
|
||||
}
|
||||
|
||||
public Key findKeyWithValue(KeyValue kv)
|
||||
{
|
||||
for (Key k : keys)
|
||||
keys_.add(k.scaleWidth(s));
|
||||
return new Row(keys_, height, shift);
|
||||
if (k.hasValue(kv))
|
||||
return k;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@ -143,20 +273,21 @@ class KeyboardData
|
||||
** 0
|
||||
** 3 4
|
||||
*/
|
||||
public final KeyValue key0;
|
||||
public final KeyValue key1;
|
||||
public final KeyValue key2;
|
||||
public final KeyValue key3;
|
||||
public final KeyValue key4;
|
||||
public final Corner key0;
|
||||
public final Corner key1;
|
||||
public final Corner key2;
|
||||
public final Corner key3;
|
||||
public final Corner key4;
|
||||
|
||||
/* Key width in relative unit. */
|
||||
/** Key width in relative unit. */
|
||||
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;
|
||||
/* 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 String indication;
|
||||
|
||||
protected Key(KeyValue k0, KeyValue k1, KeyValue k2, KeyValue k3, KeyValue k4, float w, float s, boolean e)
|
||||
protected Key(Corner k0, Corner k1, Corner k2, Corner k3, Corner k4, float w, float s, boolean e, String i)
|
||||
{
|
||||
key0 = k0;
|
||||
key1 = k1;
|
||||
@ -166,68 +297,221 @@ class KeyboardData
|
||||
width = w;
|
||||
shift = s;
|
||||
edgekeys = e;
|
||||
indication = i;
|
||||
}
|
||||
|
||||
public static Key parse(XmlResourceParser parser) throws Exception
|
||||
public static Key parse(XmlPullParser parser) throws Exception
|
||||
{
|
||||
KeyValue k0 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key0"));
|
||||
KeyValue k1 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key1"));
|
||||
KeyValue k2 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key2"));
|
||||
KeyValue k3 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key3"));
|
||||
KeyValue k4 = KeyValue.getKeyByName(parser.getAttributeValue(null, "key4"));
|
||||
float width = parser.getAttributeFloatValue(null, "width", 1f);
|
||||
float shift = parser.getAttributeFloatValue(null, "shift", 0.f);
|
||||
boolean edgekeys = parser.getAttributeBooleanValue(null, "edgekeys", false);
|
||||
while (parser.next() != XmlResourceParser.END_TAG)
|
||||
Corner k0 = Corner.parse_of_attr(parser, "key0");
|
||||
Corner k1 = Corner.parse_of_attr(parser, "key1");
|
||||
Corner k2 = Corner.parse_of_attr(parser, "key2");
|
||||
Corner k3 = Corner.parse_of_attr(parser, "key3");
|
||||
Corner k4 = Corner.parse_of_attr(parser, "key4");
|
||||
float width = attribute_float(parser, "width", 1f);
|
||||
float shift = attribute_float(parser, "shift", 0.f);
|
||||
boolean edgekeys = attribute_bool(parser, "edgekeys", false);
|
||||
String indication = parser.getAttributeValue(null, "indication");
|
||||
while (parser.next() != XmlPullParser.END_TAG)
|
||||
continue ;
|
||||
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);
|
||||
return new Key(k0, k1, k2, k3, k4, width, shift, edgekeys, indication);
|
||||
}
|
||||
|
||||
/** New key with the width multiplied by '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 getValue(int index)
|
||||
public KeyValue getKeyValue(int i)
|
||||
{
|
||||
switch (index)
|
||||
Corner c;
|
||||
switch (i)
|
||||
{
|
||||
case 1: return key1;
|
||||
case 2: return key2;
|
||||
case 3: return key3;
|
||||
case 4: return key4;
|
||||
default: case 0: return key0;
|
||||
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 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(XmlPullParser 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 MapKeys {
|
||||
public KeyValue apply(KeyValue kv);
|
||||
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_key0(k.key0), apply(k.key1), apply(k.key2),
|
||||
apply(k.key3), apply(k.key4), k.width, k.shift, k.edgekeys,
|
||||
k.indication);
|
||||
}
|
||||
|
||||
protected Corner apply_key0(Corner c)
|
||||
{
|
||||
return apply(c);
|
||||
}
|
||||
|
||||
protected Corner apply(Corner c)
|
||||
{
|
||||
if (c == null)
|
||||
return null;
|
||||
KeyValue kv = apply(c.kv, c.localized);
|
||||
return (kv == null) ? null : new Corner(kv, c.localized);
|
||||
}
|
||||
}
|
||||
|
||||
/** Parsing utils */
|
||||
|
||||
/** Returns [false] on [END_DOCUMENT] or [END_TAG], [true] otherwise. */
|
||||
private static boolean expect_tag(XmlResourceParser parser, String name) throws Exception
|
||||
private static boolean expect_tag(XmlPullParser parser, String name) throws Exception
|
||||
{
|
||||
int status;
|
||||
do
|
||||
{
|
||||
status = parser.next();
|
||||
if (status == XmlResourceParser.END_DOCUMENT || status == XmlResourceParser.END_TAG)
|
||||
if (status == XmlPullParser.END_DOCUMENT || status == XmlPullParser.END_TAG)
|
||||
return false;
|
||||
}
|
||||
while (status != XmlResourceParser.START_TAG);
|
||||
while (status != XmlPullParser.START_TAG);
|
||||
if (!parser.getName().equals(name))
|
||||
throw new Exception("Unknow tag: " + parser.getName());
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean attribute_bool(XmlPullParser parser, String attr, boolean default_val)
|
||||
{
|
||||
String val = parser.getAttributeValue(null, attr);
|
||||
if (val == null)
|
||||
return default_val;
|
||||
return val.equals("true");
|
||||
}
|
||||
|
||||
private static float attribute_float(XmlPullParser parser, String attr, float default_val)
|
||||
{
|
||||
String val = parser.getAttributeValue(null, attr);
|
||||
if (val == null)
|
||||
return default_val;
|
||||
return Float.parseFloat(val);
|
||||
}
|
||||
}
|
||||
|
25
srcs/juloo.keyboard2/LayoutListPreference.java
Normal file
@ -0,0 +1,25 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.preference.ListPreference;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
public class LayoutListPreference extends ListPreference
|
||||
{
|
||||
public LayoutListPreference(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LayoutListPreference);
|
||||
String defaultString = a.getString(R.styleable.LayoutListPreference_defaultString);
|
||||
a.recycle();
|
||||
Resources res = context.getResources();
|
||||
String[] entries = res.getStringArray(R.array.pref_layout_entries);
|
||||
entries[0] = defaultString;
|
||||
setEntries(entries);
|
||||
setEntryValues(res.getStringArray(R.array.pref_layout_values));
|
||||
setSummary("%s");
|
||||
setDefaultValue("none");
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@ package juloo.keyboard2;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import java.util.Arrays;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
@ -22,16 +23,33 @@ public final class Pointers implements Handler.Callback
|
||||
_config = c;
|
||||
}
|
||||
|
||||
public int getFlags()
|
||||
/** Return the list of modifiers currently activated. */
|
||||
public Modifiers getModifiers()
|
||||
{
|
||||
int flags = 0;
|
||||
for (Pointer p : _ptrs)
|
||||
flags |= p.flags;
|
||||
return flags;
|
||||
return getModifiers(false);
|
||||
}
|
||||
|
||||
/** When [skip_latched] is true, don't take flags of latched keys into account. */
|
||||
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()
|
||||
{
|
||||
for (Pointer p : _ptrs)
|
||||
stopKeyRepeat(p);
|
||||
_ptrs.clear();
|
||||
}
|
||||
|
||||
@ -52,14 +70,32 @@ public final class Pointers implements Handler.Callback
|
||||
*/
|
||||
public int getKeyFlags(KeyValue kv)
|
||||
{
|
||||
// Use physical equality because the key might have been modified.
|
||||
String name = kv.name;
|
||||
for (Pointer p : _ptrs)
|
||||
if (p.value != null && p.value.name == name)
|
||||
if (p.value != null && p.value.equals(kv))
|
||||
return p.flags;
|
||||
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 | KeyValue.FLAG_LOCK);
|
||||
ptr.flags |= KeyValue.FLAG_FAKE_PTR;
|
||||
if (locked)
|
||||
ptr.flags |= 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
|
||||
|
||||
public void onTouchUp(int pointerId)
|
||||
@ -72,39 +108,41 @@ public final class Pointers implements Handler.Callback
|
||||
if (latched != null) // Already latched
|
||||
{
|
||||
removePtr(ptr); // Remove dupplicate
|
||||
if ((latched.flags & KeyValue.FLAG_LOCK) != 0) // Locking key, toggle lock
|
||||
{
|
||||
latched.flags = (latched.flags & ~KeyValue.FLAG_LOCK) | KeyValue.FLAG_LOCKED;
|
||||
_handler.onPointerFlagsChanged();
|
||||
}
|
||||
if ((latched.flags & KeyValue.FLAG_LOCK) != 0) // Toggle lockable key
|
||||
lockPointer(latched, false);
|
||||
else // Otherwise, unlatch
|
||||
{
|
||||
removePtr(latched);
|
||||
_handler.onPointerUp(ptr.value);
|
||||
_handler.onPointerUp(ptr.value, ptr.modifiers);
|
||||
}
|
||||
}
|
||||
else if ((ptr.flags & KeyValue.FLAG_LATCH) != 0)
|
||||
{
|
||||
ptr.flags &= ~KeyValue.FLAG_LATCH;
|
||||
ptr.pointerId = -1; // Latch
|
||||
_handler.onPointerFlagsChanged();
|
||||
_handler.onPointerFlagsChanged(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
clearLatched();
|
||||
removePtr(ptr);
|
||||
_handler.onPointerUp(ptr.value);
|
||||
_handler.onPointerUp(ptr.value, ptr.modifiers);
|
||||
}
|
||||
}
|
||||
|
||||
public void onTouchCancel(int pointerId)
|
||||
public void onTouchCancel()
|
||||
{
|
||||
Pointer ptr = getPtr(pointerId);
|
||||
if (ptr == null)
|
||||
return;
|
||||
stopKeyRepeat(ptr);
|
||||
removePtr(ptr);
|
||||
_handler.onPointerFlagsChanged();
|
||||
clear();
|
||||
_handler.onPointerFlagsChanged(true);
|
||||
}
|
||||
|
||||
/* 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)
|
||||
@ -114,11 +152,46 @@ public final class Pointers implements Handler.Callback
|
||||
// keys.
|
||||
if (isModulatedKeyPressed())
|
||||
return;
|
||||
KeyValue value = _handler.onPointerDown(key.key0);
|
||||
Pointer ptr = new Pointer(pointerId, key, 0, value, x, y);
|
||||
// Don't take latched modifiers into account if an other key is pressed.
|
||||
// The other key already "own" the latched modifiers and will clear them.
|
||||
Modifiers mods = getModifiers(isOtherPointerDown());
|
||||
KeyValue value = handleKV(key.key0, mods);
|
||||
Pointer ptr = new Pointer(pointerId, key, value, x, y, mods);
|
||||
_ptrs.add(ptr);
|
||||
if (value != null && (value.flags & KeyValue.FLAG_NOREPEAT) == 0)
|
||||
startKeyRepeat(ptr);
|
||||
_handler.onPointerDown(false);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
@ -126,45 +199,51 @@ public final class Pointers implements Handler.Callback
|
||||
Pointer ptr = getPtr(pointerId);
|
||||
if (ptr == null)
|
||||
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 dy = y - ptr.downY;
|
||||
float dist = Math.abs(dx) + Math.abs(dy);
|
||||
ptr.ptrDist = dist;
|
||||
int newIndex;
|
||||
|
||||
int direction;
|
||||
if (dist < _config.swipe_dist_px)
|
||||
{
|
||||
newIndex = 0;
|
||||
}
|
||||
else if (ptr.key.edgekeys)
|
||||
{
|
||||
if (Math.abs(dy) > Math.abs(dx)) // vertical swipe
|
||||
newIndex = (dy < 0) ? 1 : 4;
|
||||
else // horizontal swipe
|
||||
newIndex = (dx < 0) ? 3 : 2;
|
||||
direction = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dx < 0) // left side
|
||||
newIndex = (dy < 0) ? 1 : 3;
|
||||
else // right side
|
||||
newIndex = (dy < 0) ? 2 : 4;
|
||||
// One of the 8 directions:
|
||||
// |\2|3/|
|
||||
// |1\|/4|
|
||||
// |-----|
|
||||
// |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 (newIndex != ptr.value_index)
|
||||
|
||||
if (direction != ptr.selected_direction)
|
||||
{
|
||||
ptr.value_index = newIndex;
|
||||
KeyValue newValue = _handler.onPointerSwipe(ptr.key.getValue(newIndex));
|
||||
if (newValue != null)
|
||||
ptr.selected_direction = direction;
|
||||
KeyValue newValue = getKeyAtDirection(ptr, direction);
|
||||
if (newValue != null && (ptr.value == null || !newValue.equals(ptr.value)))
|
||||
{
|
||||
int old_flags = ptr.flags;
|
||||
ptr.value = newValue;
|
||||
ptr.flags = newValue.flags;
|
||||
ptr.flags = newValue.getFlags();
|
||||
// Keep the keyrepeat going between modulated keys.
|
||||
if ((old_flags & newValue.flags & KeyValue.FLAG_PRECISE_REPEAT) == 0)
|
||||
if ((old_flags & ptr.flags & KeyValue.FLAG_PRECISE_REPEAT) == 0)
|
||||
{
|
||||
stopKeyRepeat(ptr);
|
||||
if ((newValue.flags & KeyValue.FLAG_NOREPEAT) == 0)
|
||||
startKeyRepeat(ptr);
|
||||
}
|
||||
_handler.onPointerDown(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -186,10 +265,15 @@ public final class Pointers implements Handler.Callback
|
||||
|
||||
private Pointer getLatched(Pointer target)
|
||||
{
|
||||
KeyboardData.Key k = target.key;
|
||||
int vi = target.value_index;
|
||||
return getLatched(target.key, target.value);
|
||||
}
|
||||
|
||||
private Pointer getLatched(KeyboardData.Key k, KeyValue v)
|
||||
{
|
||||
if (v == null)
|
||||
return null;
|
||||
for (Pointer p : _ptrs)
|
||||
if (p.key == k && p.value_index == vi && p.pointerId == -1)
|
||||
if (p.key == k && p.pointerId == -1 && p.value != null && p.value.equals(v))
|
||||
return p;
|
||||
return null;
|
||||
}
|
||||
@ -202,12 +286,19 @@ public final class Pointers implements Handler.Callback
|
||||
// Latched and not locked, remove
|
||||
if (ptr.pointerId == -1 && (ptr.flags & KeyValue.FLAG_LOCKED) == 0)
|
||||
_ptrs.remove(i);
|
||||
// Not latched but pressed, don't latch once released
|
||||
// Not latched but pressed, don't latch once released and stop long press.
|
||||
else if ((ptr.flags & KeyValue.FLAG_LATCH) != 0)
|
||||
ptr.flags &= ~KeyValue.FLAG_LATCH;
|
||||
}
|
||||
}
|
||||
|
||||
/** Make a pointer into the locked state. */
|
||||
private void lockPointer(Pointer ptr, boolean shouldVibrate)
|
||||
{
|
||||
ptr.flags = (ptr.flags & ~KeyValue.FLAG_LOCK) | KeyValue.FLAG_LOCKED;
|
||||
_handler.onPointerFlagsChanged(shouldVibrate);
|
||||
}
|
||||
|
||||
private boolean isModulatedKeyPressed()
|
||||
{
|
||||
for (Pointer ptr : _ptrs)
|
||||
@ -228,26 +319,33 @@ public final class Pointers implements Handler.Callback
|
||||
{
|
||||
if (ptr.timeoutWhat == msg.what)
|
||||
{
|
||||
long nextInterval = _config.longPressInterval;
|
||||
if (handleKeyRepeat(ptr))
|
||||
_keyrepeat_handler.sendEmptyMessageDelayed(msg.what, nextRepeatInterval(ptr));
|
||||
else
|
||||
ptr.timeoutWhat = -1;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private long nextRepeatInterval(Pointer ptr)
|
||||
{
|
||||
long t = _config.longPressInterval;
|
||||
if (_config.preciseRepeat && (ptr.flags & KeyValue.FLAG_PRECISE_REPEAT) != 0)
|
||||
{
|
||||
// Slower repeat for modulated keys
|
||||
nextInterval *= 2;
|
||||
// Modulate repeat interval depending on the distance of the pointer
|
||||
nextInterval = (long)((float)nextInterval / modulatePreciseRepeat(ptr));
|
||||
t = (long)((float)t * 2.f / modulatePreciseRepeat(ptr));
|
||||
}
|
||||
_keyrepeat_handler.sendEmptyMessageDelayed(msg.what, nextInterval);
|
||||
_handler.onPointerHold(ptr.value);
|
||||
return (true);
|
||||
}
|
||||
}
|
||||
return (false);
|
||||
return t;
|
||||
}
|
||||
|
||||
private static int uniqueTimeoutWhat = 0;
|
||||
|
||||
private void startKeyRepeat(Pointer ptr)
|
||||
{
|
||||
if (ptr.value == null)
|
||||
return;
|
||||
int what = (uniqueTimeoutWhat++);
|
||||
ptr.timeoutWhat = what;
|
||||
long timeout = _config.longPressTimeout;
|
||||
@ -267,6 +365,22 @@ 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)
|
||||
{
|
||||
if (ptr.repeatingPtrDist < 0.f)
|
||||
@ -278,56 +392,110 @@ public final class Pointers implements Handler.Callback
|
||||
return Math.min(8.f, Math.max(0.1f, accel));
|
||||
}
|
||||
|
||||
private final class Pointer
|
||||
private static final class Pointer
|
||||
{
|
||||
/** -1 when latched. */
|
||||
public int pointerId;
|
||||
/** The Key pressed by this Pointer */
|
||||
public final KeyboardData.Key key;
|
||||
public int value_index;
|
||||
/** Modified value. Not equal to [key.getValue(value_index)]. */
|
||||
/** Current direction. */
|
||||
public int selected_direction;
|
||||
/** Selected value with [modifiers] applied. */
|
||||
public KeyValue value;
|
||||
public float downX;
|
||||
public float downY;
|
||||
/** Distance of the pointer to the initial press. */
|
||||
public float ptrDist;
|
||||
/** Modifier flags at the time the key was pressed. */
|
||||
public Modifiers modifiers;
|
||||
/** Flags of the value. Latch, lock and locked flags are updated. */
|
||||
public int flags;
|
||||
/** Identify timeout messages. */
|
||||
public int timeoutWhat;
|
||||
/** ptrDist at the first repeat, -1 otherwise. */
|
||||
public float repeatingPtrDist;
|
||||
|
||||
public Pointer(int p, KeyboardData.Key k, int vi, KeyValue v, float x, float y)
|
||||
public Pointer(int p, KeyboardData.Key k, KeyValue v, float x, float y, Modifiers m)
|
||||
{
|
||||
pointerId = p;
|
||||
key = k;
|
||||
value_index = vi;
|
||||
selected_direction = 0;
|
||||
value = v;
|
||||
downX = x;
|
||||
downY = y;
|
||||
ptrDist = 0.f;
|
||||
flags = (v == null) ? 0 : v.flags;
|
||||
modifiers = m;
|
||||
flags = (v == null) ? 0 : v.getFlags();
|
||||
timeoutWhat = -1;
|
||||
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
|
||||
{
|
||||
/** A key is pressed. Key can be modified or removed by returning [null].
|
||||
[getFlags()] is not uptodate. */
|
||||
public KeyValue onPointerDown(KeyValue k);
|
||||
/** Key can be modified or removed by returning [null]. */
|
||||
public KeyValue modifyKey(KeyValue k, Modifiers flags);
|
||||
|
||||
/** Pointer swipes into a corner. Key can be modified or removed. */
|
||||
public KeyValue onPointerSwipe(KeyValue k);
|
||||
/** A key is pressed. [getModifiers()] is uptodate. Might be called after a
|
||||
press or a swipe to a different value. */
|
||||
public void onPointerDown(boolean isSwipe);
|
||||
|
||||
/** Key is released. [k] is the key that was returned by [onPointerDown] or
|
||||
[onPointerSwipe]. */
|
||||
public void onPointerUp(KeyValue k);
|
||||
/** 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();
|
||||
public void onPointerFlagsChanged(boolean shouldVibrate);
|
||||
|
||||
/** Key is repeating. */
|
||||
public void onPointerHold(KeyValue k);
|
||||
public void onPointerHold(KeyValue k, Modifiers flags);
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,49 @@
|
||||
package juloo.keyboard2;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceActivity;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
public class SettingsActivity extends PreferenceActivity
|
||||
{
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
detectSystemTheme();
|
||||
super.onCreate(savedInstanceState);
|
||||
// The preferences can't be read when in direct-boot mode. Avoid crashing
|
||||
// and don't allow changing the settings.
|
||||
try { getPreferenceManager().getSharedPreferences(); }
|
||||
catch (Exception _e) { fallbackEncrypted(); return; }
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
void fallbackEncrypted()
|
||||
{
|
||||
// Can't communicate with the user here.
|
||||
finish();
|
||||
}
|
||||
|
||||
protected void onStop()
|
||||
{
|
||||
DirectBootAwarePreferences
|
||||
.copy_preferences_to_protected_storage(this,
|
||||
getPreferenceManager().getSharedPreferences());
|
||||
super.onStop();
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package juloo.keyboard2;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Typeface;
|
||||
import android.util.AttributeSet;
|
||||
@ -11,35 +12,60 @@ public class Theme
|
||||
{
|
||||
public final Paint keyBgPaint = new Paint();
|
||||
public final Paint keyDownBgPaint = new Paint();
|
||||
public final Paint keyBorderPaint = new Paint();
|
||||
public final int lockedColor;
|
||||
public final int activatedColor;
|
||||
public final int labelColor;
|
||||
public final int subLabelColor;
|
||||
public final int secondaryLabelColor;
|
||||
|
||||
public final float keyBorderRadius;
|
||||
public final float keyBorderWidth;
|
||||
public final float keyBorderWidthActivated;
|
||||
public final int keyBorderColorLeft;
|
||||
public final int keyBorderColorTop;
|
||||
public final int keyBorderColorRight;
|
||||
public final int keyBorderColorBottom;
|
||||
|
||||
public final int colorNavBar;
|
||||
public final boolean isLightNavBar;
|
||||
|
||||
private final Paint _keyLabelPaint;
|
||||
private final Paint _specialKeyLabelPaint;
|
||||
private final Paint _keySubLabelPaint;
|
||||
private final Paint _specialKeySubLabelPaint;
|
||||
private final Paint _indicationPaint;
|
||||
|
||||
public Theme(Context context, AttributeSet attrs)
|
||||
{
|
||||
TypedArray s = context.getTheme().obtainStyledAttributes(attrs, R.styleable.keyboard, 0, 0);
|
||||
keyBgPaint.setColor(s.getColor(R.styleable.keyboard_colorKey, 0));
|
||||
int colorKey = s.getColor(R.styleable.keyboard_colorKey, 0);
|
||||
keyBgPaint.setColor(colorKey);
|
||||
keyDownBgPaint.setColor(s.getColor(R.styleable.keyboard_colorKeyActivated, 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);
|
||||
activatedColor = s.getColor(R.styleable.keyboard_colorLabelActivated, 0);
|
||||
lockedColor = s.getColor(R.styleable.keyboard_colorLabelLocked, 0);
|
||||
subLabelColor = s.getColor(R.styleable.keyboard_colorSubLabel, 0);
|
||||
float secondaryLightOffset = s.getFloat(R.styleable.keyboard_secondaryLightOffset, 1.f);
|
||||
secondaryLabelColor = adjustLight(labelColor, secondaryLightOffset);
|
||||
keyBorderRadius = s.getDimension(R.styleable.keyboard_keyBorderRadius, 0);
|
||||
keyBorderWidth = s.getDimension(R.styleable.keyboard_keyBorderWidth, 0);
|
||||
keyBorderWidthActivated = s.getDimension(R.styleable.keyboard_keyBorderWidthActivated, 0);
|
||||
keyBorderPaint.setStyle(Paint.Style.STROKE);
|
||||
keyBorderColorLeft = s.getColor(R.styleable.keyboard_keyBorderColorLeft, colorKey);
|
||||
keyBorderColorTop = s.getColor(R.styleable.keyboard_keyBorderColorTop, colorKey);
|
||||
keyBorderColorRight = s.getColor(R.styleable.keyboard_keyBorderColorRight, colorKey);
|
||||
keyBorderColorBottom = s.getColor(R.styleable.keyboard_keyBorderColorBottom, colorKey);
|
||||
s.recycle();
|
||||
_keyLabelPaint = initLabelPaint(Paint.Align.CENTER, null);
|
||||
_keySubLabelPaint = initLabelPaint(Paint.Align.LEFT, null);
|
||||
Typeface specialKeyFont = getSpecialKeyFont(context);
|
||||
Typeface specialKeyFont = getKeyFont(context);
|
||||
_specialKeyLabelPaint = initLabelPaint(Paint.Align.CENTER, specialKeyFont);
|
||||
_specialKeySubLabelPaint = initLabelPaint(Paint.Align.LEFT, specialKeyFont);
|
||||
_indicationPaint = initLabelPaint(Paint.Align.CENTER, null);
|
||||
}
|
||||
|
||||
public Paint labelPaint(boolean special_font)
|
||||
@ -55,7 +81,20 @@ public class Theme
|
||||
return p;
|
||||
}
|
||||
|
||||
private Paint initLabelPaint(Paint.Align align, Typeface font)
|
||||
public Paint indicationPaint()
|
||||
{
|
||||
return _indicationPaint;
|
||||
}
|
||||
|
||||
int adjustLight(int color, float offset)
|
||||
{
|
||||
float[] hsv = new float[3];
|
||||
Color.colorToHSV(color, hsv);
|
||||
hsv[2] += offset;
|
||||
return Color.HSVToColor(hsv);
|
||||
}
|
||||
|
||||
Paint initLabelPaint(Paint.Align align, Typeface font)
|
||||
{
|
||||
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||||
paint.setTextAlign(align);
|
||||
@ -64,14 +103,12 @@ public class Theme
|
||||
return (paint);
|
||||
}
|
||||
|
||||
private static Typeface _specialKeyFont = null;
|
||||
static Typeface _key_font = null;
|
||||
|
||||
static public Typeface getSpecialKeyFont(Context context)
|
||||
static public Typeface getKeyFont(Context context)
|
||||
{
|
||||
if (_specialKeyFont == null)
|
||||
{
|
||||
_specialKeyFont = Typeface.createFromAsset(context.getAssets(), "special_font.ttf");
|
||||
}
|
||||
return _specialKeyFont;
|
||||
if (_key_font == null)
|
||||
_key_font = Typeface.createFromAsset(context.getAssets(), "special_font.ttf");
|
||||
return _key_font;
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generated by IcoMoon.io -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="18" height="16" viewBox="0 0 18 16">
|
||||
<path fill="#000000" d="M17 2h-16c-0.55 0-1 0.45-1 1v10c0 0.55 0.45 1 1 1h16c0.55 0 1-0.45 1-1v-10c0-0.55-0.45-1-1-1zM10 4h2v2h-2v-2zM13 7v2h-2v-2h2zM7 4h2v2h-2v-2zM10 7v2h-2v-2h2zM4 4h2v2h-2v-2zM7 7v2h-2v-2h2zM2 4h1v2h-1v-2zM2 7h2v2h-2v-2zM3 12h-1v-2h1v2zM12 12h-8v-2h8v2zM16 12h-3v-2h3v2zM16 9h-2v-2h2v2zM16 6h-3v-2h3v2z"></path>
|
||||
</svg>
|
||||
<!-- materialdesignicons.com keyboard @Google -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19,10H17V8H19M19,13H17V11H19M16,10H14V8H16M16,13H14V11H16M16,17H8V15H16M7,10H5V8H7M7,13H5V11H7M8,11H10V13H8M8,8H10V10H8M11,11H13V13H11M11,8H13V10H11M20,5H4C2.89,5 2,5.89 2,7V17A2,2 0 0,0 4,19H20A2,2 0 0,0 22,17V7C22,5.89 21.1,5 20,5Z" /></svg>
|
||||
|
Before Width: | Height: | Size: 651 B After Width: | Height: | Size: 364 B |
2
srcs/special_font/12.svg
Normal file
@ -0,0 +1,2 @@
|
||||
<!-- materialdesignicons.com arrow-up-bold-box-outline by Austin Andrews @Templarian -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12,7L17,12H14V16H10V12H7L12,7M19,21H5A2,2 0 0,1 3,19V5A2,2 0 0,1 5,3H19A2,2 0 0,1 21,5V19A2,2 0 0,1 19,21M19,19V5H5V19H19Z" /></svg>
|
After Width: | Height: | Size: 292 B |
2
srcs/special_font/13.svg
Normal file
@ -0,0 +1,2 @@
|
||||
<!-- materialdesignicons.com keyboard-settings Michael Richins @MrGrigri -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19,10H17V8H19M19,13H17V11H19M16,10H14V8H16M16,13H14V11H16M16,17H8V15H16M7,10H5V8H7M7,13H5V11H7M8,11H10V13H8M8,8H10V10H8M11,11H13V13H11M11,8H13V10H11M20,5H4A2,2 0 0,0 2,7V17A2,2 0 0,0 4,19H20A2,2 0 0,0 22,17V7A2,2 0 0,0 20,5M7,22H9V24H7V22M11,22H13V24H11V22M15,22H17V24H15V22Z" /></svg>
|
After Width: | Height: | Size: 433 B |
2
srcs/special_font/14.svg
Normal file
@ -0,0 +1,2 @@
|
||||
<!-- materialdesignicons.com keyboard-settings Michael Richins @MrGrigri -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7,22H9V24H7V22M11,22H13V24H11V22M15,22H17V24H15V22M4,5A2,2 0 0,0 2,7V17A2,2 0 0,0 4,19H20A2,2 0 0,0 22,17V7A2,2 0 0,0 20,5H4M4,7H20V17H4V7M5,8V10H7V8H5M8,8V10H10V8H8M11,8V10H13V8H11M14,8V10H16V8H14M17,8V10H19V8H17M5,11V13H7V11H5M8,11V13H10V11H8M11,11V13H13V11H11M14,11V13H16V11H14M17,11V13H19V11H17M8,14V16H16V14H8Z" /></svg>
|
After Width: | Height: | Size: 473 B |
@ -1,12 +1,14 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!-- Accent from Roboto font family (Regular). Apache License, Version 2.0. -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-19 0 1167 2048">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-20 0 1168 2048">
|
||||
<g transform="matrix(1 0 0 -1 0 1536)">
|
||||
<path fill="currentColor"
|
||||
d="M931 1003l-69 -70q-112 86 -250 99v99q176 -12 319 -128zM517 1032q-133 -10 -250 -101q0 1 -72 74l3 -2q143 116 319 128v-99zM198 860q-90 -103 -108 -246h-99q17 182 137 319l-6 6l4 -3l41 -43q31 -32 31 -33zM1138 614h-100q-17 141 -107 249l70 70
|
||||
q120 -137 137 -319zM1138 518q-14 -190 -130 -327l-69 70q86 111 99 257h100zM190 264q-76 -77 -75 -77l4 4q-115 137 -128 327h99q14 -147 100 -254zM939 121q-146 -124 -327 -136v100q140 12 258 106zM517 -15q-180 12 -327 136l69 70q118 -90 258 -106v-100zM687 0
|
||||
q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154q0 80 60.5 152t187.5 128z" />
|
||||
d="M931.256 1002.78l-69.3145 -69.3145q-112.472 86.3154 -249.792 98.0859v99.3945q176.555 -11.7715 319.106 -128.166v0zM516.679 1031.55q-133.396 -10.4619 -249.792 -100.701q0 1.30859 -71.9297 74.5449l2.61523 -2.61523q142.554 116.396 319.106 128.166v-99.3945
|
||||
v0zM197.572 860.229q-90.2393 -103.316 -107.24 -245.867h-99.3936q17.001 181.786 137.32 319.104l-6.53906 5.23145l3.92285 -2.61523l41.8506 -43.1582q30.0791 -31.3867 30.0791 -32.6953v0zM1137.89 614.361h-99.3936q-17.001 141.242 -107.239 248.483
|
||||
l69.3135 70.6211q120.318 -137.319 137.319 -319.104v0zM1137.89 517.583q-14.3857 -189.633 -129.474 -326.953l-69.3135 70.6221q86.3154 111.164 99.3936 256.331h99.3936v0zM189.726 263.867h0.000976562q-86.3154 107.239 -99.3936 253.716h-99.3945
|
||||
q13.0781 -189.633 128.165 -326.953l-3.92285 -3.92383q-1.30762 0 74.5449 77.1611zM939.103 121.315q-146.476 -124.242 -326.952 -136.014v99.3945q139.935 11.7705 257.639 105.934zM516.679 -14.6973q-180.478 11.7715 -326.953 136.013l69.3145 69.3145
|
||||
q117.703 -90.2383 257.64 -105.933v-99.3945h-0.000976562zM623 -9l-12 -52q65 -11 108 -52t43 -121q0 -96 -79 -153t-226 -57l-7 109q72 0 116 24.5t44 73.5q0 48 -36 67t-123 26l32 135h140z" />
|
||||
</g>
|
||||
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.5 KiB |
13
srcs/special_font/59.svg
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-20 0 1168 2048">
|
||||
<g transform="matrix(1 0 0 -1 0 1536)">
|
||||
<path fill="currentColor"
|
||||
d="M931.256 1002.78l-69.3145 -69.3145q-112.472 86.3154 -249.792 98.0859v99.3945q176.555 -11.7715 319.106 -128.166v0zM516.679 1031.55q-133.396 -10.4619 -249.792 -100.701q0 1.30859 -71.9297 74.5449l2.61523 -2.61523q142.554 116.396 319.106 128.166v-99.3945
|
||||
v0zM197.572 860.229q-90.2393 -103.316 -107.24 -245.867h-99.3936q17.001 181.786 137.32 319.104l-6.53906 5.23145l3.92285 -2.61523l41.8506 -43.1582q30.0791 -31.3867 30.0791 -32.6953v0zM1137.89 614.361h-99.3936q-17.001 141.242 -107.239 248.483
|
||||
l69.3135 70.6211q120.318 -137.319 137.319 -319.104v0zM1137.89 517.583q-14.3857 -189.633 -129.474 -326.953l-69.3135 70.6221q86.3154 111.164 99.3936 256.331h99.3936v0zM189.726 263.867h0.000976562q-86.3154 107.239 -99.3936 253.716h-99.3945
|
||||
q13.0781 -189.633 128.165 -326.953l-3.92285 -3.92383q-1.30762 0 74.5449 77.1611zM939.103 121.315q-146.476 -124.242 -326.952 -136.014v99.3945q139.935 11.7705 257.639 105.934zM516.679 -14.6973q-180.478 11.7715 -326.953 136.013l69.3145 69.3145
|
||||
q117.703 -90.2383 257.64 -105.933v-99.3945h-0.000976562zM987 0q-70 -52 -109.5 -99.5t-39.5 -101.5q0 -42 22.5 -66t73.5 -24q27 0 50 7.5t49 18.5l33 -123q-36 -19 -79.5 -31.5t-103.5 -12.5q-95 0 -155.5 55t-60.5 154q0 80 60.5 152t187.5 128z" />
|
||||
</g>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
13
srcs/special_font/5A.svg
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-20 0 1168 2048">
|
||||
<g transform="matrix(1 0 0 -1 0 1536)">
|
||||
<path fill="currentColor"
|
||||
d="M931.256 1002.78l-69.3145 -69.3145q-112.472 86.3154 -249.792 98.0859v99.3945q176.555 -11.7715 319.106 -128.166v0zM516.679 1031.55q-133.396 -10.4619 -249.792 -100.701q0 1.30859 -71.9297 74.5449l2.61523 -2.61523q142.554 116.396 319.106 128.166v-99.3945
|
||||
v0zM197.572 860.229q-90.2393 -103.316 -107.24 -245.867h-99.3936q17.001 181.786 137.32 319.104l-6.53906 5.23145l3.92285 -2.61523l41.8506 -43.1582q30.0791 -31.3867 30.0791 -32.6953v0zM1137.89 614.361h-99.3936q-17.001 141.242 -107.239 248.483
|
||||
l69.3135 70.6211q120.318 -137.319 137.319 -319.104v0zM1137.89 517.583q-14.3857 -189.633 -129.474 -326.953l-69.3135 70.6221q86.3154 111.164 99.3936 256.331h99.3936v0zM189.726 263.867h0.000976562q-86.3154 107.239 -99.3936 253.716h-99.3945
|
||||
q13.0781 -189.633 128.165 -326.953l-3.92285 -3.92383q-1.30762 0 74.5449 77.1611zM939.103 121.315q-146.476 -124.242 -326.952 -136.014v99.3945q139.935 11.7705 257.639 105.934zM516.679 -14.6973q-180.478 11.7715 -326.953 136.013l69.3145 69.3145
|
||||
q117.703 -90.2383 257.64 -105.933v-99.3945h-0.000976562zM648 1283h-218v201h218v-201z" />
|
||||
</g>
|
||||
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |